我有一个名为Problems的模型,它具有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
/api/issues/
和
/api/issues/?severity=1
像这样
//GET api/issues/5
[HttpGet("{id}")]
public Issue GetByRoute([FromRoute(Name="id")] int id)
{
IssueService service = new IssueService();
return service.GetIssueById(id);
}
[HttpGet()]
public Issue GetByQuery([FromQuery(Name="severity")] int severityId)
{
IssueService service = new IssueService();
return service.GetIssueById(severityId);
}
有一个模棱两可的参考,因为两个动作都是HttpGet
,路由引擎无法决定采取哪条路线或你的意思。
Web Api控制器使用HttpVerbs而不是动作/方法名称(如MVC)进行路由。
我会用Attribute routing with Http[Verb] attributes。这使用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 param进行映射,那么下面应该可以工作:
// 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