作者:@ByteByteGo
原文:https://www.instagram.com/bytebytego/p/C-5WTWVpMZJ/
1. 领域模型驱动
什么是领域模型?
领域模型是对现实世界中特定领域的概念和关系的抽象表示。它捕捉了该领域的核心业务逻辑和规则,并将其表示为一组相互关联的概念、实体和关系。
为什么要使用领域模型驱动 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 阅:了解技术资讯的一种方式。
🚀可直接通过阅读原文了解详细内容。