API 具有多个参数的 HttpGet 方法
API HttpGet method with more than one parameters
我需要创建一个带有两个 List 参数的 HttpGet 方法,但出现此错误:
has more than one parameter that was specified or inferred as bound from request body. Only one parameter per action may be bound from body. Inspect the following parameters, and use 'FromQueryAttribute' to specify bound from query, 'FromRouteAttribute' to specify bound from route, and 'FromBodyAttribute' for parameters to be bound from body:
MyObject
有两个属性:
public class MyObject
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
}
我试过上面抛出异常的事情
方法一
[HttpGet]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
方法二
[HttpGet]
[Route("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
方法三
[HttpGet("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
使用FromQueryAttribute
我尝试使用:
[HttpGet]
public IActionResult Get([FromQueryAttribute] List<MyObject> obj1, [FromQueryAttribute] List<MyObject> obj2)
而且它不会抛出异常,但我不知道如何通过查询属性传递这些参数?
提前致谢
p.s。我发现 How to pass multiple parameters to a get method in ASP.NET Core 和 将查询字符串中的复杂对象列表传递给 WEB API
线程但没有帮助我。
这似乎是一种传递此数据的稍微奇怪的方式(为什么不只是一长串它们都是相同的对象类型?)。话虽如此,首先你需要修正你的属性。该属性是来自 "FromQueryAttribute" class 的“[FromQuery]”。您在实际使用属性时没有包含 "Attribute" 部分。
所以控制器是:
[HttpGet]
public IActionResult Get([FromQuery] List<MyObject> obj1, [FromQuery] List<MyObject> obj2) {}
然后你需要形成你的查询字符串参数来实际匹配这个结构。查询字符串类似于:
https://localhost:44315/api/test?obj1[0].Prop1=1&obj1[0].Prop2=2&obj2[0].Prop1=3&obj2[0].Prop2=4
这将在 Get 方法中创建一个 obj1 参数对象,其列表中有一个项目,第一个项目(零索引)的 Prop1 值为 1,Prop2 值为 2。它还会创建一个 obj2 项目列表中的一项,Prop1 值为 3,Prop2 值为 4。
如果您希望 obj1 在列表中有第二个项目,则索引变为 1,您可以将其添加到查询字符串中:
...&obj1[1].Prop1=5&obj1[1].Prop2=6
我在 ASP.Net CORE 3.1 API 上测试过它并且运行良好。
我需要创建一个带有两个 List 参数的 HttpGet 方法,但出现此错误:
has more than one parameter that was specified or inferred as bound from request body. Only one parameter per action may be bound from body. Inspect the following parameters, and use 'FromQueryAttribute' to specify bound from query, 'FromRouteAttribute' to specify bound from route, and 'FromBodyAttribute' for parameters to be bound from body:
MyObject
有两个属性:
public class MyObject
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
}
我试过上面抛出异常的事情
方法一
[HttpGet]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
方法二
[HttpGet]
[Route("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
方法三
[HttpGet("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)
使用FromQueryAttribute
我尝试使用:
[HttpGet]
public IActionResult Get([FromQueryAttribute] List<MyObject> obj1, [FromQueryAttribute] List<MyObject> obj2)
而且它不会抛出异常,但我不知道如何通过查询属性传递这些参数?
提前致谢
p.s。我发现 How to pass multiple parameters to a get method in ASP.NET Core 和 将查询字符串中的复杂对象列表传递给 WEB API 线程但没有帮助我。
这似乎是一种传递此数据的稍微奇怪的方式(为什么不只是一长串它们都是相同的对象类型?)。话虽如此,首先你需要修正你的属性。该属性是来自 "FromQueryAttribute" class 的“[FromQuery]”。您在实际使用属性时没有包含 "Attribute" 部分。
所以控制器是:
[HttpGet]
public IActionResult Get([FromQuery] List<MyObject> obj1, [FromQuery] List<MyObject> obj2) {}
然后你需要形成你的查询字符串参数来实际匹配这个结构。查询字符串类似于:
https://localhost:44315/api/test?obj1[0].Prop1=1&obj1[0].Prop2=2&obj2[0].Prop1=3&obj2[0].Prop2=4
这将在 Get 方法中创建一个 obj1 参数对象,其列表中有一个项目,第一个项目(零索引)的 Prop1 值为 1,Prop2 值为 2。它还会创建一个 obj2 项目列表中的一项,Prop1 值为 3,Prop2 值为 4。
如果您希望 obj1 在列表中有第二个项目,则索引变为 1,您可以将其添加到查询字符串中:
...&obj1[1].Prop1=5&obj1[1].Prop2=6
我在 ASP.Net CORE 3.1 API 上测试过它并且运行良好。