如何使用 HATEOAS 增强 RESTful API 的可发现性

阅读时长 8 分钟读完

在 Web 开发领域中,RESTful API 被广泛应用。REST 是一种架构风格,通过 HTTP 协议进行数据交互。一种标准的 RESTful API 应该是无状态的并且可以缓存。可发现性是 RESTful API 的主要特性之一,它指 API 的资源应该通过 API 自身来描述。这意味着用户不需要预先知道所有可用的 API 端点,而是可以通过使用 API 上的资源来了解有哪些其他资源可用。

本文将介绍如何在 RESTful API 的设计中使用 HATEOAS(超媒体作为应用状态的引擎)来增强可发现性。我们会从介绍 HATEOAS 的基本概念开始,然后讨论如何在 API 响应中添加链接并使用示例代码演示如何在 Spring Boot 框架中实现 HATEOAS。

什么是 HATEOAS

HATEOAS 是 RESTful API 的一种扩展形式,它通过在 API 响应中包含资源链接来提高 API 的可发现性。例如,当您正在使用网上银行应用程序时,您将会通过应用的界面来浏览并找到所需要的资源,并不需要事先知道所有可用的资源。

HATEOAS 可以将链接的 URL 和关系信息定义为 HTTP 头部,XML 或 JSON 等多个格式。使用 HATEOAS API,用户可以更容易地理解资源之间的关系,并且可以找到每个资源的 URI。使用这种方法,用户不需要研究文档或者使用尝试和错误的方法交互 API。

如何在 API 响应中添加链接

要创建 HATEOAS API,您需要定义链接和资源之间的关系以及如何将链接嵌入 API 响应中。资源间的链接可以通过超媒体控制协议来定义(例如 URI 或模板),或者通过其他方式来定义。以下是如何将链接添加到响应中的一些示例:

超媒体控制协议

使用超媒体控制协议(Hypertext Control Protocol,HCP)可以定义资源和链接之间的访问级别和维护级别,例如 HATEOAS API 发布的链接就是带有所需资源的 URI。

例如,您可能有一个名为 Article 的资源,您可以使用 HCP 来定义它的 URI:

或者您可以定义它的单一资源 URI:

在响应中包含链接

在 RESTful API 的响应中包含链接通常使用超链接来完成。例如,要在一个包含文章的响应中包括一个指向特定文章的 URI,您可以包含一个类似下面的输出:

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

在上面的响应中,我们使用 _links 对象来定义五个关系型链接。这些链接包括:

  • self : 指向当前母体 (e.g. /articles) 的 URI
  • next : 指向下一页的 URI
  • prev : 指向上一页的 URI
  • article-1 : 指向第一条文章的 URI
  • article-2 : 指向第二条文章的 URI

通过使用链接和关系,用户可以更好地理解资源之间的关系,以及如何将不同类型的资源组合在一起。

示例代码

让我们以一个 Spring Boot 应用程序为例来演示如何在 RESTful API 的响应中使用 HATEOAS 添加链接。

添加依赖项

我们将使用 Spring Boot Starter Web 和 spring-hateaos 依赖项创建 HATEOAS API,因此请确保在 build.gradle 文件中包含这些依赖项:

定义 Resource

接下来,我们需要定义我们要暴露的 RESTful 资源。在本例中,我们将创建一个 Resource 对象,该对象将包含一个字符串字段和一个指向其自身的链接。我们创建 GreetingResource.java 类:

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

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

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

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

创建 Controller

在 Controller 中,我们将创建一个 GET 请求处理程序,该程序将返回一个包含我们的 Resource 对象以及链接的 HATEOAS 响应。我们创建 GreetingController.java 类:

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

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

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

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

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

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

在上面的代码中,我们使用 add() 方法向资源中添加链接。请注意,链接可以是任何类型的 HypermediaLink 实例,但必须指定完整的 URI。

启动应用程序

最后,我们需要启动我们的应用程序以验证我们的修改是否有效。在这个例子中,我们使用 Spring Boot 的默认配置在 http://localhost:8080 上启动应用程序:

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

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

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

访问 http://localhost:8080/greeting,您应该会看到如下响应:

在返回的响应中,我们看到了一个包含我们定义的自链接的 _links 对象。

结论

HATEOAS 是一种强大的工具,它可以大大提高 RESTful API 的可发现性。通过在响应中添加链接和关系,我们可以大大简化 API 用户的交互,并帮助他们更好地理解资源之间的关系。

在这篇文章中,我们介绍了 HATEOAS 的基本概念,演示了如何将链接添加到 API 响应中,并提供了一个简单的示例来说明如何在 Spring Boot 框架中实现 HATEOAS API。

我希望本文能够为想要使用 HATEOAS 来增强 RESTful API 可发现性的开发人员提供指导意义。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fa76f844713626014c8eb1

纠错
反馈