为什么你的 RESTful API 不够 RESTful?

面试官:小伙子,你的代码为什么这么丝滑?

引言

RESTful API 是设计 Web 服务的一种架构风格。它遵循 HTTP 协议的规范,用 HTTP 请求来实现对资源的访问,是现代 Web 开发中最常用的 API 设计模式之一。RESTful API 有许多优秀的设计理念,例如基于资源和行为的 URL,状态码和消息语义,以及无状态性和可缓存性等。然而,实际开发过程中的 RESTful API 往往存在许多问题,不够规范、不够灵活、不够健壮。本文将介绍一些常见的 RESTful API 设计问题,分析其原因,并提供一些指导意义和示例代码帮助你的 RESTful API 更加符合设计理念。

问题一:URI 设计不够语义化

RESTful API 的核心是资源的 URL,它应该具有自描述性,包含有关资源的语义。

以下是一些常见的 URI 设计错误:

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

上面的示例中,createupdatedelete 并不是资源的名词,而是 HTTP 动词。正确的 URI 设计应该是:

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

这些 URI 具有更好的语义,也更容易理解和使用。

问题二:错误的 HTTP 方法

使用正确的 HTTP 方法是 RESTful API 的关键之一。但是,许多开发者只是将所有 API 请求都映射到 HTTP 的 GET 方法中。例如:

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

这种设计不仅不符合 RESTful API 的规范,还会导致安全和数据完整性等问题。正确的 HTTP 方法应该是:

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

这些 HTTP 方法更加符合语义,也更有效、更安全。

问题三:缺乏版本控制

RESTful API 在演化和不断更新的过程中,需要考虑版本管理。一旦 API 发布后,如果需要增加、删除或更改 API 中的某些资源或者属性,会给使用 API 的客户端带来很大的不便。

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

假设我们需要增加一个新的属性(如 phone)到用户对象中,返回类型如下:

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

如果没有版本控制,那么客户端将不能适应这个变化,而且会导致错误。正确的方式是使用版本控制,例如:

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

在每个版本中,我们可以轻松添加或删除属性,而不必担心老客户端无法使用 API。

问题四:缺少 HATEOAS

HATEOAS(Hypermedia as the Engine of Application State)是 RESTful API 的一个重要概念,它推崇通过链接的方式,让客户端发现和使用 API,而不是通过 API 的文档说明。

考虑下面的 API 请求:

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

如果需要编辑该用户,我们通常需要在文档中查找一个资源链接,类似于:

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

客户端通过执行链接来调用编辑操作。缺少 HATEOAS 将会导致 API 使用和维护的不便。

问题五:状态码不足以表达消息语义

HTTP 状态码是 RESTful API 的一个重要组成部分。它们包含了有关请求状态和响应的状态的消息语义。

以下是一些常见的状态码问题:

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

如果该用户不存在,我们通常使用 404 状态码,但是 404 状态码不足以表达用户不存在这个信息,我们可以使用 422 状态码,如下所示:

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

这样,客户端就可以针对 code 属性处理错误。

结论

每个 RESTful API 的实际生产环境都有不同的约束和限制。然而,一个好的 RESTful API 应该遵循约定的设计规则,并以可预见和自我描述的方式来表达资源和操作,这有助于 API 的普及和推广,并使 API 更加易于理解和使用。

参考资料

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66efb5716fbf960197309131


