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

面试官:小伙子,你的数组去重方式惊艳到我了

在 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


猜你喜欢

  • 使用 Cypress 进行端到端测试的最佳实践

    随着网络技术的不断发展,前端开发也变得越来越重要。而端到端测试是前端开发过程中的一个非常重要的环节。针对这个问题,Cypress 是一个非常好的选择,这是一款功能齐全且易于使用的端到端测试框架。

    19 天前
  • ES8 中新增的 Math 函数

    ES8 带来了一系列新的语言特性和 API,其中包括了一些新增的 Math 函数。这些函数可以帮助前端开发人员更方便地解决各种数学计算问题,提高了代码的可读性和可维护性。

    19 天前
  • Performance Optimization:使用 Glimpse 分析 ASP.NET 应用性能

    在开发 ASP.NET 应用程序时,性能一直是最重要的考虑因素之一。通过使用 Glimpse 这种性能分析工具,可以更好地了解应用程序的性能表现,从而优化其性能并提升用户体验。

    19 天前
  • 使用 Stencil.js 构建高效的 Web Components

    Web Components 是一种用于构建 Web 应用程序的规范。它允许开发人员将 UI 组件封装在独立、可重用的模块中,从而提高了 Web 应用程序的可维护性、可扩展性和可重用性。

    19 天前
  • Kubernetes 资源限制控制实战

    前言 Kubernetes 是一个广泛使用的容器编排平台,它可以帮助我们管理和扩展应用程序的部署。但是,一个容器化的应用程序可能需要占用大量的资源,如果不能很好地控制资源的使用,那么可能会导致其他应用...

    19 天前
  • 使用 Hapi.js 构建微服务的全面指南

    在现代的 Web 应用中,微服务(Microservices)架构越来越受到关注。微服务架构可以将应用程序拆分成多个小型服务,每个服务都具有独立的业务逻辑和数据存储。

    19 天前
  • Angular和RxJS的各自优势以及如何在项目中巧妙利用

    Angular和RxJS都是前端开发中的重要技术,各有其独特的优势。Angular作为一款强大的前端框架,可以让开发者快速构建高质量的Web应用程序。而RxJS则是一款强大的响应式编程库,可以使开发者...

    19 天前
  • 在 TailwindCSS 中使用背景图片

    TailwindCSS 是一个流行的前端框架,它提供了很多有用的 CSS 类来快速构建漂亮的界面。在 TailwindCSS 中,我们可以轻松地使用背景颜色来设置元素的背景。

    19 天前
  • Next.js 插入 cookie 造成的 Unhandled Promise Rejection 警告的问题解决办法

    Next.js 插入 cookie 造成的 Unhandled Promise Rejection 警告的问题解决办法 当使用 Next.js 时,我们可能需要在客户端添加 cookie。

    19 天前
  • Performance Optimization:使用 Webpack SplitChunks 提高应用性能

    Performance Optimization:使用 Webpack SplitChunks 提高应用性能 当我们开发前端应用时,我们常常会面临应用过于庞大,加载时间过长,导致用户体验不良的问题。

    19 天前
  • 如何处理未捕获的 Promise 错误?

    在前端开发中,Promise 是一种用于处理异步操作的技术,它可以帮助我们更好地掌控异步操作,提高代码的可读性和可维护性。但是,Promise 中可能存在未捕获的异常,如果不加以处理,就有可能导致代码...

    19 天前
  • webpack 如何处理 ES6 转 ES5

    Webpack 是前端开发中常用的一种打包工具,它不仅能够将多个文件打包成一个文件,并且还可以实现对 JavaScript 的模块化、代码压缩等操作。在使用 Webpack 进行打包的过程中,我们时常...

    19 天前
  • Jest 测试覆盖率不准确的解决方案

    在前端开发中,我们经常会使用 Jest 进行单元测试,其中测试覆盖率是一个非常重要的指标,可以帮助我们评估测试的质量和代码覆盖情况。然而,有时候测试覆盖率并不准确,这可能会导致我们误判测试质量和代码覆...

    19 天前
  • Serverless 遇到超时错误怎么办?

    在 Serverless 应用程序中,处理大量请求时,可能会出现一个常见的错误——超时错误。这是由于 Lambda 函数无法在目标时间内完成并返回响应。 在这篇文章中,我们将探讨一些常见的 Serve...

    19 天前
  • SPA 使用 Webpack 打包后本地空白问题解决

    单页应用(SPA)在前端开发中越来越流行。Webpack 是构建 SPA 的一种流行工具,它能够自动化地将代码打包成静态文件。虽然 Webpack 能够优化代码,但在本地调试时,经常会出现打包后的页面...

    19 天前
  • ES7 新特性:Array.prototype.flatMap() 详解

    ES7 是 ECMAScript 的一个版本,也称 ES2016,它引入了一些新特性,其中之一是 Array.prototype.flatMap()。这是一个数组方法,可以扁平化嵌套数组,并映射处理每...

    19 天前
  • 使用 Material Design 进行自定义图标设计教程

    作者:AI笔记本 Material Design 是 Google 推出的一种设计风格,计划覆盖 Android、Chrome OS、Web 和其它 Google 产品。

    19 天前
  • Less 报错提示 “Parameter ‘color’ not found in mixin”

    在前端开发中,CSS 预处理器(Preprocessor) 是一个很常用的工具。而LESS是其中的一种,它让我们在 CSS 写作中拥有更多的选择,比如变量、函数、Mixin 等等。

    19 天前
  • 解决 Redis 持久化过程中数据出错的问题

    什么是 Redis 持久化? Redis 是一个开源的高性能键值对存储数据库,在内存中存储数据。Redis 提供了两种持久化的方式,分别是 RDB 持久化和 AOF 持久化。

    19 天前
  • 7 个 CSS Flexbox 布局问题的解决方案

    CSS 布局是 Web 前端开发中最重要的一部分之一,而 Flexbox(弹性盒布局)在 CSS3 中被引入,为前端开发人员提供了一种更加灵活的布局方式,尤其是对于响应式布局的支持。

    19 天前

相关推荐

    暂无文章