在 REST API 中使用 LINK 和 UNLINK HTTP 动词

Posted

技术标签:

【中文标题】在 REST API 中使用 LINK 和 UNLINK HTTP 动词【英文标题】:Using LINK and UNLINK HTTP verbs in a REST API 【发布时间】:2012-08-28 04:30:24 【问题描述】:

我目前正在实施一个 REST API。我有一个资源模型,其中包含各个资源之间的大量关系。

我的问题是:如何以 RESTful 方式将两个现有资源相互链接(建立关系)?

我遇到的一个解决方案是使用 LINK 和 UNLINK HTTP 动词。 API 使用者将能够使用 LINK 和以下 URI 链接两个资源:/resource1/:id1/resource2/:id2。

此解决方案的问题是缺乏对 LINK 和 UNLINK 动词的支持。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 或 http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol 都没有提到动词,它们似乎在很大程度上被“遗忘”了。但是,原始 RFC 2068 确实声明它们存在。

我真的很喜欢这个解决方案。但是,由于缺乏对 LINK/UNLINK 的支持,恐怕许多 API 消费者/客户端将无法处理该解决方案。这是一个可接受的解决方案,还是有更好和/或更优雅的解决方案来链接 RESTful API 中的现有资源?

谢谢

【问题讨论】:

为什么不创建一个链接资源来链接这两个资源呢? 这是我正在考虑的另一种解决方案(在SO question 中几乎处理了它。但是,问题是对于每种类型的关系,您都必须定义一个新的资源(类型)。这过于复杂资源模型并且不是特别实用(因为您的 API 使用者必须了解更多类型的资源)。LINK/UNLINK 并没有使它过于复杂:建立关系是非常可预测的,因此更易于使用。但是,如果几乎不支持 LINK/UNLINK... 【参考方案1】:

我在我的(定制的,公司内部的)网络应用程序中使用 LINKUNLINK。我使用https://datatracker.ietf.org/doc/html/draft-snell-link-method 作为我的实现参考。

我发现有三种类型的客户:

    仅支持 GETPOST 的那些,从 HTML 的 <form> 元素中获取线索。 仅支持GETPUTPOSTDELETE 的那些。这些从 CRUD 和 RPC-pretending-to-be-REST 类型的 API 中获取线索。 允许任何方法的那些。 PATCH 作为官方 RFC 的发布增加了这些数量,WebDAV 的增长也是如此,尽管有时第 2 类客户端也支持 PATCH

由于我们目前在内部开发我们的客户端,所以我们没有这个问题,但我已经研究过了,并且在定义我的 API 之前确实考虑了利弊,以防我们确实想要允许第三方客户端。我的解决方案(因为无论如何我们都需要支持没有 javascript 的 HTML 客户端)是允许 POST 通过提供 _METHOD 字段(application/x-www-form-urlencoded)来覆盖该方法,然后在后端手掌上使用我的 post() 函数关闭到预期 HTTP 方法的适当函数。这样,未来的任何客户端,比如上面的第 2 类,都可以使用PUTDELETE,但将PATCHLINKUNLINK 包装在POST 请求中。您可以两全其美:来自支持它的客户端的丰富方法,但仍然通过 POST 隧道支持低质量的客户端。

【讨论】:

我完全同意这个答案。我最终在 9 月份就以这种方式实施了它,我很高兴其他人也得出了同样的结论。谢谢!

以上是关于在 REST API 中使用 LINK 和 UNLINK HTTP 动词的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Firebase Dynamic Link Analytics Rest API (NodeJS) 获取正确的访问令牌

从 REST API 获取的 Vuex 渲染数据

REST API 设计:请求特定参数

无法在 wordpress REST api 上设置 OAuth

需要在unix中格式化两个unl文件

使用 WP-API 节点模块时如何限制返回的 Wordpress REST-API 字段