【发布时间】:2017-07-13 04:38:28
【问题描述】:
在设计 REST API 时,我了解如何添加(POST)、更新(PUT、PATCH)等实体。但我想知道如何设计端点以将现有项目添加到现有资源?
这是一个示例:假设我们有一个 API,其中包含资源 Course 和 Student 以及以下端点:
-
http://localhost/students-POST添加新学生 -
http://localhost/courses-POST添加新课程 -
http://localhost/courses/1-PUT更新 ID 为 1 的课程 -
http://localhost/courses/1/students-GET列出课程中 ID 为 1 的所有学生 -
http://localhost/courses/1/students-POST将新学生添加到 ID 为 1 的课程中
问题是,我如何链接现有学生到现有课程?澄清一下:“现有”是指系统中已经存在但尚未链接的资源。
我看到以下选项:
-
http://localhost/courses/1/students-PUT并在正文中发送学生 ID。使用PUT的理由是我正在“更新”课程的学生资源。 -
http://localhost/courses/1/students-POST并在正文中发送学生 ID。使用POST的原因是我在课程中“添加/创建”了一个新资源。 -
http://localhost/courses/1/students/2-PUT并在 URL 中发送 Id,在正文中不发送任何内容。 -
http://localhost/courses/1/students/2-POST并在 URL 中发送 Id,在正文中不发送任何内容。 -
http://localhost/students/2-PUT或POST并在正文中发送课程 ID。 -
http://localhost/students/2/courses/-PUT或POST并在正文中发送课程 ID。 - ...
有最佳实践吗?有什么建议吗?这应该通过courses 或students 资源处理吗?两者都应该是可能的吗?另外我不确定使用哪种方法(PUT 或POST)?
PUT 或 POST 身体里什么都没有,感觉有点奇怪。另一方面,如果正文中的所有内容都是一个 Id,为什么不把它放在 URL 中呢?
【问题讨论】:
-
使用 PUT 请求使用localhost/students/1 更新 ID 为 1 的学生,并在发送的正文/数据中包含现有的课程 ID。这不适合你吗?
-
我正在考虑通过
courses资源添加学生,因为这似乎是“自然方式”。但你的方法肯定也会奏效。我只是想知道最好的方法是什么?也许这两种方法都是合适的。我会相应地更新问题。
标签: web-services rest http asp.net-web-api restful-url