【问题标题】:.Net Core API Endpoint not allowing QueryString parameters.Net Core API Endpoint 不允许 QueryString 参数
【发布时间】:2020-07-01 02:15:23
【问题描述】:

这很可能是重复的,但我已经看过但找不到答案。这里的第一个答案看起来很有希望:Query string not working while using attribute routing 但我试过了,但没有用。

[HttpGet, Route("api/machine/byid/{id=id}/{pageNumber=pageNumber}/{pageSize=pageSize}/{fields=fields}")]
public string ById(int id, int pageNumber, int pageSize, string fields)
    // code removed
}

这行得通:

https://localhost:44303/api/machine/byid/1/2/3/a,b,c

这不是:

https://localhost:44303/api/machine/byid?id=1&pageNumber=2&pageSize=3&fields=a,b,c

第二个url返回:

{"type":"https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1","title":"出现一个或多个验证错误。","status": 400,"traceId":"|bf12950b-472923d3a24062d1.","errors":{"id":["值 'id' 无效。"],"pageSize":["值 'pageSize' 无效有效。"],"pageNumber":["值'pageNumber'无效。"]}}

【问题讨论】:

    标签: asp.net-core routing


    【解决方案1】:

    你需要两条路线:

    [HttpGet("api/machine/byid")]
    public string ById(
        [FromQuery("id")] int id, 
        [FromQuery("pageNumber")] int pageNumber, 
        [FromQuery("pageSize")] int pageSize, 
        [FromQuery("fields")] string fields)
    {
    }
    

    Follow this link for more informations

    【讨论】:

    • 为什么我需要 2 个? ... 哦。我知道了。但是,如果我只需要/希望查询字符串选项起作用,那么我只需要第二个。
    • 因为这是两个不同的合同。在查询字符串中传输数据和在路由中传输数据的 HTTP 语义不同。
    • 好的,但是如果我只需要/希望查询字符串选项起作用,我只需要第二个示例吗?
    • 另外,看起来 FromQuery 已为 .NET Core 删除
    • 不,你不会。
    【解决方案2】:

    sturcotte06 的答案很接近,但不是 100% 符合核心。这有效:

    [HttpGet, Route("api/machine/byid/{id=id}/{pageNumber=pageNumber}/{pageSize=pageSize}/{fields=fields}")]
    public string ById([FromQuery] int id, [FromQuery] int pageNumber, [FromQuery] int pageSize, [FromQuery] string fields)
    {
        // code removed
    }
    

    【讨论】:

      【解决方案3】:

      您提供的示例演示了路由参数。路由参数和查询参数之间有明显的区别。

      要完成查询参数,您可以将[FromQuery] 属性添加到您的方法参数中。这将允许您提供的查询参数示例,

      例如:https://localhost:5000/api/persons?firstName=bob&lastName=smith

      您还可以在方法参数中为这些参数提供默认值。您可以在一个操作中将多个查询参数串在一起。

      对于路由参数,参数是通过路由本身提供的。

      例如:https://localhost:5000/api/persons/23

      这些参数是在控制器操作的[HttpGet("{id}")] 属性中定义的。您还可以将参数限制为特定类型,例如int。这是通过添加冒号并指定类型来实现的。示例[HttpGet("{id:int}")]。不需要在路由参数的方法参数中添加更多属性。

      当然,对于这两种类型,您还必须在方法参数中声明这些参数。

      // "/api/persons/23"
      [HttpGet("{id}")]
      public async Task<IActionResult> GetPersonById(int id)
      {
          // Code ...
      }
      
      // "/api/persons?firstName=bob&lastName=smith"
      [HttpGet]
      public async Task<IActionResult> GetPersonByName([FromQuery] string firstName = null, [FromQuery] string lastName = null)
      {
          // Code here... both firstName and lastName can now be optional or only one provided
      }
      

      【讨论】:

      • 谢谢! (如果我在没有指定路线的情况下执行此操作,则会出错。)
      • 您能澄清一下您要做什么吗?
      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2019-07-02
      • 2017-11-02
      • 2018-07-05
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多