Api 定义HttpGet(Students/{SubjectId})与HttpGet(Students/{SectionId})的路由

Api 定义HttpGet(Students/{SubjectId})与HttpGet(Students/{SectionId})的路由,api,asp.net-web-api,url-routing,Api,Asp.net Web Api,Url Routing,在返回学生列表的控制器中,我有两个操作: HttpGet(Students/{SubjectId})-返回某个主题的学生 HttpGet(Students/{SectionId})-返回一个节的学生 当我调用Students/{SectionId}时,将在Students/{SubjectId}中接收调用。看起来我缺少了一个关于如何解决请求的基本概念 我的API应该如何处理这个调用?我不希望在路由路径中添加额外的参数。如果SubjectId和SectionId是相同的类型(例如整数),那么在

在返回学生列表的控制器中,我有两个操作:

  • HttpGet(Students/{SubjectId})
    -返回某个主题的学生
  • HttpGet(Students/{SectionId})
    -返回一个节的学生
当我调用
Students/{SectionId}
时,将在
Students/{SubjectId}
中接收调用。看起来我缺少了一个关于如何解决请求的基本概念


我的API应该如何处理这个调用?我不希望在路由路径中添加额外的参数。

如果
SubjectId
SectionId
是相同的类型(例如整数),那么在Web API中,您不应该公开具有相同签名的多个方法。i、 e.让学生/{int}。Web API无法将诸如GET Students/1234之类的调用路由到一个或其他控制器方法,因为它们的路由都与请求的URL匹配

即使它们的类型不同,或者字符串的格式不同,您可以实现复杂的路由逻辑以确保调用所需的方法,那么我仍然认为您应该重新考虑端点,因为所描述的API不是RESTful的

REST方法应该是基于实体的。因此,实体
Students
的根通常会有一个GET,返回所有
Students
,即:

GET Students
要获得单个学生,您需要公开一个端点,该端点采用唯一的学生ID

GET Students/{StudentId}
但是,如果您想通过
SubjectId
SectionId
返回经过筛选的学生列表,您通常会通过查询字符串执行此操作。i、 e

GET Students?Section=SectionId
GET Students?Subject=SubjectId
GET Students?Section=SectionId&Subject=SubjectId
或者,如果您将学生视为主题/部分的逻辑子级,您可以公开:

GET Sections/{SectionId}/Students
GET Subjects/{SubjectId}/Students

如果
SubjectId
SectionId
是相同的类型(例如整数),那么在Web API中,您不应该公开具有相同签名的多个方法。i、 e.让学生/{int}。Web API无法将诸如GET Students/1234之类的调用路由到一个或其他控制器方法,因为它们的路由都与请求的URL匹配

即使它们的类型不同,或者字符串的格式不同,您可以实现复杂的路由逻辑以确保调用所需的方法,那么我仍然认为您应该重新考虑端点,因为所描述的API不是RESTful的

REST方法应该是基于实体的。因此,实体
Students
的根通常会有一个GET,返回所有
Students
,即:

GET Students
要获得单个学生,您需要公开一个端点,该端点采用唯一的学生ID

GET Students/{StudentId}
但是,如果您想通过
SubjectId
SectionId
返回经过筛选的学生列表,您通常会通过查询字符串执行此操作。i、 e

GET Students?Section=SectionId
GET Students?Subject=SubjectId
GET Students?Section=SectionId&Subject=SubjectId
或者,如果您将学生视为主题/部分的逻辑子级,您可以公开:

GET Sections/{SectionId}/Students
GET Subjects/{SubjectId}/Students

如果希望对两个API使用相同的名称,还可以将1个API设置为GET方法,另一个设置为POST方法


必须为这两个API设置唯一的API名称如果要为这两个API使用相同的名称,还可以将1个API设置为GET方法,另一个设置为POST方法

您必须为这两个设置唯一的API名称