webapi控制器中的调用方法.net核心在uri中传递字符串不起作用

时间:2018-05-05 11:31:02

标签: asp.net-core-2.0 asp.net-core-webapi

我试图从我的测试中调用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

是否有链接说明何时使用此参数绑定?

非常感谢

2 个答案:

答案 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]:使用配置的格式化程序绑定请求正文中的数据。根据请求的内容类型选择格式化程序。

参考Model Binding in ASP.NET Core

答案 1 :(得分:0)

我发现问题所在,httpget或路由的名称必须与您在链接中设置的名称相匹配