将项添加到数组字段的正确REST端点是什么?

时间:2014-06-02 19:29:01

标签: mongodb rest

说我试图模拟在使用MongoDB编写的RESTful API中将学生添加到组中的操作。

组建模如下:

type Group struct {
Section mgo.DBRef
Instructor mgo.DBRef
Students []mgo.DBRef
}

另一个限制是API正在实施HAL+JSON协议,其中资源表示为链接。

我已经看过几个选项(下面):

  • POST / groups / {groupID} / students / {studentID}会将带有studentID的学生添加到该组。这种方法的问题在于,由于我实现了HAL + JSON协议,因此我不希望客户端手动提取ID并生成此链接。将表示所有资源,即/person/123可以是学生。

  • 发送应该属于该组的完整学生数组时,
  • PUT / groups / {groupID}。这似乎会引入许多复杂的解析逻辑。

如果还有其他选择,我也会对它开放。

编辑:我采用的方法如下: * POST / groupmembership /发送带有学生ID的JSON和要添加学生的组ID。但是,在后端,我没有生成新模型,而是采用对象并以编程方式将指定的学生添加到指定的组。

那么问题是如何从集团中删除学生?我是否可以使用

向/ groupmembership发送DELETE请求
{
  "student": 123,
  "group": 456
}

从456组删除学生123?

2 个答案:

答案 0 :(得分:3)

  

其中资源表示为链接

事实并非如此。链接可能是操作调用,因此它们表示可能的资源状态转换。

要向集合添加内容,您需要一个集合资源,您必须决定要在该集合中存储的内容。在您的情况下,这可以是两件事:团体学生会员或学生。如果这是一个1:n关系,那么您可以存储学生并删除学生。如果这是一个n:m关系,那么你必须存储会员资格并删除会员资格,因为你不想从存储中删除学生,只需要删除会员资格。

您可以通过两种方式识别会员资格:

  • 您可以使用与会者的ID:/groups/1/memberships/student:1/students/1/memberships/group:1
  • 您可以为每个成员添加唯一ID:/memberships/1234

注释:

  • URI结构仅从人的角度来看。 REST客户端将检查链接关系而不是URI结构。
  • 资源与数据库中的实体不同。只有简单的CRUD应用程序才能代表它们。因此REST与您的数据库结构无关。

答案 1 :(得分:-1)

首先,没有正确的REST端点。 URL语义与REST无关。重要的是,URL是从超文本而不是从带外信息中获取的,并且看起来你已经得到了那个部分,因为你正在使用HAL。因此,正确的REST端点是服务器为客户端提供的任何链接,以便添加项目。

只要从HTTP的角度来看,选项不是错误的,我就说要坚持使用与API的REST更一致的内容。

POST /groups/{groupID}/students/{studentID}选项以便在该位置创建新学生是不正确的,因为POST正在提交要由目标资源处理的有效负载,在这种情况下它不存在然而。一种常见的模式是使用POST /groups/{groupID}/students,其中集合充当新元素的辅助工具,在有效负载中使用创建参数,并使用201 HTTP状态代码在Location头中返回创建的学生URL。