我有两个 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 中是不可能的,为什么会这样?
在 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));
}