【问题标题】:Web-API controller multiple GET int and string parametersWeb-API 控制器多个 GET int 和字符串参数
【发布时间】:2021-02-24 19:39:21
【问题描述】:

我想要一个控制器有多个 GET,一个用于所有,一个带有 int 参数,另一个带有字符串参数。以下示例仍然给我错误:

[ApiController]
[Route("[controller]")]
public class StudentsController : ControllerBase
{
    [HttpGet]
    public IEnumerable<Student> Get()
    {
        return GetStudents();
    }

    [HttpGet("{id}")]
    public Student Get(int id)
    {
        return GetStudents().FirstOrDefault(s=> s.id == id);
    }

    [HttpGet("{name}")]
    public Student Get(string name)
    {
        return GetStudents().FirstOrDefault(s=> s.name == name);
    }
}

编辑 当前我收到以下错误

【问题讨论】:

  • 您遇到什么错误,请说明?

标签: c# asp.net-web-api asp.net-core-webapi


【解决方案1】:

intstring 在 url 中被同等对待,因此无法区分这些方法。您需要添加路径的附加部分,例如[HttpGet("id/{id}")][HttpGet("name/{name}")],或者使用查询字符串。

或者,您可以使用单个方法并尝试将参数解析为int,如果成功,则按 id 检索,否则按名称检索。

【讨论】:

  • 仅修复此 [HttpGet("id/{id}")] 和 [HttpGet("name/{name}")]
【解决方案2】:

您应该将您的路线操作更改为此

[HttpGet("id/{id}")]
public Student Get(int id)
{
    return GetStudents().FirstOrDefault(s=> s.id == id);
}

[HttpGet("name/{name}")]
public Student Get(string name)
{
    return GetStudents().FirstOrDefault(s=> s.name == name);
}

然后你可以这样调用你的动作

/Students/name/john

/Students/id/123

【讨论】:

    【解决方案3】:

    一种方法就像所有其他社区成员所说的那样,您可以添加额外的部分路线来指定它们。

    另一种方法是你可以使用Route constraint:

    [HttpGet("{id:int}")]
    public Student Get(int id)
    {
    }
    
    [HttpGet("{name}")]
    public Student Get(string name)
    {
    }
    

    【讨论】:

      【解决方案4】:

      这是不可能的,因为您创建了不明确的路线。
      试试这样:

      [HttpGet("id/{id}")]
      public Student Get(int id)
      {
          return GetStudents().FirstOrDefault(s=> s.id == id);
      }
      
      [HttpGet("name/{name}")]
      public Student Get(string name)
      {
          return GetStudents().FirstOrDefault(s=> s.name == name);
      }
      

      【讨论】:

      • 这是之前答案的副本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多