首页 > 解决方案 > 如何在 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

标签: c#.netasp.net-web-api

解决方案


有一个模棱两可的参考,因为这两个操作都是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/1api/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=1api/issues/severity?severity=1


推荐阅读