类 RESTful API 架构设计解析:从 Hypermedia 到 HATEOAS

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 的设计思想主要包括以下几个方面:

  1. 表现层状态转换:Hypermedia 通过面向资源的 URL 映射,使客户端能够直接获取操作资源的 URI。同时,Hypermedia 可以通过响应头、状态码、链接等等多种方式体现服务端与客户端之间的状态转换;

  2. 表示独立性:Hypermedia 设计的目的是为了达到元数据为客户端提供服务,而隔离其架构的内部实现细节。这样的设计体系使得客户端能够更为独立地执行关于API的操作;

  3. 组件可插拔性: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


猜你喜欢

  • Jest 测试组件时的 Error: Uncaught TypeError: Cannot read property 'mock' of undefined 错误解决方法

    在使用 Jest 进行前端组件测试时,有些情况下我们可能会遇到如下错误: -------- ---------- ------ ---- -------- ------ -- ---------这个错...

    1 年前
  • 必须掌握的 Promise 错误处理技巧

    Promise 是前端开发中常用的解决异步编程问题的工具,它可以让程序更加优雅和可读。但是在使用 Promise 时,也可能会遇到错误和异常情况,如果处理不当,会导致程序崩溃或出现不可预知的问题。

    1 年前
  • 如何在 Flexbox 布局下实现换行对齐

    背景 在网页开发中,我们经常需要使用到 Flexbox 布局。Flexbox 是一种简单、灵活的 CSS 布局方案,能够更加高效地完成水平或垂直方向的排列。但是,当我们需要对 Flexbox 中的子元...

    1 年前
  • PWA 技术方案综述

    PWA(Progressive Web App)是一种新型的 Web 应用程序,它结合了 Web 和 Native 应用程序的优点,可以实现类似原生应用的离线访问、快速响应、安全性及可发现性等特点,是...

    1 年前
  • 如何使用 PM2 让 Node.js 应用在后台长时间运行?

    随着 Node.js 技术的发展,越来越多的企业和开发者开始使用 Node.js 构建应用程序。然而,长时间运行 Node.js 应用程序并不是一件容易的事情。这时候,PM2 就成为了一个非常好的解决...

    1 年前
  • Deno 中如何进行网络代理

    前言 Deno 是一个新型的 JavaScript 和 TypeScript 运行时环境,它的设计目标是为了更加安全、更加稳定。网络代理是很多应用场景必须的功能,比如在通过 Deno 进行爬虫时,可能...

    1 年前
  • 使用 Hapi 框架构建实时聊天应用程序

    随着现代社交媒体的兴起,人们对实时聊天应用程序的需求越来越高。在这个过程中,前端开发人员需要遵循各种标准和协议来实现这些应用程序。无论是用于即时通讯还是直播流,实时性都是最重要的问题。

    1 年前
  • 开放平台无障碍设计 - 思路与实现

    前言 在当今数字时代,开放平台已经成为了各类企业与用户交流的桥梁。然而,在设计的过程中,我们不能忽略部分用户因为生理或心理的原因对网站、App等平台存在的不可预期的使用障碍。

    1 年前
  • 使用 Custom Elements 时遇到 “Uncaught ReferenceError: HTMLElement is not defined” 该怎么办?

    随着 Web 技术的不断进步,Custom Elements 也被越来越多的前端开发人员所应用。它是一种可以自定义 HTML 元素的技术,并且具有良好的复用性,但有时候在使用 Custom Eleme...

    1 年前
  • ECMAScript 2021 (ES12) 中的 WeakRef,快速解决内存泄露问题

    随着前端技术的不断更新,前端开发遇到的问题也越来越复杂和多样化。其中,内存泄露是前端开发者经常面对的一个问题。尤其是对于开发一些大型应用程序的开发者来说,内存泄露更加严重。

    1 年前
  • 使用 Mocha 进行 Mock 数据的测试

    在前端开发中,使用 Mock 数据进行测试是一个不可忽视的环节。通过 Mock 数据测试,我们可以测试前端代码在不同数据场景下的表现,发现潜在的问题并进行排查。在本文中,我们将介绍如何使用 Mocha...

    1 年前
  • 利用 ECMAScript 2018 中的 Map 与 Set 数据结构进行高效处理

    在前端开发中,我们经常需要对数据进行处理,比如筛选、过滤、排序等等。为了更高效地处理数据,我们可以使用 ECMAScript 2018 中新增的 Map 和 Set 数据结构。

    1 年前
  • Tailwind 中 Flexbox 垂直居中的实现方法

    前言 在前端开发过程中,居中是一个经常遇到的问题。虽然可以通过表格、绝对定位等方式实现,但这些方法都有其局限性和复杂度,特别是在响应式设计中。因此,使用 Flexbox 进行居中处理是目前前端开发中更...

    1 年前
  • Next.js 开发的常用工具库及其使用

    前言 Next.js 是一个由 Vercel 开发的 React 应用程序框架,它提供了许多工具和服务,使得构建现代的 Web 应用程序变得更加容易和高效。因为 Next.js 具有出色的 SSR(...

    1 年前
  • Docker 容器内无法访问外部网络的解决方法

    背景 Docker 是一个广泛使用的容器化技术,可以让应用程序在不同的操作系统上运行。在 Docker 中,每个容器都是一种独立的运行环境,具有自己的网络设置和配置。

    1 年前
  • TypeScript 中如何正确处理异常

    前端开发中,处理异常是非常重要的一环。异常处理能够帮助我们更好地调试程序,提高代码的健壮性和可维护性。在 TypeScript 中,异常处理也是一个必须掌握的技能。

    1 年前
  • 如何在 Mongoose 中实现数据库数据迁移

    在开发过程中,经常需要对数据库进行数据迁移以满足不同的业务需求。而在使用 Mongoose 进行开发时,如何进行数据库数据迁移呢? 数据迁移的定义与实现 数据迁移的定义 数据迁移是指将一个数据库系统中...

    1 年前
  • 如何使用 Socket.io 实现实时定位系统

    在现代的 Web 应用中,实时性已经成为了一个重要的需求。例如,在实时协作和定位系统中,位置信息的实时获取和共享往往是必要的。Socket.io 是一个流行的实时通讯库,它提供了跨浏览器的实时 Web...

    1 年前
  • CSS Grid 布局:实现排版、长度、高度、跨度和列表

    前言 作为前端开发人员,我们一定都遇到过这样的问题:如何实现网页的布局?从早期的 table 布局到后来的专用 CSS 框架,每一次技术突破,都让我们的布局方式更加优秀。

    1 年前
  • ES6 中的 Class 语法糖和 this 指向问题

    在 ES6 版本中,加入了 Class 语法糖,它可以让我们更加快捷地构建 JS 类和对象。但是在使用 Class 语法糖时,我们也容易遇到 this 指向问题。 Class 语法糖的基本用法 Cla...

    1 年前

相关推荐

    暂无文章