HATEOAS(REST架构)的实际例子

141

众所周知,在野外有很多虚假/基本的REST-API(它们实现了HTTP-API并将其称为REST,而不遵循超文本作为应用程序状态引擎的要求,这导致了Roy T. Fielding的著名抨击, 他是最早规定REST范例的人)。

我无法找到任何实际的超文本驱动REST实现示例,以及与状态转换相关的应用程序特定媒体类型定义。

是否有任何公开可访问的此类实现示例?


3
许多人声称REST很“简单”,但Fielding本人表示,虽然REST是一种简单的架构,但用它设计应用程序并不简单。我认为这很有趣。 - aehlke
3
顺便提一下,应该是HATEOAS而不是HATEOS,后者在谷歌搜索中效果不佳。 - David Roussel
1
http://restcookbook.com/Basics/hateoas/ - Ben
2
Paypal似乎在使用它:https://developer.paypal.com/docs/integration/direct/paypal-rest-payment-hateoas-links/ - Andrew Thaddeus Martin
Roy Fielding本人是否曾经使用HATEOAS构建过应用程序? - Geoffrey
刚刚偶然发现这个,忍不住笑了。10年过去了,每个人仍然感到困惑。Fielding的REST并不意味着它是一种更好的Web服务方式。它是对互联网架构的概括描述。你想要一个使用HATEOAS的应用程序的例子吗?那就是该死的互联网!对我们来说,它是一个平台,但对于建造它的人来说,它是一个应用程序。REST描述了互联网规模应用程序的独特需求 - 而不是你常见的Web服务。行业对REST的理解与此无关。同名,两种不同的东西。 - Filip Milovanović
5个回答

104

这篇文章 "如何点一杯咖啡" 在 InfoQ 上,虽然不是指运行代码的实现,但我很喜欢它。它将在星巴克订购咖啡的过程描述为RESTful协议。这超出了典型的“一切皆资源”的REST入门文章,着重于HATEOAS。强烈推荐。


5
《实战 REST》(Rest in Practice)一书由吉姆·韦伯(Jim Webber)、萨亚斯·帕拉斯塔蒂迪斯(Sayas Parastatidis)和伊恩·罗宾逊(Ian Robinson)合著,非常有用。 - DomreiRoam
2
这篇文章还不错,但不幸的是它所描述的API并没有严格遵循HATEOAS原则,因为它没有使用自定义媒体类型。如果所有资源都是application/xml格式,客户端如何知道如何操作(例如反序列化、解析、显示)每个资源呢?这将依赖于一些非标准的传递信息方式,比如人类可读的文档。 - ygormutti

22

关于Sun Cloud API怎么样?以下是简介:

该API假定URI空间中没有特定的结构。起点是由云服务提供商提供的标识云本身的URI。云的表示包含云中其他资源的URI,以及可以执行它们的操作的URI(例如部署和启动虚拟机)。

背景故事也可能有帮助。


2
正是这个背景故事让我开始了 HATEAOS 的道路。 - CyberFonic
3
所有的链接已经失效。 - Roeland Van Heddegem
很抱歉,kenai.com网站已关闭。 - Nick Rolando
@NickRolando,我已经更换了链接。 - Rich Apodaca
@RichApodaca,背景链接已失效。 - Vasantha Ganesh

7

Netflix基于HATEOAS的REST API包含资源链接。


2
现在状态码是404。 - naXa stands with Ukraine
1
@Will Sargent 的链接已经失效,请更新。 - Govinda Sakhare
抱歉,看起来Netflix已经将其下架并选择了其他内容。 - Will Sargent
2
仅提供链接的答案,当这些链接失效时往往不太相关。 - nyedidikeke
@nyedidikeke 这是一个链接,但对于这个上下文来说是一个答案,你只需要通过编辑帖子来修复链接! - Al-Mothafar
感谢 @Al-Mothafar,我们又有了一个有效的链接 :-) - Marcus K.

3
Sun Cloud API中的RESTfulness是否实际上在Roy的第4点中得到解决:
REST API不得定义固定的资源名称或层次结构(客户端和服务器的明显耦合)。服务器必须有自由控制其自己的命名空间。相反,允许服务器通过在媒体类型和链接关系中定义这些指令来指示客户端如何构造适当的URI,例如HTML表单和URI模板。[在这里失败意味着客户端由于带外信息(例如领域特定标准)而假定资源结构,这是面向数据的等效于RPC的功能耦合]。
例1:定义的层次结构中的固定资源名称:
从Sun Cloud API中:“……VDC的表示将包括栖息其中的Cluster的表示,这些Cluster又包括每个Cluster内的VM的表示。”
例2:带外信息,例如领域特定标准:
您必须具有wiki页面内容(带外信息),才能知道Cloud资源字段“uri”的“资源通信机制”为GET。

2
你说得对,那确实很误导人。然而,Roy 谈论的是 uri 空间中的资源名称,而不是媒体类型内容中的名称。Sun 可以随时更改用于访问集群的 URI。显然,它不能在表示中将“cluster”更改为“group”而不创建新版本的媒体类型,但它可以将 URI 更改为任何内容。 - Darrel Miller
4
我们知道Sun API使用HTTP作为其统一接口,因此客户端无需查看维基页面即可知道GET是云资源的有效动词。它可以尝试使用GET,因为它知道GET是安全的动词,也可以使用OPTIONS确定它是否可用。 - Darrel Miller

3

我知道这个问题已经被问了一段时间,但是我试图展示一个简单示例的“正确”REST API流程。我尝试遵循Roy对于REST的规则-也许可以帮助:

使用REST的API示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接