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

Is RESTful (HATEOAS ) practical for specialised clients?

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

我已经阅读了 Roy 的作品和相关论文,但我仍然无法理解如何在客户端开发中充分利用 Restful。我总是最终将状态存储在客户端或专门化 media/type 渲染。例如,相同的资源(即配置文件资源)根据上下文(即在主页、产品页面或专用配置文件页面上)呈现不同,因此告别媒体类型 -> 按需渲染代码。

我真的看不出 HATEOAS 比 API 有任何优势(在我的工作方式中),defined/auto-generated IDL(即 json hyper-模式)。

我目前的结论是,只有通用客户端(即 google)可以从 HATEOS 而不是 real-world/specialised 应用程序中受益。如果您的 API 启用了 HATEOS 而不是被描述为 IDL,那么专门的客户端开发似乎没有任何好处。

HATEOS 是一种设计理念/风格/风格,这主要是品味问题或成熟代码生成与手写代码之间的权衡 API。

HATEOS 的关键区别在于构建对 API 中其他资源的引用的方式(即,通过完整的 URL)。如果 API 响应仅包含一个 ID(而不是资源的完整 URL),这会减轻您可能遇到的大量文档负担。

但是,当您将 HATEOS 与 JSON 而不是 XML 一起使用时,您会丢失一些其他上下文(例如,我应该 PUTGETPOST 到这个端点?)所以如果你想为人类生成客户端或文档,你必须用一些其他类型的元数据来补充它。

根据我的经验,与假设客户端使用生成的代码的 WSDL 或 IDL 相比,HATEOS APIs 更容易让人们使用简单的 REST 客户端(例如 cURL)永远不会直接接触 API。

权衡

那么为什么你会选择 HATEOS 与 WSDL 或其他一些生成的选项?

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

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

很可能生成的 API 客户端不会遵循任何给定语言的惯用风格,而且代码通常很丑陋。如果这些事情对您很重要,那么您可能会希望有人来编写客户端代码。如果您不关心这个,那么您可以停止阅读 HATEOS 并改用 WSDL 或类似方法。

如果你想要优化人类消费API,但是,HATEOS成功了,因为它传达了上下文 向人类提供信息,这使得在没有大量 API 文档的情况下编写客户端变得更加容易。

例子

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

虽然 HATEOAS 确实为您提供了 URI 灵活性和流的人类发现,但真正的好处是将其用作资源编码 state

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

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

这意味着确定哪些转换有效的逻辑保留在服务器端 - 客户端可以根据关联的 rel link 是否存在来选择隐藏或禁用 [​​=32=] 选项。

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

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