.Net Core API 端点不允许 QueryString 参数

.Net Core API Endpoint not allowing QueryString parameters

这很可能是重复的,但我已经看过但找不到答案。这里的第一个答案看起来很有希望: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

第二个urlreturns:

{"type":"https://www.rfc-editor.org/rfc/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"|bf12950b-472923d3a24062d1.","errors":{"id":["The value 'id' is not valid."],"pageSize":["The value 'pageSize' is not valid."],"pageNumber":["The value 'pageNumber' is not valid."]}}

您需要两条路线:

[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

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
}

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

要完成查询参数,您可以将[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
}