REST API 设计实战从 5 个常见错误到 3 个最佳命名规范在当今的软件开发领域REST API 已成为系统间通信的事实标准。一个设计良好的 API 不仅能提高开发效率还能降低维护成本。然而许多开发者在设计 API 端点时常常陷入一些常见陷阱。本文将深入剖析这些错误并提供一套可立即应用的命名规范帮助您打造更优雅、更实用的 API 设计。1. REST API 设计的五大常见错误1.1 动词泛滥的 URL 结构许多初级开发者容易犯的一个错误是在 URL 中使用动词来描述操作。这种做法不仅违背了 REST 原则还会导致 API 结构混乱。错误示例/api/createUser /api/deletePost /api/updateOrder正确做法REST 架构已经通过 HTTP 方法GET、POST、PUT、DELETE 等表达了操作意图URL 应该专注于描述资源本身。POST /api/users DELETE /api/posts PUT /api/orders提示HTTP 方法已经足够表达操作意图URL 应该保持名词形式专注于描述资源。1.2 命名风格不一致API 端点的命名风格不一致会给开发者带来不必要的认知负担。想象一下在一个 API 中同时出现以下几种命名方式/api/users /api/get-posts /api/Comments /api/delete_order这种混乱的命名方式会让 API 使用者感到困惑。我们应该选择一种命名约定kebab-case、snake_case 或 camelCase并贯穿始终。推荐做法/api/users /api/posts /api/comments /api/orders1.3 忽视 HTTP 方法语义HTTP 协议为不同的方法定义了明确的语义但许多 API 设计却忽视了这一点。常见错误用法GET /api/users/123/delete # 使用 GET 方法执行删除操作 POST /api/users/123/update # 使用 POST 方法执行更新操作正确用法DELETE /api/users/123 # 使用 DELETE 方法删除资源 PUT /api/users/123 # 使用 PUT 方法更新整个资源 PATCH /api/users/123 # 使用 PATCH 方法部分更新资源1.4 暴露实现细节API 应该是一个抽象层隐藏内部实现细节。然而一些 API 设计却将底层技术直接暴露在 URL 中。不良实践/api/mysql/users /api/database/customers/select推荐做法/api/users /api/customers1.5 版本控制缺失随着业务发展API 难免需要进行不兼容的修改。没有版本控制的 API 会给客户端带来灾难性的影响。无版本控制的 API/api/users推荐做法/api/v1/users /api/v2/users2. REST API 命名三大黄金法则2.1 资源导向设计优秀的 REST API 设计应该以资源为中心而非操作。每个端点都应该代表一个明确的资源。资源层次结构示例/api/users # 用户集合 /api/users/{id} # 特定用户 /api/users/{id}/posts # 用户的帖子集合 /api/users/{id}/posts/{postId} # 用户的特定帖子这种层次结构清晰表达了资源之间的关系使 API 更易于理解和使用。2.2 一致的命名约定选择一种命名风格并坚持使用这是 API 设计中最基本也最重要的原则之一。命名风格对比表风格示例适用场景kebab-case/api/user-profilesURL 路径推荐snake_case/api/user_profiles查询参数推荐camelCase/api/userProfilesJSON 属性推荐注意URL 路径中推荐使用 kebab-case因为它在浏览器中显示更清晰且与大多数网站的 URL 风格一致。2.3 明确的复数形式在 REST API 设计中集合资源应该使用复数形式而单个资源可以使用单数或复数形式但建议保持一致。推荐做法GET /api/users # 获取用户列表 POST /api/users # 创建新用户 GET /api/users/{id} # 获取特定用户 PUT /api/users/{id} # 更新整个用户资源 PATCH /api/users/{id} # 部分更新用户资源 DELETE /api/users/{id} # 删除用户3. 实战电商 API 端点设计示例让我们通过一个电商系统的 API 设计来展示上述原则的实际应用。产品相关端点GET /api/v1/products # 浏览产品目录 GET /api/v1/products/{id} # 查看特定产品 GET /api/v1/products?categoryelectronics # 按类别筛选产品购物车相关端点POST /api/v1/cart/items # 添加商品到购物车 DELETE /api/v1/cart/items/{id} # 从购物车移除商品订单相关端点POST /api/v1/orders # 创建新订单 GET /api/v1/orders/{id} # 查看订单详情 PUT /api/v1/orders/{id}/shipping # 更新配送地址4. 高级技巧查询参数与路径参数理解何时使用查询参数和路径参数是 API 设计的关键技能。路径参数用于标识特定资源是 URL 结构的一部分GET /api/users/123 GET /api/orders/789/items/12查询参数用于过滤、排序或定制响应位于?之后GET /api/products?categoryelectronicssortpricelimit20 GET /api/users?roleadminactivetrue查询参数典型用途结果过滤?categoryelectronics数据排序?sortprice分页控制?page2limit20搜索查询?qkeyword5. OpenAPI 3.0 示例以下是一个符合上述所有原则的 OpenAPI 3.0 示例openapi: 3.0.0 info: title: 电商平台 API version: 1.0.0 paths: /users: get: summary: 获取用户列表 parameters: - name: role in: query description: 按角色过滤用户 schema: type: string responses: 200: description: 用户列表 content: application/json: schema: type: array items: $ref: #/components/schemas/User post: summary: 创建新用户 requestBody: required: true content: application/json: schema: $ref: #/components/schemas/User responses: 201: description: 创建的用户 /users/{id}: get: summary: 获取特定用户 parameters: - name: id in: path required: true schema: type: string responses: 200: description: 用户详情 content: application/json: schema: $ref: #/components/schemas/User components: schemas: User: type: object properties: id: type: string name: type: string email: type: string format: email在实际项目中遵循这些原则设计的 API 不仅更易于使用也更容易维护和扩展。记住好的 API 设计就像好的用户界面一样应该直观、一致且自解释。
REST API 设计实战:从 5 个常见错误到 3 个最佳命名规范
发布时间:2026/7/12 1:47:07
REST API 设计实战从 5 个常见错误到 3 个最佳命名规范在当今的软件开发领域REST API 已成为系统间通信的事实标准。一个设计良好的 API 不仅能提高开发效率还能降低维护成本。然而许多开发者在设计 API 端点时常常陷入一些常见陷阱。本文将深入剖析这些错误并提供一套可立即应用的命名规范帮助您打造更优雅、更实用的 API 设计。1. REST API 设计的五大常见错误1.1 动词泛滥的 URL 结构许多初级开发者容易犯的一个错误是在 URL 中使用动词来描述操作。这种做法不仅违背了 REST 原则还会导致 API 结构混乱。错误示例/api/createUser /api/deletePost /api/updateOrder正确做法REST 架构已经通过 HTTP 方法GET、POST、PUT、DELETE 等表达了操作意图URL 应该专注于描述资源本身。POST /api/users DELETE /api/posts PUT /api/orders提示HTTP 方法已经足够表达操作意图URL 应该保持名词形式专注于描述资源。1.2 命名风格不一致API 端点的命名风格不一致会给开发者带来不必要的认知负担。想象一下在一个 API 中同时出现以下几种命名方式/api/users /api/get-posts /api/Comments /api/delete_order这种混乱的命名方式会让 API 使用者感到困惑。我们应该选择一种命名约定kebab-case、snake_case 或 camelCase并贯穿始终。推荐做法/api/users /api/posts /api/comments /api/orders1.3 忽视 HTTP 方法语义HTTP 协议为不同的方法定义了明确的语义但许多 API 设计却忽视了这一点。常见错误用法GET /api/users/123/delete # 使用 GET 方法执行删除操作 POST /api/users/123/update # 使用 POST 方法执行更新操作正确用法DELETE /api/users/123 # 使用 DELETE 方法删除资源 PUT /api/users/123 # 使用 PUT 方法更新整个资源 PATCH /api/users/123 # 使用 PATCH 方法部分更新资源1.4 暴露实现细节API 应该是一个抽象层隐藏内部实现细节。然而一些 API 设计却将底层技术直接暴露在 URL 中。不良实践/api/mysql/users /api/database/customers/select推荐做法/api/users /api/customers1.5 版本控制缺失随着业务发展API 难免需要进行不兼容的修改。没有版本控制的 API 会给客户端带来灾难性的影响。无版本控制的 API/api/users推荐做法/api/v1/users /api/v2/users2. REST API 命名三大黄金法则2.1 资源导向设计优秀的 REST API 设计应该以资源为中心而非操作。每个端点都应该代表一个明确的资源。资源层次结构示例/api/users # 用户集合 /api/users/{id} # 特定用户 /api/users/{id}/posts # 用户的帖子集合 /api/users/{id}/posts/{postId} # 用户的特定帖子这种层次结构清晰表达了资源之间的关系使 API 更易于理解和使用。2.2 一致的命名约定选择一种命名风格并坚持使用这是 API 设计中最基本也最重要的原则之一。命名风格对比表风格示例适用场景kebab-case/api/user-profilesURL 路径推荐snake_case/api/user_profiles查询参数推荐camelCase/api/userProfilesJSON 属性推荐注意URL 路径中推荐使用 kebab-case因为它在浏览器中显示更清晰且与大多数网站的 URL 风格一致。2.3 明确的复数形式在 REST API 设计中集合资源应该使用复数形式而单个资源可以使用单数或复数形式但建议保持一致。推荐做法GET /api/users # 获取用户列表 POST /api/users # 创建新用户 GET /api/users/{id} # 获取特定用户 PUT /api/users/{id} # 更新整个用户资源 PATCH /api/users/{id} # 部分更新用户资源 DELETE /api/users/{id} # 删除用户3. 实战电商 API 端点设计示例让我们通过一个电商系统的 API 设计来展示上述原则的实际应用。产品相关端点GET /api/v1/products # 浏览产品目录 GET /api/v1/products/{id} # 查看特定产品 GET /api/v1/products?categoryelectronics # 按类别筛选产品购物车相关端点POST /api/v1/cart/items # 添加商品到购物车 DELETE /api/v1/cart/items/{id} # 从购物车移除商品订单相关端点POST /api/v1/orders # 创建新订单 GET /api/v1/orders/{id} # 查看订单详情 PUT /api/v1/orders/{id}/shipping # 更新配送地址4. 高级技巧查询参数与路径参数理解何时使用查询参数和路径参数是 API 设计的关键技能。路径参数用于标识特定资源是 URL 结构的一部分GET /api/users/123 GET /api/orders/789/items/12查询参数用于过滤、排序或定制响应位于?之后GET /api/products?categoryelectronicssortpricelimit20 GET /api/users?roleadminactivetrue查询参数典型用途结果过滤?categoryelectronics数据排序?sortprice分页控制?page2limit20搜索查询?qkeyword5. OpenAPI 3.0 示例以下是一个符合上述所有原则的 OpenAPI 3.0 示例openapi: 3.0.0 info: title: 电商平台 API version: 1.0.0 paths: /users: get: summary: 获取用户列表 parameters: - name: role in: query description: 按角色过滤用户 schema: type: string responses: 200: description: 用户列表 content: application/json: schema: type: array items: $ref: #/components/schemas/User post: summary: 创建新用户 requestBody: required: true content: application/json: schema: $ref: #/components/schemas/User responses: 201: description: 创建的用户 /users/{id}: get: summary: 获取特定用户 parameters: - name: id in: path required: true schema: type: string responses: 200: description: 用户详情 content: application/json: schema: $ref: #/components/schemas/User components: schemas: User: type: object properties: id: type: string name: type: string email: type: string format: email在实际项目中遵循这些原则设计的 API 不仅更易于使用也更容易维护和扩展。记住好的 API 设计就像好的用户界面一样应该直观、一致且自解释。