假设我想遵守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}
答案 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"
}
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