【RESTful API】API设计 (http治理)

根据Google API设计指南整理的RESTful API示例,涵盖核心HTTP方法(GET、POST、PUT、PATCH、DELETE)及父子资源嵌套场景, 设计遵循以下原则:

  1. 资源命名 :使用名词复数形式(如/users),URI层级表达父子关系(如/users/{userId}/orders

  2. HTTP方法语义

    • GET:查询资源
    • POST:创建资源
    • PUT:全量更新
    • PATCH:部分更新
    • DELETE:删除资源
  3. 无状态性:每个请求包含完整上下文

  4. 版本控制 :URL中嵌入版本号(如/v1/

Google API设计指南的核心技术要点整理,结合其官方规范及实践总结:


📌 一、设计原则

  1. 面向资源设计 (Resource-Oriented Design)

    • API 的核心抽象是资源 (名词),通过标准方法 (动词)操作。资源以层次结构组织(如 users/{id}/messages/{id}),资源名称需为原子性字符串39。
    • 资源集合命名:复数小写驼峰式 (如 shelves),避免泛用词(如 items
  2. 标准方法优先

    • 五大标准方法覆盖 70%+ 场景,确保一致性7:

      方法 HTTP 映射 功能
      List GET 分页查询资源集合
      Get GET 获取单个资源
      Create POST 创建资源
      Update PUT/PATCH 全量/部分更新资源
      Delete DELETE 删除资源
    • 自定义方法仅用于非标准操作(如 :undelete),通过 POST /resource:verb 格式映射


一、用户管理(10个)

  1. GET /v1/users
    ➔ 分页查询用户列表(参数:?page=2&limit=50
  2. POST /v1/users
    ➔ 创建新用户(Body包含用户JSON)
  3. GET /v1/users/{userId}
    ➔ 获取指定ID的用户详情
  4. PUT /v1/users/{userId}
    ➔ 全量更新用户信息
  5. PATCH /v1/users/{userId}
    ➔ 部分更新用户(如仅修改邮箱)
  6. DELETE /v1/users/{userId}
    ➔ 删除用户
  7. GET /v1/users/{userId}/permissions
    ➔ 获取用户的权限列表(父子资源)
  8. POST /v1/users/{userId}/avatar
    ➔ 为用户上传头像(子资源)
  9. DELETE /v1/users/{userId}/sessions
    ➔ 终止用户所有活跃会话
  10. GET /v1/users/{userId}/roles/{roleId}
    ➔ 查询用户绑定的特定角色详情

二、产品目录(15个)

  1. GET /v1/products
    ➔ 过滤产品(?category=electronics&price<=1000
  2. POST /v1/products
    ➔ 创建新产品
  3. GET /v1/products/{productId}
    ➔ 查询产品详情
  4. PUT /v1/products/{productId}
    ➔ 全量更新产品信息
  5. PATCH /v1/products/{productId}/stock
    ➔ 更新产品库存(部分更新)
  6. DELETE /v1/products/{productId}
    ➔ 下架产品
  7. GET /v1/products/{productId}/reviews
    ➔ 获取产品评价列表(父子)
  8. POST /v1/products/{productId}/reviews
    ➔ 为产品添加评价
  9. DELETE /v1/products/{productId}/reviews/{reviewId}
    ➔ 删除指定评价
  10. GET /v1/products/{productId}/versions
    ➔ 查询产品历史版本(子资源)
  11. POST /v1/products/{productId}/attachments
    ➔ 上传产品附件(如说明书)
  12. GET /v1/categories/{categoryId}/products
    ➔ 按分类查询产品(父子)
  13. PATCH /v1/products/{productId}/pricing
    ➔ 仅更新产品价格
  14. POST /v1/products/batch-delete
    ➔ 批量删除产品(Body含ID列表)
  15. GET /v1/brands/{brandId}/products
    ➔ 按品牌查询产品

三、订单系统(20个)

  1. POST /v1/users/{userId}/orders
    ➔ 为用户创建订单(父子)
  2. GET /v1/users/{userId}/orders/{orderId}
    ➔ 查询用户特定订单
  3. DELETE /v1/users/{userId}/orders/{orderId}
    ➔ 取消订单
  4. GET /v1/orders?status=shipped
    ➔ 全局过滤订单(独立资源)
  5. PATCH /v1/orders/{orderId}/status
    ➔ 更新订单状态(如shipped
  6. POST /v1/orders/{orderId}/items
    ➔ 向订单中添加商品项
  7. DELETE /v1/orders/{orderId}/items/{itemId}
    ➔ 从订单移除商品项
  8. GET /v1/orders/{orderId}/invoice
    ➔ 下载订单发票
  9. POST /v1/orders/{orderId}/refunds
    ➔ 发起退款请求
  10. PUT /v1/orders/{orderId}/shipping-address
    ➔ 更新配送地址
  11. GET /v1/users/{userId}/orders/history
    ➔ 查询用户历史订单
  12. POST /v1/orders/batch-create
    ➔ 批量创建订单(企业场景)
  13. PATCH /v1/orders/{orderId}/priority
    ➔ 调整订单优先级
  14. GET /v1/warehouses/{warehouseId}/orders
    ➔ 查询仓库关联订单
  15. POST /v1/orders/{orderId}/notifications
    ➔ 发送订单通知(如短信)
  16. DELETE /v1/orders/{orderId}/attachments/{fileId}
    ➔ 删除订单附件
  17. GET /v1/orders/{orderId}/timeline
    ➔ 获取订单状态时间线
  18. PUT /v1/orders/{orderId}/coupon
    ➔ 应用优惠券到订单
  19. POST /v1/orders/{orderId}/split
    ➔ 拆分订单(如分仓库发货)
  20. GET /v1/orders/stats?period=monthly
    ➔ 获取订单统计报表

四、博客系统(15个)

  1. POST /v1/blogs
    ➔ 创建博客文章
  2. GET /v1/blogs/{blogId}/comments
    ➔ 获取文章评论(父子)
  3. POST /v1/blogs/{blogId}/comments
    ➔ 新增评论
  4. DELETE /v1/blogs/{blogId}/comments/{commentId}
    ➔ 删除评论
  5. PATCH /v1/blogs/{blogId}/likes
    ➔ 更新文章点赞数
  6. GET /v1/users/{userId}/blogs
    ➔ 查询用户所有文章
  7. PUT /v1/blogs/{blogId}/content
    ➔ 全量更新文章内容
  8. POST /v1/blogs/{blogId}/tags
    ➔ 为文章添加标签
  9. DELETE /v1/blogs/{blogId}/tags/{tagId}
    ➔ 移除文章标签
  10. GET /v1/tags/{tagName}/blogs
    ➔ 按标签查询文章
  11. POST /v1/blogs/{blogId}/publish
    ➔ 发布草稿(特殊动作)
  12. GET /v1/blogs/{blogId}/versions/{versionId}
    ➔ 获取文章历史版本
  13. POST /v1/blogs/{blogId}/attachments
    ➔ 上传文章附件(如图片)
  14. DELETE /v1/blogs/{blogId}/subscriptions
    ➔ 取消文章订阅
  15. GET /v1/blogs/trending?top=10
    ➔ 获取热门文章排行

五、文件存储(15个)

  1. POST /v1/files
    ➔ 上传文件(返回文件ID)
  2. GET /v1/files/{fileId}
    ➔ 下载文件
  3. DELETE /v1/files/{fileId}
    ➔ 删除文件
  4. GET /v1/folders/{folderId}/files
    ➔ 列出文件夹内文件(父子)
  5. POST /v1/folders/{folderId}/files
    ➔ 向文件夹上传文件
  6. PATCH /v1/files/{fileId}/permissions
    ➔ 修改文件权限(部分更新)
  7. PUT /v1/files/{fileId}/metadata
    ➔ 更新文件元数据(如作者)
  8. GET /v1/files/{fileId}/history
    ➔ 获取文件版本历史
  9. POST /v1/files/{fileId}/restore?version=2
    ➔ 恢复文件到指定版本
  10. DELETE /v1/folders/{folderId}
    ➔ 删除文件夹(递归删除子项)
  11. PATCH /v1/shared-links/{linkId}
    ➔ 更新文件分享链接设置
  12. GET /v1/users/{userId}/trash/files
    ➔ 查询用户回收站文件
  13. POST /v1/files/{fileId}/move
    ➔ 移动文件到新路径
  14. GET /v1/files/search?name=report.docx
    ➔ 全局文件搜索
  15. POST /v1/files/zip
    ➔ 批量打包下载文件(Body含ID列表)

六、组织架构(25个)

  1. POST /v1/companies
    ➔ 创建公司
  2. GET /v1/companies/{companyId}/departments
    ➔ 查询公司部门列表(父子)4
  3. POST /v1/companies/{companyId}/departments
    ➔ 新增部门
  4. GET /v1/departments/{deptId}/employees
    ➔ 获取部门员工
  5. POST /v1/departments/{deptId}/employees
    ➔ 向部门添加员工
  6. DELETE /v1/departments/{deptId}/employees/{empId}
    ➔ 从部门移除员工
  7. PUT /v1/employees/{empId}/manager
    ➔ 更新员工直属经理
  8. GET /v1/companies/{companyId}/projects
    ➔ 查询公司项目
  9. POST /v1/projects/{projectId}/teams
    ➔ 为项目分配团队
  10. DELETE /v1/companies/{companyId}/departments/{deptId}
    ➔ 删除部门(需处理员工转移)
  11. PATCH /v1/employees/{empId}/status
    ➔ 更新员工状态(如在职/离职)
  12. GET /v1/teams/{teamId}/members
    ➔ 获取团队成员
  13. POST /v1/teams/{teamId}/tasks
    ➔ 为团队创建任务
  14. GET /v1/employees/{empId}/reports
    ➔ 获取员工下属(汇报线)
  15. PUT /v1/projects/{projectId}/budget
    ➔ 更新项目预算
  16. POST /v1/companies/{companyId}/locations
    ➔ 添加办公地点
  17. DELETE /v1/companies/{companyId}/locations/{locId}
    ➔ 移除办公地点
  18. GET /v1/employees/{empId}/attendance?month=2025-03
    ➔ 查询员工考勤记录
  19. POST /v1/employees/batch-update
    ➔ 批量更新员工信息(如调薪)
  20. PATCH /v1/tasks/{taskId}/progress
    ➔ 更新任务进度百分比
  21. GET /v1/companies/{companyId}/analytics/salaries
    ➔ 获取公司薪资分析报表
  22. POST /v1/teams/{teamId}/meetings
    ➔ 安排团队会议
  23. DELETE /v1/tasks/{taskId}/assignments/{empId}
    ➔ 解除员工的任务分配
  24. PUT /v1/companies/{companyId}/policies/{policyId}
    ➔ 更新公司政策文档
  25. GET /v1/companies/{companyId}/hierarchy
    ➔ 获取组织架构树(嵌套父子结构)

设计要点总结

  1. 父子资源嵌套原则

    • 子资源URI必须包含父ID(如/users/{userId}/orders
    • 若子资源可独立存在,需提供独立入口(如/orders/{orderId}
  2. HTTP方法选择

    • PATCH用于局部更新,PUT用于全量替换
    • 非CRUD操作转为资源(如POST /files/{id}/restore
  3. 批量操作

    • 使用POST + 资源复数形式(如POST /users/batch-delete
  4. 错误处理

    • 返回标准HTTP状态码(如404 Not Found)及错误JSON
  5. 扩展性

    • 通过fields参数过滤响应字段(?fields=id,name

自定义方法

自定义方法应谨慎使用,优先考虑标准方法,仅在标准语义无法满足时采用此模式。

根据 Google API 设计指南,当操作无法映射到标准 CRUD(Create、Read、Update、Delete)方法时,应使用自定义方法 (Custom Methods)。这些方法通过 POST 请求实现,并在资源 URI 后附加 :{action} 表示非标准操作。

在Google API设计规范中,自定义方法使用 :{action} 而非 /{action} 的URI格式(如 :batchDelete 而非 /batchDelete),这是经过严谨设计的语法规则,核心原因如下:


设计原则:区分资源 vs 操作

  1. /{action} 的歧义性

    若使用 /batchDelete 格式,会被解析为子资源路径 (如存在名为 batchDelete 的资源),而非操作指令。
    错误示例

    bash 复制代码
    POST /v1/users/batchDelete
    • 语义歧义:系统可能误认为要操作 users 下的 batchDelete 资源。
  2. :{action} 的明确性

    冒号语法显式声明这是一个动作 (动词),而非资源(名词)。
    正确示例

    bash 复制代码
    POST /v1/users:batchDelete
    • 语义清晰:对 users 资源执行 batchDelete 操作。

二、语法规范:避免与子资源冲突

场景 路径格式 含义
子资源 /users/{userId}/photos 查询用户相册(资源实体)
自定义方法 /users:search 执行搜索(操作指令)

若使用 /users/search

  • 系统会误认为 searchusers 的子资源(如返回所有"search"类型的用户)。
  • :search 明确表示动作(在用户集合上执行搜索)。

特殊案例:为什么 /search 被允许?

Google规范中 /search 是唯一例外 ,因其被定义为标准方法而非自定义方法:

bash 复制代码
GET /v1/users/search?query=john
  • 原因search 本质是 List 方法的扩展(过滤资源),属于标准查询行为。

  • 规范依据

    当操作是对资源的"查询"时(如过滤、排序),使用独立端点 /search


四、关键结论:何时用 : vs /

操作类型 示例 URI 格式
自定义方法(非标准操作) 批量删除、发布、恢复 POST /res:action
标准查询(过滤/搜索) 搜索、复合条件列表 GET /res/search
子资源操作 获取用户的订单 GET /users/{id}/orders

以下是符合规范的 20 个典型示例,覆盖不同业务场景:

⚙️ 一、计算与处理类操作

  1. batchDelete

    • 场景:批量删除资源(如订单、文件)
    • URIPOST /v1/orders:batchDelete
  2. calculate

    • 场景:执行复杂计算(如税费、预算)
    • URIPOST /v1/invoices/{id}:calculateTax
  3. generateReport

    • 场景:生成动态报表(如销售统计)
    • URIPOST /v1/sales:generateReport
  4. restore

    • 场景:恢复已删除资源(如文件、用户)
    • URIPOST /v1/files/{fileId}:restore
  5. translate

    • 场景:翻译文本内容
    • URIPOST /v1/documents/{id}:translate

🔄 二、状态与流程管理

  1. publish

    • 场景:发布草稿资源(如博客、标签)
    • URIPOST /v1/blogs/{blogId}:publish
  2. approve

    • 场景:审批工作流任务
    • URIPOST /v1/tasks/{taskId}:approve
  3. cancel

    • 场景:取消进行中操作(如订单、订阅)
    • URIPOST /v1/orders/{orderId}:cancel
  4. disable

    • 场景:停用资源(如账号、服务)
    • URIPOST /v1/users/{userId}:disable
  5. resetPassword

    • 场景:重置用户密码(非标准更新)
    • URIPOST /v1/users/{userId}:resetPassword

📦 三、批量与聚合操作

  1. import

    • 场景:批量导入数据(如用户列表)
    • URIPOST /v1/users:import
  2. export

    • 场景:导出资源集合(如报告数据)
    • URIPOST /v1/reports:export
  3. sync

    • 场景:多端数据同步(如日历事件)
    • URIPOST /v1/calendars/{id}:sync

♻️ 四、资源生命周期扩展

  1. undelete

    • 场景:恢复逻辑删除的资源
    • URIPOST /v1/projects/{projectId}:undelete
  2. archive

    • 场景:归档不再活跃的资源
    • URIPOST /v1/documents/{id}:archive
  3. validate

    • 场景:校验资源有效性(如配置、表单)
    • URIPOST /v1/forms/{formId}:validate

🔗 五、关联资源操作

  1. attach

    • 场景:关联独立资源(如标签附加到文件)
    • URIPOST /v1/files/{fileId}/labels:attach
  2. clone

    • 场景:复制资源(如项目模板)
    • URIPOST /v1/templates/{id}:clone
  3. move

    • 场景:移动资源位置(如文件目录)
    • URIPOST /v1/files/{fileId}:move
  4. merge

    • 场景:合并多个资源(如联系人去重)
    • URIPOST /v1/contacts:merge

以上示例完全遵循Google API设计规范,强调URI可读性、HTTP方法语义化及资源分层管理。完整规范可参考:Google Cloud API Design Guide

相关推荐
码小凡3 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
星星电灯猴4 小时前
Charles抓包工具深度解析:如何高效调试HTTPHTTPS请求与API接口
后端
isfox4 小时前
Hadoop 版本进化论:从 1.0 到 2.0,架构革命全解析
大数据·后端
normaling4 小时前
四、go语言指针
后端
yeyong4 小时前
用springboot开发一个snmp采集程序,并最终生成拓扑图 (二)
后端
掉鱼的猫5 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·后端
HyggeBest5 小时前
Mysql之undo log、redo log、binlog日志篇
后端·mysql
java金融5 小时前
FactoryBean 和BeanFactory的傻傻的总是分不清?
java·后端
独立开阀者_FwtCoder5 小时前
Nginx 部署负载均衡服务全解析
前端·javascript·后端