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)。
我创建了一个 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)。