将 HATEOAS 用于 RPC 样式的命令是不是是 RESTful

Posted

技术标签:

【中文标题】将 HATEOAS 用于 RPC 样式的命令是不是是 RESTful【英文标题】:Is it RESTful to use HATEOAS for commands in RPC style将 HATEOAS 用于 RPC 样式的命令是否是 RESTful 【发布时间】:2020-07-30 18:07:53 【问题描述】:

在 REST 中,资源由其 URI 标识,允许的操作仅限于可用的 HTTP 动词。 RESTfull API 是一个统一的接口,通过 HTTP 为资源提供基本的 CRUD 操作。

最后,REST 架构规定资源应包含超链接,以供客户端进一步遍历 API。这称为 HATEOAS(超文本作为应用程序状态的引擎)。超链接将客户端代码与接口实现细节分离。

使用 HATEOAS 链接以 RPC 样式传递针对资源的命令式命令是 RESTful 吗?我认为这不会破坏统一界面,因为链接中提供了所有信息。考虑以下示例,其中操作不适合 HTTP 动词。

GET /foo/1

id: 1, foo: "foo", links: self: "/foo/1", doAction: "/foo/1/do-action"

POST /foo/1/do-action

或者我应该只使用请求参数将命令信息传递给资源端点,还是将命令建模为它自己的资源?

【问题讨论】:

RESTfull API 是一个提供基本 CRUD 操作的统一接口 只是一个注释。 REST API 提供统一的接口。而已。无需将统一接口限制为 CRUD。 【参考方案1】:

使用 HATEOAS 链接以 RPC 样式传递针对资源的命令式命令是 RESTful 吗?

REST 是一种架构风格;如果您想了解它是如何工作的,您应该在使用该样式创建的应用程序中寻找类似物。对于 REST,这些应用程序中最著名的是万维网。

因此,您的问题的答案来自于考虑您的情况与在网络上实现有用的工作有多接近;也就是说,通过超链接导航,直到找到正确的表单,填写数据,然后提交。

 
    id: 1,
    foo: "foo",
    links: 
        self: "/foo/1",
        doAction: "/foo/1/do-action" 
    

所以,从 REST 的角度来看,问题变成了“通用组件如何知道如何处理 doAction?”

在网络上,我们有一个通用的表单标准,因此表单的超媒体表示带有客户端为请求创建正确有效负载所需的信息。

在AtomPub 中,标准定义了各种文档中链接关系的语义,因此任何通用原子客户端都知道如何解释响应中包含的数据。

(从某种意义上说,Atom 中链接关系的定义很像 html 中的 A 和 FORM 的定义,都是通用的)。

因此,在您的上下文中,提示“doAction”应该通知客户可以完成的有趣事情(在此处发布猫视频)。 target uri 对客户端来说并不重要;它应该只是在被告知的地方发送请求。

这里的target-uri的拼写无关紧要;但需要考虑的一个有趣案例是,当目标 uri 与您在其他地方使用的相同时,就会发生这种情况,例如:

 
    id: 1,
    foo: "foo",
    links: 
        self: "/foo/1",
        doAction: "/foo/1" 
    

HTTP 在标准中内置了简单的cache-invalidation semantics;实际上,doAction 的目标告诉客户端,当操作成功时,哪个缓存表示将失效。

【讨论】:

以上是关于将 HATEOAS 用于 RPC 样式的命令是不是是 RESTful的主要内容,如果未能解决你的问题,请参考以下文章

Introduction of RESTful level & HATEOAS

Restful levels&HATEOAS

RESTful level & HATEOAS

链接是不是应该包含 HateOAS 中的身份验证令牌?

REST 可发现性和 HATEOAS 是不是意味着您可以更改 URI?

强制spring hateoas生成https链接而不是http