2014-04-22 58 views
0

考虑到我使用下面的RESTful API端点:在RESTful API中处理嵌套资源的正确方法是什么?

  • /用户/:显示所有用户
  • /用户/ $ USER_ID /:显示特定用户
  • /用户/ $ USER_ID /职位/:显示用户所有帖子
  • /用户/ $ USER_ID /职位/ $ POST_ID /:由用户

约束在这个数据模型显示具体职位:一个帖子总是有一个用户。

“处理嵌套资源”我的意思是处理CRUD操作。

我应该在/用户/ $ USER_ID /职位/端点实现CRUD操作(POST,PUT,PATCH,DELETE)或者我应该创建另一个端点/职位/和处理CRUD操作那里,同时保持第一个端点只读?

对不起,如果这个问题已经存在可能在另一种形式上SO。 :-) RESTful API中有很多“FUD”。

在此先感谢您的任何提示/澄清!

亲切的问候, K.

回答

0

你应该实现对现有/posts//posts/$post_id/终端的操作。很少有很好的理由让多个端点代表相同的资源。为什么让他们弄清楚他们只能在/users/$user_id/posts/$post_id/上获得,但必须去/posts/$post_id/删除?

有时候,作为

/users/: show all users 
/users/$user_id/: show specific user 
/users/$user_id/posts/: show all posts by user -- GET only 

/posts/: show all posts       -- All operations 
/posts/$post_id/: show specific post by user -- All operations 

他们使用/users/$user_id/posts/作为非规范参考用户帖子的人实现这一点。尽管我不能称其为错误,但最好每个资源都使用一个端点。过滤器参数并不那么难。

+0

多个端点相同的资源不有道理没有。但是有人在这个主题中提到的解决方案如何:http://programmers.stackexchange.com/questions/205418/what-is-the-proper-way-of-nesting-resources-in-rest-model虽然它不'如果能够在多个端点上执行CRUD操作是有意义的,Javier的观点确实有道理,不是吗? “POST/partners /:partner_id/tickets - 创建一张票并关联到合作伙伴,使用新的URI返回201,格式为/ tickets /:id” – Braek

+0

@kristofvbk如果您想这样做,没有人阻止你。哈维尔的做法并非不合理。只要确保您在整个API中保持一致,并尽量减少重复。 –

0

Following Roy Fielding's clarification regarding REST我建议你不要担心你的URL的设计:

一个REST API一定不能定义固定的资源名称或层次结构(客户端和服务器的一个明显的耦合)。服务器必须有自由控制自己的命名空间。相反,允许服务器通过在媒体类型和链接关系中定义这些指令来指导客户如何构建适当的URI,例如在HTML表单和URI模板中完成。 [这里的失败意味着客户端由于带外信息而假设资源结构,例如特定于领域的标准,这是面向数据的等同于RPC的功能耦合]。

测试API的RESTfulness的一个好方法是用统一的ID替换所有精心构造的URI并查看客户端是否可以使用这些信息。如果不是,你依赖于带外信息,并可以提高你的RESTfulness。但是类似于第n级数据库规范化,为了让所有参与者都变得更容易,您可能希望采用更少的“正确性”。需要多少正确性取决于您的域的多变性以及您是否期望API用户数量更少或更多。

如果你想编码URI中的带外信息,我会尽量限制所需的信息。由于/users/$user_id/posts/$post_id/需要用户知道的三件事(URL设计,用户ID,邮政ID),似乎有一些替代方案,将允许更多的无知;-)

  • /posts/$post_id:好,因为你的用户只会需要一个ID和资源类型,构建URI
  • /$resource_id:最好的,但需要在全球唯一的ID
相关问题