我试图从我的测试中调用webapiController(.net core)中的方法
如果我的请求对象有一个Id作为字符串它不起作用,它就像一个int
我的点头样本中我做错了什么?
[Fact]
public async Task WhyDoesNotWorkWithIdAsString()
{
string thisQueryDoesNotWork = "http://localhost:1111/api/v1/shop/customers?id=1";
string thisQueryWorksProvidedTheIdIsAnInt = "http://localhost:1111/api/v1/shop/customers/1";
var response = await client.GetAsync(thisQueryDoesNotWork);
var response2 = await client.GetAsync(thisQueryWorksProvidedTheIdIsAnInt);
//omitted asserts
}
[Route("api/[controller]")]
public class ShopController: Controller
{
[HttpGet]
[Route("{id}",Name ="GetCustomerAsync")]
[ProducesResponseType(typeof(GetCustomerResponse), (int)HttpStatusCode.OK)]
//more ProducesResponseType omitted
public async Task<IActionResult> GetCustomerAsync([FromQuery]GetCustomerRequest request)
{
//code omitted
}
}
public class GetCustomerRequest
{
Required]
public string Id { get; set; }
// public int Id { get; set; } //works with int but not with a string
}
}
也低于正确
[FromQuery] =使用仅限获取 [FromBody] =使用Put-Post
是否有链接说明何时使用此参数绑定?
非常感谢答案 0 :(得分:1)
在
[Route("{id}",Name ="GetCustomerAsync")]
{id}
模板参数是路由的一部分,但在action参数中是通过[FromQuery]
请求的,这就是它不匹配的原因。
期待
http://localhost:1111/api/v1/shop/customers/1
但是你正在发送
http://localhost:1111/api/v1/shop/customers?id=1
这就是为什么第二个链接有效而第一个没有。
参考Routing to Controller Actions
关于[From*]
属性的关注
[FromHeader]
,[FromQuery]
,[FromRoute]
,[FromForm]
:使用这些来指定您要应用的确切绑定来源。
...
[FromBody]
:使用配置的格式化程序绑定请求正文中的数据。根据请求的内容类型选择格式化程序。
答案 1 :(得分:0)
我发现问题所在,httpget或路由的名称必须与您在链接中设置的名称相匹配