我目前正在阅读“实践中的休息”一书。我无法理解以下术语超媒体、超媒体格式、超媒体控件、域应用程序协议。作者建议需要特定领域的超媒体格式。我几乎无法理解那些。我用谷歌搜索了这些术语,但找不到正确的答案。谁能解释这些术语以及为什么我们需要特定领域的超媒体格式而不是 application/xml ?
2 回答
对此有很多困惑,因为大多数自称为 REST 的应用程序不使用超媒体,而且根本不是 REST。
超媒体是对 HTML 以外内容的超文本的概括。你可以说超文本是超媒体的一个子集。超媒体可以是浏览器中的 HTML,包含所有链接、按钮和呈现的所有内容,以便您可以浏览网站,或者它可以是旨在由自动客户端解析的 XML 或 JSON 文档,该客户端还将跟踪链接和操作,例如人类会使用浏览器,点击呈现的链接和按钮。
HATEOAS意味着客户端与 REST 应用程序的交互必须由超媒体驱动,或者简单地说,客户端应该通过跟踪资源本身表示中的链接来获取它需要的每个资源的所有 URI,而不是依赖于输出。带外信息,如文档中给出的 URI 模式,就像许多 API 所做的那样。
这比听起来简单。它只是意味着客户端和 REST 应用程序之间的交互应该与人类浏览网站完全一样。以 Stack Overflow 本身为例。有用户,问题和答案。当您想查看您的问题列表时,您无需访问文档网站,获取用于列出您的问题的 URI 模板,用您的用户 ID 填充占位符并将其粘贴到您的浏览器上。您只需单击另一个文档的链接,该文档描述为问题列表,您甚至都不关心确切的 URI 是什么。这就是 HATEOAS 在实践中的含义。
超媒体形式定义了客户端和服务器之间的契约。它是您用于超媒体应用程序中资源的特定表示的启用超链接的数据格式。例如,如果您有一个用户资源,您必须记录客户应该从该资源的表示中获得什么以及如何解析表示以提取信息。在与您的 API 交互之前,您的客户端需要实现一个解析器来提取信息,他们需要知道资源具有哪些属性以及它们的含义、他们应该期望哪些链接关系以及可用的状态转换等。
超媒体控件是一种超媒体格式的协议方法和链接关系的组合,它告诉客户端哪些状态转换可用以及如何执行它们。例如,一个问题可能有一个rel=post_answer
链接,该链接需要一个答案表示作为 POST 方法的有效负载,并将创建一个与之相关的新答案资源。
一旦定义了一组超媒体格式,您就需要一种特定于域的媒体类型来准确确定用于特定交互的超媒体格式。像这样的通用媒体类型application/xml
只告诉客户端如何解析数据格式,它没有说明解析器提取的信息。例如,假设一个文档具有 media-type application/vnd.mycompany.user.v1+xml
,客户端知道它是 XML 格式的 User 资源的 1.0 版表示。如果您通过添加或删除属性、链接等来更改资源,您可以更改版本号并且客户端不会中断,因为他们可以通过使用Accept
标题。您还可以为同一资源提供多种格式,例如 XML 或 JSON,甚至是 HTML 中非常易于人类阅读的表示形式。
当您将所有内容包装在一起时——底层协议 HTTP;由超媒体格式和媒体类型定义的契约——你有你的域应用协议,它是你的应用程序所宣传的一整套资源和可用状态转换。
不用说,互联网上 99% 的所谓 REST API 并不遵循所有这些。它们中的大多数只是遵循一些 REST 约束的 HTTP API,有时是因为它们并不真正需要所有这些约束,有时是因为开发人员认为 REST 就是这样。
超媒体 = 客户端和服务器以某种统一的表示形式进行交谈的事实,例如:超链接。
超媒体控制 = 需要对资源进行操作。例如,一个产品由超链接 domain/product/001 表示,然后可以通过超媒体控制 domain/product/001/edit 和 domain/product/001/delete 对资源进行操作(编辑和删除)。
最大的区别在于方法。程序系统首先将操作编写为顺序代码(java 等)中的状态转换,然后将交互作为超链接制造以提供 HATEOAS。
但是作为交互的系统直接模拟交互,因此直接提供超链接。一个示例示例是http://www.masterkube.com/hateoas_technology.html在这里。
希望这可以帮助。