我正在尝试学习使用 ASP.NET Core Web API 创建 API。因此,我使用 VS2022 创建了默认的 Weatherforecast API,并启用了 Swagger。
控制器的标头有
[Route("api/[controller]/[action]")]
[ApiController]
public class WeatherController : ControllerBase
只是为了学习,我添加了这个方法:
[HttpGet("{someId}/{someName}/{someDateTime}/someBool")]
public IActionResult Get(int someId, string someName, DateTime someDateTime, bool someBool)
{
return StatusCode(200, $"Value passed: {someId}/{someName}");
}
当我运行它时,页面打开,我在 swagger 页面中看到该方法,然后单击“尝试”按钮。我填写了所有四个参数,单击“执行”,API 触发并且控制器方法中的断点被捕获。所有数据都传入了。
在 Swagger 页面中,请求 URL 显示
https://localhost:7062/api/Users/Get/65974/Jack%20Smith/1954-03-10/someBool?someBool=false
该方法应返回“传递的值:65974/Jack Smith”。
一切看起来都很有效,但我不相信这是正确的。
首先,当我进入 Postman 并在“参数”选项卡上填写参数并运行
GET
时,它将 URL 转换为
https://localhost:7062/api/Users/Get?someId=65974&someName=Jack Smith&someDateTime=1954-03-10&someBool=false
这与 Swagger 显示的不同。并且,这会触发无参数
GET
方法。
我最终想要实现的是创建一个 API,它可以有多个接受不同参数的
GET
和 POST
方法。
仅仅因为它触发了控制器方法并不意味着它是正确的。我的设置正确吗?
谢谢
我最终想要实现的是创建一个 API,它可以有多个接受不同参数的 GET 和 POST 方法。 仅仅因为它触发了控制器方法并不意味着它是正确的。我的设置正确吗?
这与asp.net core中web api的路由参数如何工作有关。
[HttpGet("{someId}/{someName}/{someDateTime}/someBool")]
这个路线属性只是
/api/Weather/Get/{someId}/{someName}/{someDateTime}/someBool
的地图。
这就是 https://localhost:7062/api/Users/Get?someId=65974&someName=Jack Smith&someDateTime=1954-03-10&someBool=false 的原因 不会匹配
[HttpGet("{someId}/{someName}/{someDateTime}/someBool")] public IActionResult Get(int someId, string someName, DateTime someDateTime, bool someBool)
它们是 asp.net core 内部的不同路由。
它只会映射无参数,因为无路由参数([HttpGet()])映射的url是
https://localhost:7062/api/Users/Get
。
更多详情,可以参考这篇文章。
我建议您可以使用以下属性来设置所有路由参数而不是查询字符串。
[HttpGet("{someId}/{someName}/{someDateTime}/{someBool:bool }")]
public IActionResult Get(int someId, string someName, DateTime someDateTime, bool someBool)
{
return StatusCode(200, $"Value passed: {someId}/{someName}");
}