RESTful(HATEOAS)对专业客户实用吗?

RESTful(HATEOAS)对专业客户实用吗?,rest,restful-architecture,hateoas,Rest,Restful Architecture,Hateoas,是否有一个概念验证客户端(即web应用程序)代表使用RESTful原则实现并利用RESTful原则实现的真实世界应用程序? 我所能找到的只是API浏览器,但实际应用程序(即社交网络或电子商务网站)的开发是完全不同的 我读过Roy的工作和相关论文,但我仍然无法理解如何在客户端开发中充分利用Restful。我总是在客户端上存储状态,或者专门处理媒体/类型渲染。例如,相同的资源(即配置文件资源)根据上下文(即在主页、产品页面或专用配置文件页面上)呈现不同,因此“媒体类型->按需编码呈现” 我真的看不出

是否有一个概念验证客户端(即web应用程序)代表使用RESTful原则实现并利用RESTful原则实现的真实世界应用程序? 我所能找到的只是API浏览器,但实际应用程序(即社交网络或电子商务网站)的开发是完全不同的

我读过Roy的工作和相关论文,但我仍然无法理解如何在客户端开发中充分利用Restful。我总是在客户端上存储状态,或者专门处理媒体/类型渲染。例如,相同的资源(即配置文件资源)根据上下文(即在主页、产品页面或专用配置文件页面上)呈现不同,因此“媒体类型->按需编码呈现”

我真的看不出HATEOAS相对于定义良好/自动生成的API(即json超模式)有什么优势(在我的工作方式上)


我目前的结论是,只有普通客户(即谷歌)才能从HATEOS中受益,而不是真实世界/专业应用程序。如果您的API启用了HATEOS而不是被描述,那么专业化的客户端开发似乎不会带来任何好处。

HATEOS是一种设计理念/风格/风格,这在很大程度上是一个品味问题,或者是一个完整的代码生成和手工编写的API之间的折衷

HATEOS的关键区别在于对API中其他资源的引用的构造方式(即通过完整URL)。如果API响应只包含一个ID(而不是资源的完整URL),那么这就消除了很多文档负担,否则您可能会遇到这些负担

然而,当您将HATEOS与JSON而不是XML一起使用时,您会丢失一些其他上下文(例如,我应该
获取
发布到该端点吗?),因此,如果您想生成客户机或人类文档,您必须使用其他类型的元数据来补充这一点

根据我的经验,与WSDL或IDL相比,HATEOS API更容易使用简单的REST客户机(例如cURL),后者假定客户机正在使用生成的代码,并且永远不会直接接触API

权衡

那么,为什么要选择HATEOS vs WSDL或其他生成的选项呢

API的基本假设(这并不总是正确的)是,它们将有多种风格的客户机/消费者,可能用不同的语言实现。这意味着随着时间的推移,编写和更新客户机比编写服务要复杂得多

如果您或您的企业打算自己维护API客户机,那么在为所有客户机(WSDL、SWIG等)生成代码或雇佣特定语言的开发人员来维护一个客户机之间存在成本权衡

生成的API客户机可能不会遵循任何给定语言的惯用风格,代码通常很难看。如果这些事情对您很重要,那么您可能需要一个人来编写客户机代码。如果您不关心这一点,那么您可以停止阅读HATEOS,转而使用WSDL或类似的方法

不过,如果您确实希望为人类使用API进行优化,HATEOS会成功,因为它将上下文信息传递给人类,这使得编写客户机更容易,而无需大量API文档

示例


有关类似HATEOS的API的示例,请查看。使用REST客户机进行浏览非常容易,一旦您了解了如何进行身份验证,您就可以通过遵循引用的数据URL找到您想要的大部分内容。您仍然需要参考文档以了解具体细节和高级用例(如发布数据),但为GitHub编写简单的客户端非常容易,无需拉入GitHub客户端库或端到端地阅读文档。

尽管HATEOAS确实为您提供了URI灵活性和流的人工发现,真正的好处是将其用作资源状态的编码

如果您有一个与资源关联的状态机,那么您将有一些允许某些状态转换的状态,而不是其他状态

通过对资源URI的操作,可以向REST客户端提供实现可能状态转换的机会—使用HATEAOS超媒体,您可以通过已知的rel链接名称定义转换,然后根据当前状态允许的转换,包括或排除rel链接

这意味着确定哪些转换有效的逻辑保留在服务器端-客户端可以根据相关的rel链接是否存在来选择隐藏或禁用UI选项

包含或排除特定rel链接的另一个原因可能与提供给当前用户的访问控制权限有关。如果不允许当前用户执行转换,只需将其排除在外


如果您没有根据资源状态和/或授权用户的状态动态地包括或排除rel链接,那么您对利弊的分析非常准确,因为您使用它们的真正原因不是它们被包括在内。毕竟,REST中的S代表state!:)

事实上,我认为情况恰恰相反。使用IDL模式作为参考编写客户机比遵循REST链接更容易,因为IDL预先为您提供了资源的描述,而无需
发现它们。根据REST原则,您可能永远不知道特定资源背后的内容,因为这取决于所提供的输入,因此是实现细节。还值得注意的是,Github API看起来不像HATEOAS(例如,只提供了一些没有语义意义的JSON)。
…真正的好处是将其用作资源状态的编码。
我真的没有期望得到令人满意的答案,但现在我明白了!)一旦你开始使用编码的资源状态,它就变得非常有价值。是的