说我试图模拟在使用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?
答案 0 :(得分:3)
其中资源表示为链接
事实并非如此。链接可能是操作调用,因此它们表示可能的资源状态转换。
要向集合添加内容,您需要一个集合资源,您必须决定要在该集合中存储的内容。在您的情况下,这可以是两件事:团体学生会员或学生。如果这是一个1:n关系,那么您可以存储学生并删除学生。如果这是一个n:m关系,那么你必须存储会员资格并删除会员资格,因为你不想从存储中删除学生,只需要删除会员资格。
您可以通过两种方式识别会员资格:
/groups/1/memberships/student:1
或/students/1/memberships/group:1
/memberships/1234
注释:
答案 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。