专栏名称: 前端早读课
我们关注前端,产品体验设计,更关注前端同行的成长。 每天清晨五点早读,四万+同行相伴成长。
目录
相关文章推荐
前端早读课  ·  【早阅】8 条设计高效 API 的建议 ·  23 小时前  
前端早读课  ·  【早阅】深入探索 JavaScript ... ·  3 天前  
光伏资讯  ·  储能现在到底能不能投? ·  4 天前  
光伏资讯  ·  储能现在到底能不能投? ·  4 天前  
前端早读课  ·  【第3416期】JavaScript的??= ... ·  5 天前  
奇舞精选  ·  2024 你还在用 CSS 框架吗? ·  6 天前  
奇舞精选  ·  2024 你还在用 CSS 框架吗? ·  6 天前  
51好读  ›  专栏  ›  前端早读课

【早阅】8 条设计高效 API 的建议

前端早读课  · 公众号  · 前端  · 2024-11-19 08:00

正文

作者:@ByteByteGo
原文:https://www.instagram.com/bytebytego/p/C-5WTWVpMZJ/

1. 领域模型驱动

什么是领域模型?

领域模型是对现实世界中特定领域的概念和关系的抽象表示。它捕捉了该领域的核心业务逻辑和规则,并将其表示为一组相互关联的概念、实体和关系。

【第2896期】插件化设计模式在前端领域的应用

为什么要使用领域模型驱动 API 设计?
  • 提升 API 的可理解性和可维护性:领域模型提供了一个共同的语言和框架,使开发者能够更容易地理解和维护 API。

  • 促进业务逻辑的一致性:通过将 API 设计与领域模型保持一致,可以确保 API 的功能和行为与业务需求一致,避免出现逻辑错误和不一致性。

  • 提高 API 的可重用性:领域模型可以作为设计其他 API 或系统的基础,从而提高 API 的可重用性。

如何使用领域模型驱动 API 设计?
  • 识别领域模型:首先需要识别和定义 API 所属领域的核心概念、实体和关系。可以通过分析业务需求、与领域专家沟通以及参考现有的领域模型来完成。

  • 设计 API 资源:基于领域模型,将核心概念和实体映射到 API 的资源。例如,如果领域模型中有一个 “用户” 实体,那么 API 中就应该有一个对应的 “用户” 资源。

  • 设计 API 操作:根据领域模型中定义的实体关系和业务逻辑,设计 API 的操作。例如,如果用户可以创建订单,那么 API 就应该提供一个创建订单的操作。

  • 设计 API 路径:使用语义化的路径来表示 API 的资源和操作。例如,可以使用 /users 来表示用户资源,使用 /orders 来表示订单资源,使用 /users/{userId}/orders 来表示某个用户的所有订单。

  • 设计 API 数据格式:根据领域模型中定义的实体属性,设计 API 的数据格式。例如,可以使用 JSON 格式来表示用户和订单的信息。

案例

设计一个电商平台的 API 的案例。

该平台的核心领域模型包括 "商品" 和 "订单",商品和订单之间存在一对多的关系。

根据领域模型驱动原则,API 的设计应该反映这种关係。

例如,可以使用 /orders/{orderId}/items 来获取特定订单中的商品列表。

2. 选择合适的 HTTP 方法

在 RESTful API 设计中,HTTP 方法用于指定对资源执行的操作类型。不同的 HTTP 方法代表不同的操作语义,例如创建、读取、更新和删除。

以下是一些常用的 HTTP 方法以及它们在 RESTful API 中的典型用途:

  • GET:用于 读取 资源的信息。GET 请求应该是 幂等 的,即多次执行相同的 GET 请求不会改变资源的状态。例如,使用 GET 请求获取用户列表或特定用户的详细信息。

  • POST:用于 创建 新资源。POST 请求通常 不是幂等 的,因为每次执行都会创建一个新的资源。例如,使用 POST 请求创建新的用户帐户。

  • PUT:用于 更新 现有资源。PUT 请求应该是 幂等 的,即使多次使用相同的参数更新资源,资源最终的状态也应该是一致的。例如,使用 PUT 请求更新用户的个人资料信息。

  • DELETE:用于 删除 资源。DELETE 请求应该是 幂等 的,删除一个已经不存在的资源和删除一个存在的资源,最终结果都是资源不存在。例如,使用 DELETE 请求删除一个用户帐户。

通过使用不同的 HTTP 方法,RESTful API 可以清晰地表达对资源的操作意图,使 API 更易于理解和使用。

提供了一些使用 HTTP 方法的例子:

  • GET /orders/items:用于获取订单中的商品列表。

  • POST /users/batch:用于批量创建多个用户。

  • GET /users?ids=1,2,3:用于获取 ID 为 1、2 和 3 的用户的详细信息。

选择正确的 HTTP 方法对于设计 RESTful API 至关重要。使用错误的 HTTP 方法可能会导致 API 行为不符合预期,甚至引发安全问题。例如,如果使用 GET 请求来创建新资源,可能会导致恶意用户通过构造特殊的 URL 来执行未经授权的操作。

