gpt4 book ai didi

rest - 使用 REST split 头发 : Does a standard JSON REST API violate HATEOAS?

转载 作者:行者123 更新时间:2023-12-03 07:17:16 27 4
gpt4 key购买 nike

今天早上我在 REST 上读了一些书,发现了 HATEOAS principle ("hypermedia as the engine of application state") .

引用REST Wikipedia page :

Clients make state transitions only through actions that are dynamically identified within hypermedia by the server (e.g. by hyperlinks within hypertext). Except for simple fixed entry points to the application, a client does not assume that any particular actions will be available for any particular resources beyond those described in representations previously received from the server.

Roy Fielding's blog :

...if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period.

我将其理解为:客户端只能根据服务器响应正文(超文本)提供的操作来请求状态更改。

在 HTML 世界中,这是完全有道理的。客户端应该只能根据通过超文本 (HTML) 提供的链接来请求状态更改(新操作/页面)。

当资源以其他方式表示时 - 例如 JSON、XML、YAML 等。这并不那么明显。

让我们举一个“REST”JSON API 示例:

我通过发送 POST 请求来创建新资源(例如新评论)

/comments.json? # 带参数...

服务器响应:

# Headers
HTTP/1.1 201 Created
Location: http://example.com/comments/3
Content-Type: application/json; charset=utf-8
... Etc.

# Body
{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}

我知道我现在可以通过 header 中返回的 URI 访问此评论:http://example.com/comments/3.json

当我访问http://example.com/comments/3.json时我明白了:

{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}

假设 API 文档告诉我,我可以通过向同一 URI 发送 DELETE 请求来删除此评论。这在“REST”API 中相当常见。

但是:

服务器在 GET http://example.com/comments/3.json 处的响应没有告诉我任何有关通过发送 DELETE 请求来删除评论的信息。它向我展示的只是资源。

我还可以删除具有相同 URL 的评论,这是客户端通过带外信息(文档)知道的事情,而不是由服务器的响应发现和驱动的。

此处,客户端假设 DELETE 操作(以及可能的其他操作)可用于此资源,并且之前尚未从服务器接收到此信息。

我是否误解了 HATEOAS,或者我的说法是否正确,从严格意义上来说,符合上述描述的 API 不会是 REST API?

我知道 100% 遵守 REST 并不总是可能的,也不是最务实的方法。我发布这个问题纯粹是为了满足我自己对 REST 背后理论的好奇心,而不是寻求有关现实世界最佳实践的建议。

最佳答案

乔恩·摩尔给出了an excellent talk 2010 年 11 月,关于编写真正的 RESTful(即 HATEOAS 支持)API 和客户端的具体细节。在第一部分中,他认为 JSON 不是适合 REST 的媒体类型,因为它缺乏一种普遍理解的表示链接和支持的 HTTP 方法的方式。他认为,好的 ol' XHTML 实际上是完美的,因为解析它的工具(即 XPath)很容易获得,它支持表单(想想 GET 链接模板和 PUT、POST 和 DELETE 方法),并且有一种易于理解的方式识别超链接,以及主要通过在任何标准 Web 浏览器中使用 API 的能力实现的一些其他优势(减轻开发人员、QA 和支持人员的工作。)

在观看他的演讲之前,我一直提出的论点是,JSON 的带宽消耗比任何 *ML 语言(例如,Python)要低得多。 XML、HTML、XHTML。但是,通过尽可能使用简洁的 XHTML,例如相对链接而不是绝对链接(在他整个演讲中使用的示例中有所暗示,但并不那么明显),并使用 gzip 压缩,这个论点就失去了很多分量。

我意识到诸如JSON-Schema之类的努力和 other RFC 正在尝试标准化 JSON 中的内容,但与此同时,Moore 的演讲说服我尝试一下 XHTML。

关于rest - 使用 REST split 头发 : Does a standard JSON REST API violate HATEOAS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com