【java开发】写接口文档的札记

1、考虑到团队协作,最好使用Apifox、Swagger Hub等

2、接口路径统一规范

OpenAPI(Swagger)接口路径规范是构建标准化、易理解REST API的基础。核心是遵循RESTful资源导向一致性命名。以下是核心规范、最佳实践及一个综合示例。

📌 核心规范与格式

1. 基础结构

  • 格式/api/{version}/{resources}/{identifier}/{sub-resources}?{query-parameters}

  • 示例/api/v1/users/12345/orders?status=shipped

2. 资源命名

  • 使用名词复数 :资源通常用复数名词表示,如 /users/compute-pools

  • 避免动词 :操作由HTTP方法(GET、POST等)表达,路径本身应只标识资源。例如,用 POST /users 创建,而非 POST /createUser

  • 小写与连字符 :使用小写字母,单词间用连字符分隔,如 /data-centers

3. 路径参数

  • 占位符格式 :使用花括号 {},如 /users/{userId}

  • 明确命名 :占位符名称应清晰表明其含义,如 {poolId} 优于 {id}

4. 版本控制

  • 位置 :将版本号放在路径起始处(如 /v1/)或通过HTTP头/媒体类型指定。路径版本最常见。

  • 示例/api/v1/compute-pools

5. 通用查询参数

  • 对于集合类GET请求,建议支持以下参数以保持一致性:

    • ?page=1&size=20 (分页)

    • ?sort=name,asc&sort=createdAt,desc (排序)

    • ?status=Running&type=gpu (过滤)

3、openapi的增删改查,通过请求方式POST、DELETE、PUT、GET来区分是很好的方式

是很好的方式,而且是 RESTful API 设计和 OpenAPI 规范的核心与最佳实践。 它被称为"HTTP动词驱动 "或"方法语义化",能创建出高度统一、可预测且易于理解的API。

✅ 为什么这是优秀的设计?

HTTP 方法 操作 幂等性 安全性 对应SQL 你的算力池API示例
GET 获取资源(查询) SELECT GET /v1/compute-pools (列表)
POST 创建资源 INSERT POST /v1/compute-pools (创建)
PUT 替换/全量更新资源 UPDATE PUT /v1/compute-pools/{id} (全量更新)
PATCH 部分更新资源 UPDATE PATCH /v1/compute-pools/{id} (部分更新)
DELETE 删除资源 DELETE DELETE /v1/compute-pools/{id} (删除)

这种设计的核心优势:

  1. 语义清晰,自描述性强 :看到 DELETE /v1/compute-pools/{id} 就知道是删除操作,无需在URL中使用 /deletePool 这样的动词。

  2. 结构统一,易于使用和记忆 :所有对"算力池"这个资源的操作,都基于同一个URL路径 /v1/compute-pools/v1/compute-pools/{id},只需改变HTTP方法。

  3. 充分利用HTTP协议原生特性:如缓存(GET是安全且幂等的,可被缓存)、重试(PUT/DELETE是幂等的,网络失败后可安全重试)等。

  4. 被OpenAPI等所有主流工具生态完美支持:工具能基于方法自动生成代码、文档和Mock数据。

💡 关键实践与常见问题处理

虽然方式很好,但在实践中需要明确一些细节和边界情况:

1. 关于"增"与"改"的两种特殊情况

  • POST 也可以用于"非创建"操作 :当操作更接近"执行一个动作"而非"创建资源"时,可以用 POST 到动作端点。这在RESTful中也是可接受的。

    • 示例POST /v1/compute-pools/{id}/connect (连接算力池)

    • 说明connect 不是一个资源,而是一个动作。

  • PUTPATCH 的区分

    • PUT全量更新。客户端必须提供资源的完整表示,未提供的字段会被置为默认值或null。

    • PATCH部分更新 。客户端只传递需要改变的字段。在OpenAPI中,通常需要使用 json-patch 等规范格式。

2. "查"的复杂场景

