API 是应用编程接口的缩写,是现代软件应用中的核心。而在Web API 的设计中,RESTful 的风格越来越受到重视。在RESTful API 的架构设计中,Hypermedia 及 HATEOAS 规范成为了越来越多的关注点和讨论的焦点。
本文将从 Hypermedia 到 HATEOAS 这一演变过程开始,介绍 RESTful API 架构的基本架构、Hypermedia 及其在架构设计上的应用、HATEOAS 规范的概念、架构设计中 HATEOAS 的应用、最后给出一个示例代码,让读者更加深入地理解 RESTful API 架构的实现和应用。
Hypermedia
Hypermedia 旨在让应用成为更为独立的子系统之间有机互动的组件。在 Hypermedia 设计中,系统内的任意一项构件都可以使用其表达能力建立起超媒体的链接。Hypermedia 使不同层次的应用及代码间实现高度自由组合成为可能。
在 RESTful API 架构设计中,Hypermedia 大量应用到其整体架构中。在架构设计中,多种 Hypermedia 标准及规范被应用到设计中,而其中 HAL( Hypertext Application Language)、Siren、JSON API 等为较为常见的标准。
Hypermedia 的设计思想主要包括以下几个方面:
表现层状态转换:Hypermedia 通过面向资源的 URL 映射,使客户端能够直接获取操作资源的 URI。同时,Hypermedia 可以通过响应头、状态码、链接等等多种方式体现服务端与客户端之间的状态转换;
表示独立性:Hypermedia 设计的目的是为了达到元数据为客户端提供服务,而隔离其架构的内部实现细节。这样的设计体系使得客户端能够更为独立地执行关于API的操作;
组件可插拔性:Hypermidea 通过超媒体链接的设计,使得客户端可以更为灵活地修改、扩展该架构的单一组件而不影响整体的架构结构。Hypermedia 最终达到模块化设计的目的。
HATEOAS
HATEOAS( Hypermedia as the Engine of Application State) 是 RESTful API 的另一个核心技术,它主要是为了促进系统之间的高度互操作性。
如本文头部所提到的,RESTful API 架构的核心思维是按照 REST 原则来实现的。而其中 REST 架构中最重要的一项原则就是 HATEOAS。
通过使用 HATEOAS,在 RESTful 应用中服务即资源对、请求即对资源的操作。而且,利用 HATEOAS 时,客户端可以从服务端接收由超媒体链接驱动的表述语言并基于这些超媒体链接来发现和使用服务端所公开的服务。因此,客户端用户不需要提前知道所有的服务资源,机制使得用户通过这些超媒体链接进行服务的访问和使用。
以下是使用HAL JSON 格式实现 HATEOAS 的示例:
-- -------------------- ---- ------- - --------- - ------- -------- ----------- ------- -------- ------------------ ------- -------- --------------- ------------ ----- -- ---------------------- --- --------------- --- -- ----- -------------- --- -
上面的示例中,order 资源作为 response 的主要部分被返回,而它的超媒体链接被包含在 JSON 中,而这样的设计会要求客户端对服务端返回 JSON 的超媒体链接进行解析和处理,从而达到拓展 API 的目的。使用 HATEOAS 设计时,客户端无需处理服务端资源的操作详情,只需要处理所获得的链接,这样即可随时更改和更新API,由此保证 RESTful API 的扩展性和与时间记忆的特性。
Hypermedia 和 HATEOAS 项目举例
在前两节我们学习了 Hypermedia 和 HATEOAS 两个重要的 RESTful API 中的概念。在这一节中,我们将结合一个示例项目来演示如何应用 Hypermedia 和 HATEOAS 到实际的项目中。
这个项目是一个模拟“博客网站”的轻量级应用程序。这个应用程序由下面三个类组成:
Article
- 表示网站上发布的文章。Author
- 博客作者,与文章有联系。一个博客作者会发布许多文章。Home
- 应用程序的主页。
在这个项目中,每个类都有一个使用 Hypermedia 的 Link
类型的 links
属性。使用 Link
类型的属性来定义了领域对象的相关资源和操作,并且需要遵循 HATEOAS 的规则。下面是这个示例项目的代码:
-- -------------------- ---- ------- ----- ------- - ------------- - ----------- - - ----- ------ ------------- -------- ------ ------------------------- ---------- ----- -- -- - ----- ------ - ------------- - ----------- - - ----- ------ ------------ --------- ------ ------------------------- ---------- ------ -------- ------ ------------------------ ---------- ----- -- -- - ----- ---- - ------------- - ----------- - - ----- ------ ----- --------- ------ ------------- -------- ------ ------------ -- -- -
在这个示例中,类之间的交互都是通过链接实现的。这意味着一个类是如何与 URL 相关联的,以及一个链接会返回哪些数据都有明确规定。
在这个样例中,我们可以发现 Article
类有一个 “authors” 链接,它在 URL 中包含变量。这个链接的目的是让客户端知道哪些作者与这篇文章有关系。这里涉及到一个概念,即 “链接模板”,它是包含 URI 模板的链接。
总结
从 Hypermedia 到 HATEOAS,我们逐渐地理解了 RESTful API 架构设计的发展演变历程,以及 Hypermedia 和 HATEOAS 在 RESTful API 架构中的应用。除此之外,我们还给出了一个中文技术文章类的示例代码,以方便读者更好地了解RESTful API 的实现和应用方法。
在实际使用 RESTful API 设计时,要谨记以下几点:
- 选择 Hypermedia 规范;
- 使用 HATEOAS 功能,提升可扩展性;
- 对资源 URI 进行模块化设计;
- 提供注释。
使用 RESTful API,可以大大提高系统的可扩展性和可重用性,在现今的软件应用开发中具有重要的意义,希望读者可以从本文中获得帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e8acbaf6b2d6eab3432391