REST API-加入其他资源/映射资源的资源

时间:2018-06-29 13:13:00

标签: rest

假设我想遵守REST原则,如果我有一个名为students的资源和一个名为courses的资源,我可以预定这样的课程的人:

PUT: api/courses/{courseId}/students/{studentId}

本能地,我想列出这样的学生预订:

GET: api/courses/{courseId}/students

但是我想包括一些与预订有关的信息(例如预订号),这意味着第三个映射资源。

因此,我提议要获得学生的预订,我们需要一个单独的预订资源,该资源可能看起来像这样:

GET: api/courses/{courseId}/student-bookings

我的问题:由于我用来创建预订的端点与我用来检索已创建的预订的端点不同,因此有人看到上述方法存在问题吗?


edit:对我来说更好的另一种选择是下面的方法,尽管它并没有真正改变问题,该问题涉及使用与创建资源的端点不同的端点访问创建的资源:

GET: api/courses/student-bookings?courseId={courseId}

1 个答案:

答案 0 :(得分:1)

  

假设我想遵守REST原则[...]

REST不关心URI设计。但是,使用URI正确标识您的资源并允许您的API演进被认为是良好做法


我将预订(或注册)理解为具有自身属性的新资源

因此,除了/api/courses/api/students外,我还有/api/enrollments,它映射到课程和学生之间的关系。

可以通过POST请求创建注册,如下所示:

POST /api/enrollments HTTP/1.1
Host: example.org
Content-Type: application/json

{
  "course": "designing-wep-apis",
  "student": "john.doe"
}

成功的请求将返回201和已创建的注册的Location

HTTP/1.1 201 Created
Location: /api/enrollments/20180012

以下请求可用于检索特定课程的所有注册:

GET /api/enrollments?course=designing-wep-apis HTTP/1.1
Host: example.org
Accept: application/json

以下内容可检索特定学生的所有入学信息:

GET /api/enrollments?student=john.doe HTTP/1.1
Host: example.org
Accept: application/json