Swagger如何实现路由相同但查询参数不同?

How does Swagger achieve the same route but different query parameters?

我创建了一个 asp.net 核心 web api 项目,使用的是 .net5 版本,我有一个这样的路由。

[Route("api/detail")]
public IEnumerable<User> Get()
{
       //TODO
    return users;
}

[Route("api/detail")]
public IEnumerable<User> Get(string name)
{
        //TODO
    return users;
}

虽然我的请求方式相同,请求参数不同,但是swagger还是会报500错误。有什么办法解决吗?非常感谢任何帮助。

您收到 500 错误的原因可能有多种。当我将您的代码粘贴到新控制器中时,我收到的第一个错误是:

Ambiguous HTTP method for action... Actions require an explicit HttpMethod binding for Swagger

它告诉您需要使用 HttpMethod 绑定来装饰控制器中的每个操作,例如 [HttpGet]。稍后会详细介绍...

下一个问题是您使用 [Route] 将两个不同的操作方法绑定到具有相同 HttpMethod 的完全相同的路由。这在 API 控制器中是不可能的。

Conflicting method/path combination... Actions require a unique method/path combination for Swagger

我首选的路由方法是使用 Attribute routing with Http verb attributes

第一步是将路由属性移动到控制器。我假设您已经创建了 DetailsController:

[Route("api/[controller]")]
[ApiController]
public class DetailsController : ControllerBase { }

现在,更新您的操作。删除 [Route] 属性,替换为 HttpGet 属性,并将 name 参数添加到您的第二个终结点。我也更喜欢 return 和 IActionResult:

[HttpGet]
public IActionResult Get()
{
    //TODO
    return Ok(users);
}

[HttpGet("{name}")]
public IActionResult Get(string name)
{
    //TODO
    return Ok(users);
}

请注意,参数是通过在 Http 方法属性中的变量 {name} 周围使用花括号来标识的。两个端点都可以工作并且可以通过 swagger 访问。我敦促您阅读上面的链接页面,以便更好地了解可能的路由选项 (linked again)。