我目前正在阅读《实践中的Rest》这本书。我无法理解以下术语:超媒体、超媒体格式、超媒体控制和领域应用协议。作者建议需要针对特定领域的超媒体格式,但我几乎无法理解这些内容。我尝试在Google上搜索这些术语,但没有找到正确的答案。有人能解释一下这些术语以及为什么我们需要针对特定领域的超媒体格式而不是application/xml吗?
我目前正在阅读《实践中的Rest》这本书。我无法理解以下术语:超媒体、超媒体格式、超媒体控制和领域应用协议。作者建议需要针对特定领域的超媒体格式,但我几乎无法理解这些内容。我尝试在Google上搜索这些术语,但没有找到正确的答案。有人能解释一下这些术语以及为什么我们需要针对特定领域的超媒体格式而不是application/xml吗?
由于大多数自称为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
这样的通用媒体类型只告诉客户端如何解析数据格式,而不会提供有关解析器提取的信息。例如,假设文档具有媒体类型application/vnd.mycompany.user.v1+xml
,客户端知道它是XML格式的用户资源的版本1.0表示。如果您通过添加或删除属性、链接等更改资源,则可以更改版本号,客户端不会中断,因为它们可以通过使用Accept
标头请求其实现的版本。您还可以为同一资源提供多种格式,例如XML或JSON,甚至可以提供漂亮的HTML人类可读表示。
当您将底层协议HTTP、超媒体格式和媒体类型定义的协议契约整合到一起时,就拥有了您的领域应用协议,这是应用程序广告发布的全部资源和可用状态转换的集合。
不用说,你会在互联网上找到99%的所谓REST API都没有遵循所有这些。它们中的大多数只是遵循了一些REST约束的HTTP API,有时是因为它们实际上不需要所有这些,有时是因为开发人员认为REST就是这样。
超媒体(Hypermedia)= 客户端和服务器使用某种统一的表示方式进行通信,例如超链接。
超媒体控制(Hypermedia Control)= 对资源进行操作。例如,产品通过超链接 domain/product/001 进行表示,则可以通过超媒体控制 domain/product/001/edit 和 domain/product/001/delete 进行资源操作(编辑和删除)。
最大的区别在于方法。过程式系统首先将操作作为状态转换编写在顺序代码(Java等)中,然后通过超链接来实现 HATEOAS 交互。而交互式系统直接建模交互并直接提供超链接。这里有一个示例http://www.masterkube.com/hateoas_technology.html。
希望有所帮助。