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