【第3234期】fetchLater:JS全新API支持关闭页面时安全发送网络请求

3. 正确实现幂等性

幂等性是指对同一资源进行多次相同的操作,结果应该是一致的。换句话说,无论执行一次还是多次操作,资源的状态都应该是相同的。

在 RESTful API 设计中,GET, PUT, 和 DELETE 方法应该是幂等的。POST 方法通常不应该是幂等的,因为它每次执行都会创建一个新的资源。

  • GET 方法:用于获取资源信息,多次读取同一资源不会改变资源的状态,因此天然是幂等的。

  • PUT 方法:用于更新现有资源,即使多次使用相同的参数更新资源,资源最终的状态也应该是一致的,因此也应该是幂等的。

  • DELETE 方法:用于删除资源,删除一个已经不存在的资源和删除一个存在的资源,最终结果都是资源不存在,因此也应该是幂等的。

POST 方法:通常不应该是幂等的,因为它每次执行都会创建一个新的资源。因此,多次执行相同的 POST 请求通常会创建多个相同的资源。

案例

  • 多次执行 GET /users/{userId} 应该返回相同的用户信息,无论执行多少次。因为读取用户信息并不会改变用户的状态。

  • 多次执行 PUT /users/{userId} 更新用户的姓名,最终用户姓名应该只被修改一次。即使多次提交相同的更新请求,最终用户只会有一个姓名。

  • 多次执行 DELETE /users/{userId} 删除指定用户,最终结果都是用户被删除。无论用户是否已经存在,删除操作最终都会使该用户不存在。

幂等性是 RESTful API 设计中的一个重要原则,它可以提高 API 的可靠性和可维护性。

4. 选择合适的 HTTP 状态码

在 RESTful API 设计中,HTTP 状态码是用于向客户端传达 API 请求结果的三位数代码。

每个状态码都代表一种特定的结果,例如成功、错误或其他信息。使用正确的 HTTP 状态码可以提高 API 的可理解性和易用性,因为客户端可以根据状态码了解请求的处理结果并採取相应的措施。

列出了一些常用的 HTTP 状态码及其含义:

  • 200 (OK):表示请求成功,并且服务器已返回请求的数据。

  • 201 (Created):表示请求成功,并且服务器已创建了新的资源。

  • 400 (Bad Request):表示客户端发送的请求无效或格式错误,例如缺少必需的参数或参数值不正确。

  • 401 (Unauthorized):表示客户端未经授权访问请求的资源。

  • 403 (Forbidden):表示客户端已被授权,但无权访问请求的资源。

  • 404 (Not Found):表示服务器找不到请求的资源。

  • 405 (Method Not Allowed):表示请求中使用的 HTTP 方法不允许用于请求的资源。

  • 409 (Conflict):表示请求与服务器上的当前状态发生冲突,例如尝试创建一个已存在的资源。

  • 415 (Unsupported Media Type):表示客户端发送的请求数据格式不受支持。

  • 500 (Internal Server Error):表示服务器遇到意外错误,无法处理请求。

  • 503 (Service Unavailable):表示服务器当前无法处理请求,例如服务器过载或正在维护。

  • 504 (Gateway Timeout):表示服务器作为网关或代理,未能及时从上游服务器接收响应。

选择适当的 HTTP 状态码对于设计 RESTful API 至关重要。使用错误的状态码可能会导致客户端误解请求的结果,甚至引发错误。例如,如果服务器成功创建了资源,但返回了 200 (OK) 状态码而不是 201 (Created) 状态码,客户端可能会认为资源创建失败。

除了上述列出的状态码外,还有许多其他 HTTP 状态码可用。开发者应该根据具体的 API 设计需求选择最合适的状态码。

5. 版本控制

在 RESTful API 设计中,版本控制允许 API 随着时间的推移进行演进,而不会破坏现有的客户端。当 API 需要进行重大更改时,例如修改数据格式或添加 / 删除功能,版本控制可以确保旧版本的 API 仍然可以正常运作,同时允许新版本的 API 提供新的功能和改进。

以下三种常见的版本控制方法:

  • 路径:在 URL 中包含版本号。例如,/v1/users 和 /v2/users 可以分别访问 API 的 v1 和 v2 版本。这种方法简单易懂,并且可以很容易地通过查看 URL 来识别 API 的版本。

  • 查询参数:使用查询参数指定版本号。例如,/users?version=1 表示访问 API 的 v1 版本。这种方法的优点是它不会改变 API 的基本路径,但可能会使 URL 看起来比较冗长。

  • Header: 在 HTTP 请求头中包含版本信息。例如,可以在请求头中添加一个名为 API-Version 的字段,并将其值设置为版本号。这种方法可以保持 URL 简洁,但需要客户端在发送请求时显式地包含版本信息。

选择哪种版本控制方法取决于具体的 API 设计需求和团队的偏好。

