(请原谅问题标题;很难总结这个问题。)
在 Facebook 上,你like
的东西。在推特上,你们follow
。在 GitHub 上,您还有follow
人员、star
存储库和要点。
所有这些情况都非常相似:这些连接是轻量级的,而不是真正的“资源”本身。例如,这三个 API 都没有公开此类连接的公共 ID。
这就提出了一个问题:公开用于创建/查询/删除这些连接的 API 的“最佳”(就 REST 而言)方式是什么?
Facebook确实 [ 1 ]:
GET /:id/likes
查询对象的喜好(更准确地说,是喜欢该对象的用户)POST /:id/likes
喜欢某事(代表经过身份验证的用户;不需要请求正文)DELETE /:id/likes
与某事不同(代表经过身份验证的用户)
查询和创建是有意义的,但DELETE
有点“unRESTful”,因为您实际上并没有删除/:id/likes
资源(喜欢该对象的用户数组)。
这种差异在另一种情况 [ 2 ] 中表现出来:
GET /me/likes/:id
询问你是否喜欢某事
因此,查询您的连接是查询与创建或删除它完全不同的资源。
GitHub倾向于/me/likes/:id
关注用户和主演repos [ 3 ] 的风格:
(请注意,GitHub/user
代表经过身份验证的用户,如 Facebook 的/me
。)
GET /user/starred/:owner/:repo
用于查询你是否有一个 repo 加星标(返回 204 或 404,没有正文)PUT /user/starred/:owner/:repo
为 repo 加注星标(请求中不需要正文)DELETE /user/starred/:owner/:repo
取消标记回购
这更加一致,但不幸的是,这将单个“星”与组分开:
GET /repos/:owner/:repo/stargazers
查询已为 repo 加注星标的用户
有趣的是,GitHub使用了不同的风格来给要点[ 4 ] 加注:
GET /gists/:id/star
用于查询您是否有一个要点PUT /gists/:id/star
主演一个要点DELETE /gists/:id/star
取消要点
这将使用 gist 资源(如 Facebook)而不是用户资源来保持主演动作。
GitHub 没有公开公开gists 的观星者,但大概是这样的:
GET /gists/:id/stargazers
查询已加注星标的用户
虽然“stargazers”确实是与“star”不同的资源/名称,但名称相似且明显相关,并且它们都在同一资源上。
我能想到的唯一缺点是命名资源。类似的东西star
有效,但类似follow
或的行为like
更棘手。
(不必费心将 Twitter API 作为示例,因为它几乎不是 RESTful。)
显然没有完美的 RESTful API 可用于创建/查询/删除不合适的资源,但是还有其他我没有看到的优点/缺点,或者需要考虑其他样式吗?
谢谢!