Codeigniter 主干REST请求将用户添加到项目?

Codeigniter 主干REST请求将用户添加到项目?,codeigniter,rest,backbone.js,underscore.js,Codeigniter,Rest,Backbone.js,Underscore.js,我正在按照REST规范设计一个应用程序,但我不确定如何构造以下内容 我有遵循基本CRUD流程的项目。我还有一些用户也遵循基本的CRUD流程。但是,我有一个向项目添加用户的操作,我不知道如何发出请求 一个用户可以有多个项目,所以我认为这应该是一种PUT请求,但是项目id实际上不是用户模型的一部分 PUT /users/project/3 关于如何实现这一点有什么建议吗?如果项目id不是用户模型的一部分,那么这意味着用户id数组是项目模型的一部分。。。正确的?因此,我认为将用户添加到项目中是合适的

我正在按照REST规范设计一个应用程序,但我不确定如何构造以下内容

我有遵循基本CRUD流程的项目。我还有一些用户也遵循基本的CRUD流程。但是,我有一个向项目添加用户的操作,我不知道如何发出请求

一个用户可以有多个项目,所以我认为这应该是一种PUT请求,但是项目id实际上不是用户模型的一部分

PUT /users/project/3

关于如何实现这一点有什么建议吗?

如果项目id不是用户模型的一部分,那么这意味着用户id数组是项目模型的一部分。。。正确的?因此,我认为将用户添加到项目中是合适的:

PUT /projects/(projectid)/users/(userid)
但是,如果服务的消费者(即主干网)不需要这些URL,则可能不需要支持这些URL;也许您只需要一个端点来更新项目:

PUT /projects/(projectid)
您的Ajax post调用将包括一个用户列表,作为“更新此项目”请求的一部分

根据用户界面的不同,您可能希望使用主干中的任意一种URL形式。URL的第一种形式实际上只对“将用户x添加到项目y”之类的请求有用(例如,当管理员单击“将此用户添加到当前项目”或其他内容时)

URL的第二种形式是您可能用于批量更新项目的内容,其中可能包括用户列表、项目名称等;这就是“编辑项目”视图

此模型上的主干存储请求将触发(POST?PUT?)到URL:

/myrestapi/projects/(cid)
使用表示项目模型状态的post数据:

{ "project_name": "foo", "users": [15, 18, 42] }

然后由您的REST服务触发对服务器数据存储的更新…

听起来用户可以有很多项目,一个项目可以有很多用户。在这种情况下,管理这种关系最好通过一个连接表来完成,您可以命名一些类似参与者的名称,这些参与者将具有用户id和项目id

然后,您可以选择是通过用户还是通过项目管理参与者。对我来说,管理您的项目参与者是有意义的,因为您正在创建一个新的参与者,所以这是一个帖子

POST /projects/:project_id/participants

有效负载将包含用户id。

好的,这是有道理的,但这就是我有点困惑的地方。如果我已经在使用put/projects/(projectd)来更新项目属性,那么这对我来说似乎是一个单独的过程。或者,这是否意味着我的PUT函数应该根据URL的形成方式或它接收的参数具有不同情况下的逻辑?此外,我将如何使用backbone.js发送此类请求?我并不是真的在这里更新用户或项目模型。如果我有一个包含用户列表的项目,那么它更像是一个用户的POST请求,因为我需要将该用户添加到集合中-唯一的问题是用户已经存在于数据库中,它们只是被添加到项目中。@Rob我想PUT函数可能有不同的逻辑,这取决于URL;这实际上取决于您是想支持完整的RESTAPI,还是只支持主干应用程序真正需要的URL。请看我的更新为例。从主干网,你可以自由地以不同的方式来构造它;您可以有一个单独的users\u projects模型,对应于数据库中类似的多对多表。您可以在用户模型中使用嵌套模型。或者你可以跳过这个模型,把一个原始的Ajax POST/PUT放回REST服务。好吧,我想这就是我遗漏的部分,项目/用户之间的关联本身就是一个POST请求。我将不得不在codeigniter中修改我的REST处理程序,但这将为我解决很多问题,默认情况下,对于
POST/projects
调用,我在projects控制器中有一个
index\u POST()
函数,现在我也可以在那里有一个
user\u POST()
处理程序,从设计的角度来看,这很有意义,如果我愿意的话,它甚至可以让我拥有一个带有
project\u post()
处理程序的用户控制器。
POST /projects/:project_id/participants