除了上述方法之外,还有一些其他的版本控制方法,例如:

  • 自定义媒体类型:通过定义不同的媒体类型来区分不同的 API 版本。

  • 日期版本控制:使用日期来标识 API 版本。

这些方法各有优缺点,需要根据具体情况进行选择。

无论选择哪种版本控制方法,都应该在 API 文档中明确说明版本控制策略,以便开发者了解如何使用不同版本的 API。

6. 语义化路径

在 RESTful API 设计中,语义化路径指的是 API 的路径应该清晰易懂,并能准确表达资源的含义。

使用语义路径的好处包括:

  • 提高 API 的可读性和可理解性:语义化的路径可以让开发者更容易理解 API 的功能和用途。例如,/users 比 /getUserList 更容易理解,因为它明确表示这是一个获取用户列表的接口。

  • 简化 API 的使用:语义化的路径可以帮助开发者更轻松地使用 API,因为他们可以根据路径推断出 API 的功能。例如,如果开发者需要获取 ID 为 123 的用户的订单列表,他们可以很容易地推断出应该使用 /users/123/orders 这个路径。

  • 提升 API 的可维护性:使用语义化路径可以使 API 更易于维护和更新。当需要修改 API 的功能时,只需要修改相应的路径即可,而不需要修改整个 API 的结构。

为了设计语义化的路径,建议遵循以下原则:

  • 使用名词来表示资源,并使用复数形式。例如,使用 /users 来表示用户资源,而不是 /getUser

  • 使用路径参数来表示特定的资源。例如,使用 /users/{userId} 来表示特定用户的资源。

  • 使用嵌套路径来表示资源之间的关系。例如,使用 /orders/{orderId}/items 来表示订单中的商品。

总而言之,使用语义化路径是 RESTful API 设计中的一个重要原则,它可以提高 API 的可读性、可理解性、易用性和可维护性。

7. 批处理

批量处理允许客户端一次性提交多个操作,从而提高效率。

在 RESTful API 设计中,可以通过以下方法实现批量处理:

使用特定的端点
  • 可以为批量操作创建特定的端点,例如 /users/batch。

  • 客户端可以向此端点发送一个包含多个操作的请求,例如创建多个用户或更新多个用户的资料。

案例提到了使用 POST /users/batch 创建多个用户。

使用查询参数

可以使用查询参数来指定要执行的多个操作。

例如,可以使用 GET /users?ids=1,2,3 来获取 ID 为 1、2 和 3 的用户的详细信息。

设计批量处理 API 时需要注意以下几点:

  • 请求格式:需要定义一个清晰的请求格式,以便客户端可以正确地提交多个操作。例如,可以使用 JSON 数组来表示多个操作。

  • 响应格式:需要定义一个清晰的响应格式,以便客户端可以理解批量操作的结果。例如,可以使用 JSON 对象来表示每个操作的结果,包括成功或失败的状态码和相关信息。

  • 错误处理:需要考虑如何处理批量操作中出现的错误。例如,如果其中一个操作失败,是否应该回滚整个批量操作,或者只返回失败操作的错误信息。

  • 性能:批量处理可能会对服务器性能造成一定的影响,需要进行适当的优化,例如使用异步处理或限制批量操作的大小。

总而言之,批量处理可以提高 RESTful API 的效率,但需要仔细设计和实现,以确保 API 的可靠性和性能。

批量处理允许客户端一次性提交多个操作,从而提高效率。

8. 查询语言

查询语言 允许客户端通过向服务器发送特定参数来精确地请求所需数据,从而提高 API 的灵活性和效率。

在 RESTful API 设计中,可以使用查询语言来实现以下功能:

分页 (Pagination)
  • 当数据集很大时,一次性返回所有数据可能会影响性能。

  • 分页允许客户端指定要返回的数据页码和每页数据量。

例如,GET /users?page=1&size=20 表示请求第一页数据,每页包含 20 个用户。

排序 (Sorting)
  • 客户端可以指定排序字段和排序顺序 (升序或降序)。

例如,GET /users?sort=name,asc 表示按名称升序排列用户列表。

过滤 (Filtering)

客户端可以根据特定条件过滤数据。

例如,GET /users?age=20&location=usa 表示请求年龄为 20 岁且位于美国的用户列表。

设计查询语言时需要注意以下几点:

  • 语法:需要定义一个清晰、易于理解的语法,以便客户端可以轻鬆地构建查询。

  • 支持的操作符:需要支持常用的比较操作符 (例如 =!=><>=<=)、逻辑操作符 (例如 AND, OR, NOT) 以及其他特定操作符 (例如 LIKE, IN)。

  • 数据类型:需要考虑不同数据类型的查询语法和支持的操作符。

  • 安全性:需要防止恶意查询,例如注入攻击。

查询语言可以使 RESTful API 更强大和灵活,允许客户端根据需要精确地请求数据,从而提高 API 的效率和易用性。

AI 阅:了解技术资讯的一种方式。

🚀可直接通过阅读原文了解详细内容。