猜你喜欢

  • 使用 Cypress 测试多语言网站的技巧

    在当今数字化的时代,全球化的概念越来越得到重视。许多公司的产品和服务不仅提供英语,而且还提供了多种其他语言,以确保其能在全球范围内获得成功。但是,如何测试这些多语言网站,以确保它们符合语言和域的特定要...

    24 天前
  • 浅谈 CSS Grid 中的子项目排序和定位

    介绍 CSS Grid 是一种流行的前端布局工具,它可以帮助我们有效地处理布局和排版的问题。其中,子项目排序和定位是 Grid 布局的一部分。通过排序和定位,我们可以更加精细地控制子项目的位置和大小。

    24 天前
  • 在 Sequelize 中创建唯一索引的方法

    在 SQL 中,索引是一种数据结构,用于提高数据库查询操作的效率。在 Sequelize 中,创建索引是一项关键的任务,它可以帮助我们减少查询时间和提高数据读取速度。

    24 天前
  • MongoDB 中如何处理大型数据量

    作为一种非关系型数据库,MongoDB 逐渐成为了许多应用的首选。然而,在应对大型数据量时,MongoDB 中的一些特性需要特别注意。本文将介绍 MongoDB 如何处理大型数据量,探讨如何进行优化并...

    24 天前
  • Redis 缓存穿透问题的解决方案

    在开发 Web 应用程序时,我们经常需要将数据库中读取的数据缓存到 Redis 中,以提高应用程序的性能。但是,当用户请求一个不存在的数据时,缓存就会失效,这种情况被称为缓存穿透。

    24 天前
  • 如何在 Webpack 中使用 Angular2?

    Angular2 是一种流行的前端框架,可用于构建现代的 Web 应用程序。在开发过程中,你需要使用一些工具来管理和构建你的应用程序,其中 Webpack 是一种非常流行的工具。

    24 天前
  • Custom Elements 中的最佳实践:封装变量

    在现代化网页开发中,Custom Elements 已经变得越来越重要,它允许开发者通过 HTML 标签自定义元素和组件,从而更加方便的构建 Web 应用程序。 然而,在实际开发中,我们可能会遇到一些...

    24 天前
  • React Hooks 在 Next.js 中的运用

    React是一种流行的JavaScript库,广泛应用于前端开发中。自React 16.8版本发布以来,React Hooks已经成为了React生态系统中的重要组成部分。

    24 天前
  • 使用 Kubernetes 部署 Istio 服务网格的步骤和注意事项

    前言 随着云原生时代的到来,微服务架构已成为前后端开发中不可避免的趋势。然而,微服务架构也带来了复杂度的提升,需要对服务之间的通信、负载均衡、故障恢复等问题进行处理。

    24 天前
  • WAI-ARIA 在无障碍设计中的应用

    随着数字化时代的到来,越来越多的人使用互联网进行日常生活中的事务。然而,对于一些身体残疾或认知障碍的人来说,使用网站或应用程序可能是一个挑战。 WAI-ARIA (Web Accessibility ...

    24 天前
  • GraphQL 中 change tracking 的最佳实践

    GraphQL 是一种强大的数据查询和操作语言,它的出现极大地简化了前后端数据交互的流程。GraphQL 的一个重要功能是 change tracking,它可以用来追踪数据的变化,了解数据的最新状态...

    24 天前
  • Airbnb JavaScript 代码规范指南与 ESLint 集成

    Airbnb JavaScript 代码规范指南与 ESLint 集成 Airbnb 是世界上最受欢迎的短租房平台之一,在开发前端应用程序时,他们非常看重代码质量和规范性。

    24 天前
  • Material Design:如何进行设计系统化的规范管理

    Material Design 是一种设计语言,旨在帮助设计师和前端开发人员创建具有现代外观和感觉的 Web 应用程序。它是由谷歌推出的,其设计质量和规范性已经得到了广泛的认可和实践。

    24 天前
  • Kubernetes 网络模型详解

    在 Kubernetes 中,网络模型至关重要。它决定了 Pod 之间以及 Pod 和 Service 之间的通信方式。本篇文章将详细解析 Kubernetes 的网络模型,并带您深入了解其学习和指导...

    24 天前
  • 使用 ES12 中的 Object.getOwnPropertyDescriptors() 方法以及 Descriptor 参数

    ES12 中引入了许多新的 JavaScript 特性,其中包括了为对象属性提供描述符的能力。描述符是一些对象属性的元数据,用来指定属性的特性以及其他相关信息。在这个过程中,Object.getOwn...

    24 天前
  • Angular 中的单元测试与端对端测试

    前言 在前端开发中,单元测试和端对端测试是保证代码质量和可维护性的重要手段。Angular 框架提供了一套完善的测试工具和测试框架,可以帮助我们轻松地编写和执行单元测试和端对端测试。

    24 天前
  • ES10 新特性之 Array.sort():实现原始类型的排序

    JavaScript 是一门十分灵活的语言,它不断地在发展中,不断的推出新特性。而在 ES10 中,我们迎来了 Array.sort() 的新特性,使得 JavaScript 的排序功能更加强大。

    24 天前
  • Headless CMS 在互动游戏中的应用

    随着互动游戏的不断发展,越来越多的游戏开发者开始寻求一种能够支持多渠道发布的解决方案。传统的 CMS 通常只支持 Web 页面的管理,随着移动设备、小程序等多渠道的普及,CMS 已经无法满足开发者的需...

    24 天前
  • 在 Redux 中实现数据验证

    在 web 应用中,数据验证是非常重要的一个环节。在 Redux 中,我们可以通过 middleware 的方式实现数据验证,以确保应用程序的数据流是健壮和可靠的。

    24 天前
  • 使用 Jest 测试 JavaScript 函数的最佳实践

    前端开发中,测试是非常重要的一环。而现在已经有很多前端测试框架,但其中最受欢迎的是 Jest。Jest 是由 Facebook 开发的一款使用 JavaScript 编写的测试框架,它已经成为了前端领...

    24 天前

相关推荐

    暂无文章