Web API 适用于嵌入式 URI,不适用于查询字符串

问题描述 投票:0回答:1

我有两个 API 端点,如下所示。

[Route("api/[controller]")]
[ApiController]
public class StudentController : ControllerBase
{
   IStudentRepository studentRepository;
   public StudentController(IStudentRepository studentRepository)
    { 
      this.studentRepository = studentRepository;
    }
    
   [HttpGet]
   public ActionResult<IEnumerable<Student>> GetStudents()
   {
      return Ok(studentRepository.GetStudents());
   }
    
   [HttpGet]
   [Route("{Id}")]
   public ActionResult<Student> GetStudent([FromRoute,FromQuery]int Id)
   {
      if (Id <= 0)
       return BadRequest();
    
         return Ok(studentRepository.GetStudent(Id));
    }
}

第二个端点 GetStudent() 仅当我们使用 URI /api/Student/{Id} 进行搜索时才会被调用,但对于 /api/Student?Id={Id} 则不起作用。

我们可以为嵌入 URI 和查询字符串 URI 使用相同的端点吗?

这在 .Net Framework Web API 中是可能的,但在 .Net Core Web API 中是不可能的,为什么会这样?

c# asp.net .net rest asp.net-core
1个回答
0
投票

在 ASP.NET Core Web API 中,您可以在同一操作方法中一起使用路由参数和查询参数,从而使同一端点适用于嵌入 URI 和查询字符串 URI。为此,您可以修改 GetStudent 方法,如下所示:

[HttpGet("{Id}")]
public ActionResult<Student> GetStudent([FromRoute]int Id, [FromQuery]int queryId)
{
    int searchId = Id > 0 ? Id : queryId;
    if (searchId <= 0)
        return BadRequest();

    return Ok(studentRepository.GetStudent(searchId));
}
© www.soinside.com 2019 - 2024. All rights reserved.