对于复杂的查询(如多条件过滤、全文搜索),不应 设计成 POST /resources/search,而应坚持使用 GET,并通过查询参数(Query Parameters) 传递条件。

  • 推荐GET /v1/compute-pools?status=Running&type=gpu&nameContains=AI

  • 避免POST /v1/compute-pools/search (除非查询条件极其复杂,如需要传递一个庞大的过滤树,超过了URL长度限制,这时才考虑用POST body传参)。

3. 批量操作的常见设计模式

对于算力池,可能需要批量删除或创建。有几种模式:

  • 模式A:在资源集合上使用 POST(创建多个)

    http

    复制代码
    POST /v1/compute-pools/batch
    Body: [ {...}, {...} ] // 创建多个池
  • 模式B:使用带过滤条件的 DELETE

    http

    复制代码
    DELETE /v1/compute-pools?status=Stopped&createdBefore=2023-01-01 // 删除所有符合条件的池

    注意:此方式需谨慎,确保权限和影响范围可控。

  • 模式C:专门的"批量任务"端点

    http

    复制代码
    POST /v1/batch-jobs
    Body: {"action": "delete", "poolIds": ["id1", "id2"]}

    返回一个任务ID,用于查询异步结果。

🆚 与其他设计风格的对比

为了更好地理解它的优势,可以对比一下其他常见但通常不推荐的方式:

设计方式 示例 问题
HTTP方法区分 (RESTful) DELETE /v1/pools/{id} 清晰、标准、推荐
URL动词区分 (RPC风格) GET /v1/deletePool?id={id} 混淆了HTTP方法的语义,GET请求不应改变服务器状态。
全部使用POST POST /v1/pools/delete POST /v1/pools/getList 丢失了HTTP协议的原生优势(如缓存、幂等性),所有操作在HTTP层面看起来都一样,不利于监控和调试。

✅ 结论与对你的建议

对于你的算力池API,坚定地使用 POSTDELETEPUTGET 来区分增删改查是完全正确且优秀的选择

你的设计可以这样完善:

  1. 基础CRUD:严格遵循上表的方法语义。

  2. 复杂查询 :坚持用 GET + 查询参数。

  3. 特殊动作 :对 connectrestart 这类非资源性操作,使用 POST /v1/compute-pools/{id}/connect

  4. 部分更新 :如果业务需要,考虑增加 PATCH /v1/compute-pools/{id} 端点。

  5. 批量操作:根据业务的重要性和安全性,选择上述一种批量处理模式,并在文档中明确其行为。

这种设计不仅能让你做出专业的API,更能让跨城市的协作团队成员、前端开发者、测试人员基于共同的、广泛认知的标准进行高效沟通,这正是OpenAPI规范所倡导的核心价值。

相关推荐
代码方舟20 小时前
Java企业级实战:对接天远名下车辆数量查询API构建自动化风控中台
java·大数据·开发语言·自动化
flysh0520 小时前
C# 中类型转换与模式匹配核心概念
开发语言·c#
AC赳赳老秦20 小时前
Python 爬虫进阶:DeepSeek 优化反爬策略与动态数据解析逻辑
开发语言·hadoop·spring boot·爬虫·python·postgresql·deepseek
浩瀚之水_csdn20 小时前
Python 三元运算符详解
开发语言·python
zgl_2005377920 小时前
ZGLanguage 解析SQL数据血缘 之 标识提取SQL语句中的目标表
java·大数据·数据库·数据仓库·hadoop·sql·源代码管理
liwulin050620 小时前
【JAVA】创建一个不需要依赖的websocket服务器接收音频文件
java·服务器·websocket
钦拆大仁21 小时前
统一数据返回格式和统一异常处理
java
源代码•宸21 小时前
GoLang八股(Go语言基础)
开发语言·后端·golang·map·defer·recover·panic
czlczl2002092521 小时前
OAuth 2.0 解析:后端开发者视角的原理与流程讲解
java·spring boot·后端