学习 ASP.NET Core Web API

问题描述 投票:0回答:1

我正在尝试学习使用 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
方法。

仅仅因为它触发了控制器方法并不意味着它是正确的。我的设置正确吗?

谢谢

asp.net-core-webapi
1个回答
0
投票

我最终想要实现的是创建一个 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}");
}
© www.soinside.com 2019 - 2024. All rights reserved.