REST HATEOAS(成熟度等级3)有多么重要?
我参与了一个项目,一些高级团队成员认为REST API必须符合HATEOAS并实施所有Richardson的成熟级别(http://martinfowler.com/articles/richardsonMaturityModel.html)!
AFAIK大多数REST实现不符合HATEOAS标准,应该有更多人不这样做的充分理由。 我可以想到像增加复杂性,缺乏框架(服务器和客户端),性能问题和...
你怎么看? 你有没有使用HATEOAS在真实世界项目中的经验?
REST社区中没有人说REST很容易。 HATEOAS只是增加REST架构难度的一个方面。
人们不会因为你所建议的所有原因去做HATEOAS:这很困难。 它增加了服务器端和客户端的复杂性(如果你真的想从中受益)。
但是,数十亿人今天体验到了REST的好处。 你知道亚马逊的“结账”URL吗? 我不。 然而,我可以每天结账。 该URL是否已更改? 我不知道,我不在乎。
你知道吗? 任何写过屏幕的人都会刮掉亚马逊的自动客户端。 有人可能会苦苦地嗅探网络流量,阅读HTML页面等,以找出什么时候连接什么链接以及使用何种有效载荷。
只要亚马逊改变了他们的内部流程和网址结构,这些硬编码客户端就失败了 - 因为链接断了。
然而,这些休闲网络冲浪者却能够整天购物,而且几乎没有阻碍。
这是REST的行动,它只是增强了人类能够解释和直观的基于文本的界面,用购物车识别一个小图形,并将其实际上意味着什么。
大多数编写软件的人不这样做。 大多数写自动化客户的人都不在乎。 大多数人发现,当他们突破时,修复他们的客户更容易,而不是首先设计应用程序。 大多数人根本没有足够的客户。
如果您正在编写一个内部API以在两个系统之间进行通信,并在专业技术支持和IT两方面进行交流,谁能够快速,可靠地与变更时间进行沟通变化,那么REST不会向您购买任何东西。 你不需要它,你的应用程序不够大,而且它的寿命不够长。
拥有大量用户群的大型网站确实存在这个问题。 他们不能要求人们在与他们的系统交互时随意改变他们的客户代码。 服务器开发进度与客户开发进度不一样。 对API的突然更改对每个参与者都是不可接受的,因为它会干扰双方的流量和操作。
因此,像这样的操作很可能会从HATEOAS中受益,因为它更容易版本化,老年客户更容易迁移,更容易向后兼容。
一个将其大部分工作流委派给服务器的客户端,对服务器更改的操作比对不支持的客户端更强健。
但大多数人不需要这种灵活性。 他们正在为2个或3个部门编写服务器代码,这都是内部使用。 如果它坏了,他们会修复它,并且他们已经考虑到了它们的正常运行。
无论是来自REST还是其他任何东西,灵活性都会增加复杂性。 如果你想要简单,快速,那么你就不会变得灵活,你“只是做”而已。 当你添加抽象和解引用到系统时,东西变得更加困难,更多的锅炉板,更多的代码来测试。
大多数REST不符合“你不需要它”的要点。 当然,直到你做。
如果你需要它,然后使用它,并使用它,因为它的布局。 REST不会通过HTTP来回推送内容。 它从来没有,它比这更高。
但是当你确实需要REST,并且你使用REST时,那么HATEOAS就是必需的。 它是软件包的一部分,也是使它工作的关键。
是的,我在API中使用了超媒体的一些经验。 以下是一些好处:
可开发的API:这可能听起来微不足道,但不要低估可探索API的力量。 浏览数据的能力使客户开发人员更容易构建API及其数据结构的心智模型。
内联文档:使用URL作为链接关系可以将客户端开发人员指向文档。
简单的客户端逻辑:简单地跟踪URL而不是自己构建它的客户端应该更容易实现和维护。
服务器接受URL结构的所有权:超媒体的使用移除了客户端对服务器使用的URL结构的硬编码知识。
将内容加载到其他服务中:将内容卸载到其他服务器(例如CDN)时,需要使用超媒体。
使用链接进行版本控制:超媒体有助于版本化API。
相同服务的多种实现:当同一服务的多个实现存在时(并且一个客户端需要访问多个实例),超媒体是必需的。
你可以在这里找到这些重点的深入解释:http://soabits.blogspot.no/2013/12/selling-benefits-of-hypermedia.html
(这里有一个类似的问题:https://softwareengineering.stackexchange.com/questions/149124/what-is-the-benefit-of-hypermedia-hateoas我已经给出了相同的解释)
我认为一个API可以被称为RESTful,即使应用程序的客户端不遵循HATEOAS原则。 在大多数情况下,客户必须违反HATEOAS才能满足可用性要求。 让我解释。
HATEOAS不仅对应用程序的服务器端进行约束,而且还在客户端进行约束。 客户端不应该假定资源具有超出媒体类型定义的结构的特定结构。 服务器应该提供支持这种客户端的API。
现在,假设我们已经实现了这一点。 应用程序的客户端现在非常通用,但最有可能的是,用户体验很糟糕,因为如果没有任何关于资源语义的知识,就无法调整资源的表示以反映这些语义。 如果资源'car'和资源'house'具有相同的媒体类型(例如application / json),那么它们将以相同的方式呈现给用户,例如属性表(名称/值对)。
但是好的,我们的API真的很RESTful。
现在,假设我们在此API之上构建第二个客户端应用程序。 这第二个客户违反了HATEOAS的想法并且有关于资源的硬编码信息。 它以不同的方式显示汽车和房屋。
API仍然可以被称为RESTful吗? 我想是这样。 它的一个客户违反了HATEOAS并不是API的错。
我建议构建RESTful API,即理论上可以实现通用客户端的API,但在大多数情况下,为了满足需求,您需要一些关于客户端资源的硬编码信息。 尽管如此,尽可能少地使用硬编码来减少客户端和服务器之间的依赖关系。
我在我的REST实现模式中包含了一个名为JAREST的HATEOAS部分。
链接地址: http://www.djcxy.com/p/41021.html上一篇: How useful/important is REST HATEOAS ( maturity level 3)?
下一篇: Would this RESTful JSON response format be compliant with HATEOAS?