为 HttpGet(Students/{SubjectId}) 与 HttpGet(Students/{SectionId}) 定义路由
Defining routing for HttpGet(Students/{SubjectId}) vs HttpGet(Students/{SectionId})
我在控制器中有两个动作,return 学生列表:
HttpGet(Students/{SubjectId})
- returns 学科学生
HttpGet(Students/{SectionId})
- returns 一个部门的学生。
当我打电话给Students/{SectionId}
时,电话是在Students/{SubjectId}
接到的。看来我缺少有关如何解决请求的基本概念。
我的 API 应该如何处理这个电话?我不想在路由路径中添加额外的参数。
如果 SubjectId
和 SectionId
是相同的类型(例如整数),那么在 Web API 中您不应该公开具有相同签名的多个方法。即 GET Students/{int}。 Web API 无法将诸如 GET Students/1234 之类的调用路由到一个或其他控制器方法,因为它们的路由都与请求的 URL 匹配。
即使它们的类型不同或字符串的格式使您可以实现复杂的路由逻辑以确保调用所需的方法,但我仍然相信您应该 re-think 您的端点作为 API 所描述的不是 RESTful.
REST 方法应该是 entity-based。因此,实体 Students
通常在其根部有一个 GET,它将 return 所有 Students
即:
GET Students
要获得单个学生,您需要公开一个采用唯一学生 ID 的端点。即
GET Students/{StudentId}
但是,如果您想 return 按 SubjectId
或 SectionId
过滤的学生列表,您通常会通过查询字符串执行此操作。即
GET Students?Section=SectionId
GET Students?Subject=SubjectId
GET Students?Section=SectionId&Subject=SubjectId
或者,如果您将学生视为 subject/section 的合乎逻辑的 child,您可以公开:
GET Sections/{SectionId}/Students
GET Subjects/{SubjectId}/Students
如果你想为两个 API 使用相同的名称,你还可以将 1 API 设置为 GET,另一个设置为 POST 方法
或
您必须为两者设置唯一的 API 名称
我在控制器中有两个动作,return 学生列表:
HttpGet(Students/{SubjectId})
- returns 学科学生HttpGet(Students/{SectionId})
- returns 一个部门的学生。
当我打电话给Students/{SectionId}
时,电话是在Students/{SubjectId}
接到的。看来我缺少有关如何解决请求的基本概念。
我的 API 应该如何处理这个电话?我不想在路由路径中添加额外的参数。
如果 SubjectId
和 SectionId
是相同的类型(例如整数),那么在 Web API 中您不应该公开具有相同签名的多个方法。即 GET Students/{int}。 Web API 无法将诸如 GET Students/1234 之类的调用路由到一个或其他控制器方法,因为它们的路由都与请求的 URL 匹配。
即使它们的类型不同或字符串的格式使您可以实现复杂的路由逻辑以确保调用所需的方法,但我仍然相信您应该 re-think 您的端点作为 API 所描述的不是 RESTful.
REST 方法应该是 entity-based。因此,实体 Students
通常在其根部有一个 GET,它将 return 所有 Students
即:
GET Students
要获得单个学生,您需要公开一个采用唯一学生 ID 的端点。即
GET Students/{StudentId}
但是,如果您想 return 按 SubjectId
或 SectionId
过滤的学生列表,您通常会通过查询字符串执行此操作。即
GET Students?Section=SectionId
GET Students?Subject=SubjectId
GET Students?Section=SectionId&Subject=SubjectId
或者,如果您将学生视为 subject/section 的合乎逻辑的 child,您可以公开:
GET Sections/{SectionId}/Students
GET Subjects/{SubjectId}/Students
如果你想为两个 API 使用相同的名称,你还可以将 1 API 设置为 GET,另一个设置为 POST 方法
或
您必须为两者设置唯一的 API 名称