RESTful API 设计中的 HATEOAS

SOAP、XML-RPC、RPC 等通过在 HTTP 上运行来增加 Web 服务和远程调用的标准。但是这些技术也带来了不少问题,例如过于复杂、难以缓存、性能瓶颈等。

RESTful 成了近年来 Web 服务的一种很流行的架构风格。以 Representational State Transfer(表现层状态转移)为基础,它使用 HTTP 协议中的 GET、POST、PUT、DELETE 等动词,将 URL 作为资源的标识,使用表现层来区分资源的状态和资源的具体表现形式,从而保证系统的灵活性和可扩展性。

RESTful API 的主要设计区别于 SOAP 和其他 Web 服务,它通过以下四个方面来实现:

  • 使用有意义的 HTTP 方法;
  • 将资源标识符 (URIs) 明确
  • 资源通过 MIME 类型(例如 text/html, application/xml, application/json)进行通信;
  • 增加 HATEOAS 组成部分,使得客户端无需知道服务器上 API 的详细架构,客户端只需要按照超媒体(Hypermedia)提供的链接(Link)访问即可。

下面将分析 RESTful API 设计中 HATEOAS 的定义与标准,并提供实际案例说明。

什么是 HATEOAS?

HATEOAS(超文本传递引擎驱动的 Web 应用程序) 是 RESTful 架构风格的一种约束条件。它要求服务器在响应客户端请求时,除了资源数据之外,还需要返回关于如何使用 API(如何访问 API)的信息,使客户端可以根据该信息自行发现和关联相应的 API 资源,从而更加简化客户端与服务器的耦合。

HATEOAS 是 RESTful 架构风格的一个重要约束, 它必须得满足以下两个要求:

  • 资源间的链接是通过响应内容链接而建立的。
  • 所有链接的操作,必须被服务器明确表示,不能由客户端假定潜在的操作。

HATEOAS 的标准实现

目前针对 HATEOAS 的标准实现有两类:HAL 和 Siren。

HAL

HAL 是 Hypertext Application Language(超文本应用语言)的缩写。它是基于 JSON 的数据格式,包含一个链接对象,链接对象包含一个数组。

  • _links:它包含若干个链接对象,每个链接对象包含一个 HREF 属性和若干个属性值,主要描述当前实体对象与其他实体对象的关系。
  • _embedded:用于嵌套其他 HAL 资源。

以下是 HAL 的示例代码:

-
  --------- -
    ------- - ------- ------------- --
    --------- - ------- --------- -
  --
  -------- ------
  ------------ -
    ------------ -
      -
        --------- -
          ------- - ------- --------------- --
          ---------- - ------- ------------- -
        --
        ------- -----------
        ----------- ---
        -------- ----
      --
      -
        --------- -
          ------- - ------- --------------- --
          ---------- - ------- ------------- -
        --
        ------- -----------
        ----------- ---
        -------- ----
      -
    -
  -
-

Siren

Siren 是目前另一种 HATEOAS 表示方式,它不像 HAL 那样基于 JSON,而是一种自描述的超媒体格式。Siren 是基于链接的表示,每个资源都是包含一个实体和链接列表,链接列表提供了对资源状态变更的支持。

以下是 Siren 的示例代码:

-
  -------- - ------- --
  ------------- -
    -------- -----
  --
  ----------- -
    -
      -------- ---------
      ------ -------------------
      ------------- -
        ------- -----------
        ----------- ---
        -------- ----
      --
      -------- -
        - ------ --------- ------- --------------- --
        - ------ ------------ ------- ------------- -
      -
    --
    -
      -------- ---------
      ------ -------------------
      ------------- -
        ------- -----------
        ----------- ---
        -------- ----
      --
      -------- -
        - ------ --------- ------- --------------- --
        - ------ ------------ ------- ------------- -
      -
    -
  --
  -------- -
    - ------ - ------ -- ------- ------------- --
    - ------ - -------- -- ------- --------- -
  -
-

HATEOAS 的实际案例

HATEOAS 可以在设计和实现 RESTful API 时提供很多好处。以下是一些常见的案例说明:

列表

如果要返回一个列表,可以提供以下超媒体控制:

-
  -------- -
    ------- ---------------------------------
    ------- ---------------------------------------
   --
  -------- -
    -
      ------- -----------------------------------
      ------- ------- ---
      -------- -------
    --
    -
      ------- -----------------------------------
      ------- ------- ---
      -------- -------
    -
  -
-

CRUD 操作

一个资源的 CRUD 操作可以分别表示为以下四个动作:

  • 获取资源列表的链接。
  • 获取资源详细信息的链接。
  • 更新资源的链接。
  • 删除资源的链接。

以下是 User 的示例代码:

-
  -------- -
    ------- -
      ------- ---------------------------------------
      --------- -----
    --
    ---------- -
      ------- -------------------------------
      --------- -------
      ------- -------------------
      --------- -
        ---
      -
    --
    ------- -
      ------- ---------------------------------------
      --------- ------
      ------- -------------------
      --------- -
        ---
      -
    --
    --------- -
      ------- ---------------------------------------
      --------- ---------
      ------- ------------------
    -
  --
  ------- -
    ----------- ----------
    -------- ----------------------
    ------------- -------
    ------------ -----
  -
-

HATEOAS 的指导意义

HATEOAS 是 RESTful API 的重要组成部分,它可以使得客户端不需要知道服务器上 API 的详细架构,客户端只需要按照超媒体提供的链接(Link)访问即可。同时,HATEOAS 可以为 API 提供更好的可扩展性和灵活性,使得客户端与服务器之间的耦合降低,潜在的操作也更加明确。

在设计和实现 RESTful API 时,应该尽可能地遵循 HATEOAS 的约束。要确保在 API 完整响应中包含必要的链接关系,为客户端提供更加清晰的操作路线。

结论

本文从 RESTful API 设计的基础和 HATEOAS 的定义入手,详细介绍了 HATEOAS 在 RESTful API 架构风格中的应用和实现。同时,提供了 HAL 和 Siren 两种实际例子,以帮助读者理解和实践 HATEOAS 相关技术。

在设计和实现 RESTful API 时,我们应该充分考虑 HATEOAS 的约束,提供清晰的链接关系,为客户端提供更加明确的操作路线,从而提高 API 的可扩展性和灵活性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672cba28ddd3a70eb6d919cd