c# - 如何在 Web API 中调用接受相同参数类型的 GET 方法
问题描述
我有一个名为 Issues 的模型,它具有整数的 Id 和严重性属性,以及一个应该处理 GET 请求并按严重性返回所有问题的问题控制器。由于Dotnet API不支持int等相同的参数类型,我该怎么做呢?
我尝试使用不同的方法名称,例如Get()
,GetBySeverity(int severity)
但出现了模棱两可的异常。
这是我的控制器
[Route("api/[controller]")]
[ApiController]
public class IssuesController : ControllerBase
{
[HttpGet(Name="issues")]
public IEnumerable<Issue> GetAllIssues() {
IssueService service = new IssueService();
return service.GetIssues();
}
[HttpGet]
public IEnumerable<Issue> GetBySeverity([FromQuery(Name="severity")]int severity)
{
IssueService service = new IssueService();
return service.GetIssuesBySeverity(severity);
}
}
这些是我想要开发的
/api/issues/
api
/api/issues/?severity=1
解决方案
有一个模棱两可的参考,因为这两个操作都是HttpGet
,并且路由引擎无法决定采取哪条路线或您的意思是哪条路线。
Web Api 控制器使用 HttpVerbs 而不是操作/方法名称(如 MVC)进行路由。
我会使用带有 Http[Verb] 属性的属性路由。这用于Route("myroute")
定义路线。
// GET api/issues/severity/5
[Route("severity/{severity}")]
[HttpGet()]
public IEnumerable<Issue> GetBySeverity(int severity)
{
IssueService service = new IssueService();
return service.GetIssuesBySeverity(severity);
}
// GET api/issues/5
[HttpGet("{id}")]
public Issue Get(int id)
{
IssueService service = new IssueService();
return service.GetIssueById(id);
}
上述方法将路由到api/issues/1
和api/issues/severity/1
。如果您想使用查询参数而不是 url 参数进行映射,那么下面应该可以工作:
// GET api/issues/severity?severity=5
[HttpGet("severity")]
public IEnumerable<Issue> GetBySeverity([FromQuery] int severity)
{
IssueService service = new IssueService();
return service.GetIssuesBySeverity(severity);
}
// GET api/issues?id=5
[HttpGet()]
public Issue Get([FromQuery] int id)
{
IssueService service = new IssueService();
return service.GetIssueById(id);
}
上述动作将路由到api/issues?id=1
和api/issues/severity?severity=1
推荐阅读
- botframework - 如何在 bot 框架编写器中使用带有按钮的自适应卡发送电子邮件?
- sql - 如何将组更新 sql 填充到单个更新中
- excel - 如果其中一个单元格在 VBA 中相同,则需要在 excel 中合并行
- html - 检测nofollow
- azure - HTTP 错误 500.30 Azure.RequestFailedException
- wpf - 特殊附加属性绑定有效,但不适用于 DataTemplate
- pine-script - 将策略限价买入(或卖出)转换为警报
- php - Laravel 7 eloquent nested conditions for filtering with pivot
- excel - 范围 RemoveDuplicates 无效的过程调用或参数
- oracle - 即使在 oracle 12c 中使用 DBMS_REDACT 成功添加策略后,也无法看到被屏蔽的数据