如何在 WebAPI 控制器中接收多个 JSON 对象和一个 Uri 参数
How to receive multiple JSON object and an Uri Parameter in WebAPI Controller
我在试用 ASP.NET Web API2 时遇到了以下情况。我有一个 WebAPI2 控制器:
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars)
}
现在我可以用下面的方法调用它 jQuery:
<script>
var carsData = [{ "model": "Audi" }, { "model": "BMW" }, { "model": "Audi" }];
var uri = 'api/service/receiver/20180107';
$.ajax({
type: "POST",
url: uri,
contentType: "application/json; charset=utf-8",
data: JSON.stringify(carsData),
dataType: "json",
success: function (data) {
alert(data);
},
failure: function (errMsg) {
alert(errMsg);
}
});
</script>
这很好用,但我不知道如何 post 多个复杂对象或一个复杂 JSON 对象和多个附加参数。
我试过了:
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars, [FromBody] List<company> companies)
}
还有
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars, string company)
}
然后在 jQuery 调用中我更改了 data
行
data: JSON.stringify({ cars: carsData, companies: compData }),
还有
data: JSON.stringify({ cars: carsData, company: "theCompany" }),
但后来我收到了 404 或 null。这怎么能做到?
首先,"FromBody"是指来自HTTP请求的body。基本上,接收到的请求的 body 被转换为 object (默认情况下通过反序列化 JSON )。 MVC.NET 将占用整个 body 并生成一个 object。这就是你不能有两个 [FromBody]
.
的原因
根据您的 jQuery,您尝试做的是传递 { cars: carsData, companies: compData }
和 { cars: carsData, company: "theCompany" }
,这两个 object 作为 [=31= 发送].这些 object 中的每一个都分别具有两个属性(cars
和 companies
)和(cars
和 company
)。由于您将这些 object 作为一个整体传递给 body,MVC 也需要将 body 反序列化为一个完整的字符串。
您将不得不制作一个新的 class:
class MyCarData {
public List<car> cars { get; set; }
public List<company> companies { get; set; }
}
然后您可以在您的控制器中使用 [FromBody] MyCarData
来访问它作为一个整体。
我在试用 ASP.NET Web API2 时遇到了以下情况。我有一个 WebAPI2 控制器:
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars)
}
现在我可以用下面的方法调用它 jQuery:
<script>
var carsData = [{ "model": "Audi" }, { "model": "BMW" }, { "model": "Audi" }];
var uri = 'api/service/receiver/20180107';
$.ajax({
type: "POST",
url: uri,
contentType: "application/json; charset=utf-8",
data: JSON.stringify(carsData),
dataType: "json",
success: function (data) {
alert(data);
},
failure: function (errMsg) {
alert(errMsg);
}
});
</script>
这很好用,但我不知道如何 post 多个复杂对象或一个复杂 JSON 对象和多个附加参数。
我试过了:
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars, [FromBody] List<company> companies)
}
还有
[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri] string date, [FromBody List<car> cars, string company)
}
然后在 jQuery 调用中我更改了 data
行
data: JSON.stringify({ cars: carsData, companies: compData }),
还有
data: JSON.stringify({ cars: carsData, company: "theCompany" }),
但后来我收到了 404 或 null。这怎么能做到?
首先,"FromBody"是指来自HTTP请求的body。基本上,接收到的请求的 body 被转换为 object (默认情况下通过反序列化 JSON )。 MVC.NET 将占用整个 body 并生成一个 object。这就是你不能有两个 [FromBody]
.
根据您的 jQuery,您尝试做的是传递 { cars: carsData, companies: compData }
和 { cars: carsData, company: "theCompany" }
,这两个 object 作为 [=31= 发送].这些 object 中的每一个都分别具有两个属性(cars
和 companies
)和(cars
和 company
)。由于您将这些 object 作为一个整体传递给 body,MVC 也需要将 body 反序列化为一个完整的字符串。
您将不得不制作一个新的 class:
class MyCarData {
public List<car> cars { get; set; }
public List<company> companies { get; set; }
}
然后您可以在您的控制器中使用 [FromBody] MyCarData
来访问它作为一个整体。