在RESTful API中处理嵌套资源的正确方法是什么?

在RESTful API中处理嵌套资源的正确方法是什么?,api,rest,restful-architecture,Api,Rest,Restful Architecture,假设我正在使用以下RESTful API端点: /用户/:显示所有用户 /users/$user\u id/:显示特定用户 /users/$user\u id/posts/:按用户显示所有帖子 /users/$user\u id/posts/$post\u id/:按用户显示特定帖子 此数据模型中的约束:帖子始终有一个用户 “处理嵌套资源”是指处理CRUD操作 我应该在/users/$user\u id/posts/端点上执行CRUD操作(POST、PUT、PATCH、DELETE),还是应

假设我正在使用以下RESTful API端点:

  • /用户/:显示所有用户
  • /users/$user\u id/:显示特定用户
  • /users/$user\u id/posts/:按用户显示所有帖子
  • /users/$user\u id/posts/$post\u id/:按用户显示特定帖子
此数据模型中的约束:帖子始终有一个用户

“处理嵌套资源”是指处理CRUD操作

我应该在/users/$user\u id/posts/端点上执行CRUD操作(POST、PUT、PATCH、DELETE),还是应该创建另一个端点/posts/并在那里处理CRUD操作,同时保持第一个端点为只读

抱歉,如果此问题已以其他形式存在于SO::-)RESTful API中有太多的“FUD”

提前感谢您提供的任何提示/澄清

亲切问候,,
K.

您应该在现有的
/posts/
/posts/$post\u id/
端点上实现这些操作。很少有好的理由创建多个表示相同资源的端点。为什么要让他们明白他们只能进入
/users/$user\u id/posts/$post\u id/
,但必须进入
/posts/$post\u 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\u id/posts/
作为对用户帖子的非规范引用。虽然我不能说这是错的,但最好是每个资源只使用一个端点。筛选参数没有那么难。

我建议您不必担心URL的设计:

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

测试API的RESTfull的一个好方法是用统一的ID替换所有精心构造的URI,并查看客户端是否可以使用这些信息。如果不是这样的话,你就会依赖带外信息,从而提高你的休息能力。但与N度数据库规范化类似,为了让所有参与者都能更轻松地完成任务,您可能希望生活中的“正确性”有所降低。需要多少正确性取决于您的域的易变性,以及您希望API用户的数量是少还是多

如果您想在URI中编码带外信息,我会尽量限制所需的信息。由于
/users/$user\u id/posts/$post\u id/
要求用户知道三件事(URL设计、用户id、post id),因此似乎有一些替代方案允许更多的无知;-)

  • /posts/$post\u id
    :更好,因为用户只需要一个id和资源类型就可以构造URI
  • /$resource\u id
    最好,但需要全局唯一的id

相同资源的多个端点没有意义不。但是有人在本主题中提到的解决方案是什么:虽然能够在多个端点上执行CRUD操作没有意义,但Javier的观点是有意义的,不是吗?“POST/partners/:partner_id/tickets-创建一个ticket并与合作伙伴关联,返回一个带有新URI的201,格式为/tickets/:id”@kristovbk如果你想这样做,没有人会阻止你。哈维尔的做法并非不合理。只需确保整个API的一致性,并尽量减少重复。