我正在设计一个遵循REST规范的应用程序,但我不确定如何构建以下内容。
我有项目,遵循基本的CRUD流程。我也有用户也遵循基本的CRUD流程。但是我有一个将用户添加到项目的操作,我不知道如何发出请求。
用户可以有多个项目,所以我认为它应该是某种PUT请求,但项目ID实际上并不是用户模型的一部分。
PUT /users/project/3
有关如何处理此事的任何建议?
答案 0 :(得分:2)
听起来好像用户可以有很多项目而项目可以有很多用户。在这种情况下,最好通过一个连接表来管理这种关系,你可以将参与者命名为具有user_id和project_id的参与者。
然后,您可以选择是通过用户还是通过项目管理参与者。对我来说,管理你的项目参与者是有意义的,因为你正在创建一个新的参与者,这是一个POST。
POST /projects/:project_id/participants
有效负载将包含user_id。
答案 1 :(得分:1)
如果项目ID不是用户模型的一部分,那么这意味着用户ID数组是项目模型的一部分......对吗?所以我认为这适合将用户添加到项目中:
PUT /projects/(projectid)/users/(userid)
但是,如果服务的消费者(即Backbone)不需要这些URL,也许您不需要支持这些URL;也许你只想要一个端点来更新项目:
PUT /projects/(projectid)
并且您的Ajax帖子调用将包含用户列表,作为“更新此项目”请求的一部分。
您可能希望使用Backbone中的任一种形式的URL,具体取决于UI。 URL的第一种形式实际上仅对诸如“将用户x添加到项目y”之类的请求有用(例如,当管理员点击“将此用户添加到当前项目时”或其他任何内容时)。
URL的第二种形式是您可能用于更新项目批发的内容,其中可能包括用户列表,项目名称等;这就是“编辑项目”视图。
var ProjectModel = Backbone.Model.extend({
defaults: {
"project_name": "",
"users: [0]
},
urlRoot: "/myrestapi/projects",
url: function() {
return this.urlRoot + "/" + this.cid;
}
});
此模型上的Backbone save 请求会触发(POST?PUT?)到URL:
/myrestapi/projects/(cid)
使用表示项目模型状态的帖子数据:
{ "project_name": "foo", "users": [15, 18, 42] }
然后由您的REST服务触发服务器数据存储的更新...