# API设计规范 > **版本?* v2.0 > **最后更新:** 2025-11-06 > **API风格?* RESTful API > **基础URL?* `http://localhost:3001/api/v1` > **适用范围?* 平台?+ 能力?+ 业务模块? --- ## 📋 设计原则 ### API First原则 - ?先设计API,再实现功能 - ?API是前后端的契? - ?API变更需要版本控? - ?所有API都要有文? ### RESTful设计 - ?使用HTTP动词表示操作(GET、POST、PUT、DELETE? - ?URL表示资源,不表示动作 - ?使用复数名词表示资源集合 - ?嵌套资源不超?? - ?使用HTTP状态码表示结果 ### 命名规范 - ?URL使用小写字母和连字符(kebab-case? - ?查询参数使用驼峰命名(camelCase? - ?JSON字段使用驼峰命名(camelCase? --- ## 🎯 URL设计规范 ### 路径格式 ``` /api/v{version}/{module}/{resource}/{id?}/{action?} 示例? /api/v1/literature/projects # 获取文献项目列表 /api/v1/literature/projects/123 # 获取ID=123的项? /api/v1/literature/projects/123/export # 导出项目(动作) ``` ### 模块前缀 | 模块 | 路由前缀 | 示例 | |------|---------|------| | 认证 | `/auth` | `/api/v1/auth/login` | | 用户 | `/users` | `/api/v1/users/me` | | AI问答 | `/chat` | `/api/v1/chat/conversations` | | 智能?| `/agents` | `/api/v1/agents` | | AI文献 | `/literature` | `/api/v1/literature/projects` | | 知识?| `/knowledge-bases` | `/api/v1/knowledge-bases` | | 数据清洗 | `/data-cleaning` | `/api/v1/data-cleaning/projects` | | 统计分析 | `/analysis` | `/api/v1/analysis/projects` | | 统计工具 | `/tools` | `/api/v1/tools` | | 稿件审查 | `/review` | `/api/v1/review/tasks` | | LLM网关 | `/llm` | `/api/v1/llm/chat` | | 管理?| `/admin` | `/api/v1/admin/users` | ### 资源命名 **?正确示例?* ``` GET /api/v1/literature/projects # 获取列表 GET /api/v1/literature/projects/:id # 获取详情 POST /api/v1/literature/projects # 创建 PUT /api/v1/literature/projects/:id # 更新 DELETE /api/v1/literature/projects/:id # 删除 GET /api/v1/literature/projects/:id/items # 获取项目下的文献 POST /api/v1/literature/projects/:id/items/import # 导入文献 POST /api/v1/literature/projects/:id/screening/execute # 执行筛? ``` **?错误示例?* ``` POST /api/v1/literature/getProjects # 使用动词 POST /api/v1/literature/createProject # 使用动词 GET /api/v1/literature/project # 单数形式 GET /api/v1/literatureProjectList # 驼峰命名 ``` --- ## 🔧 HTTP方法规范 ### 方法使用 | 方法 | 用?| 是否幂等 | 是否安全 | |------|------|---------|---------| | **GET** | 获取资源 | ?| ?| | **POST** | 创建资源 | ?| ?| | **PUT** | 完整更新资源 | ?| ?| | **PATCH** | 部分更新资源 | ?| ?| | **DELETE** | 删除资源 | ?| ?| ### 方法示例 ```http # 获取资源列表 GET /api/v1/literature/projects # 获取单个资源 GET /api/v1/literature/projects/123 # 创建资源 POST /api/v1/literature/projects Content-Type: application/json { "name": "新项?, "description": "..." } # 完整更新资源(所有字段) PUT /api/v1/literature/projects/123 Content-Type: application/json { "name": "更新", "description": "..." } # 部分更新资源(部分字段) PATCH /api/v1/literature/projects/123 Content-Type: application/json { "name": "只更新名? } # 删除资源 DELETE /api/v1/literature/projects/123 ``` --- ## 📊 状态码规范 ### 标准状态码 | 状态码 | 含义 | 使用场景 | |--------|------|---------| | **200** | OK | 成功返回数据 | | **201** | Created | 成功创建资源 | | **204** | No Content | 成功但无返回数据(如删除?| | **400** | Bad Request | 请求参数错误 | | **401** | Unauthorized | 未认证(没有Token或Token过期?| | **403** | Forbidden | 无权限(已认证但权限不足?| | **404** | Not Found | 资源不存?| | **409** | Conflict | 资源冲突(如重复创建?| | **422** | Unprocessable Entity | 语义错误(如验证失败?| | **429** | Too Many Requests | 请求过于频繁(限流) | | **500** | Internal Server Error | 服务器错?| ### 状态码使用示例 ```typescript // 200 OK - 成功获取数据 res.status(200).json({ success: true, data: projects }); // 201 Created - 成功创建资源 res.status(201).json({ success: true, data: newProject }); // 204 No Content - 成功删除(无内容返回? res.status(204).send(); // 400 Bad Request - 参数错误 res.status(400).json({ success: false, error: { code: 'INVALID_PARAMS', message: '参数错误' } }); // 401 Unauthorized - 未认? res.status(401).json({ success: false, error: { code: 'UNAUTHORIZED', message: '请先登录' } }); // 403 Forbidden - 无权? res.status(403).json({ success: false, error: { code: 'FORBIDDEN', message: '无权访问' } }); // 404 Not Found - 资源不存? res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: '资源不存? } }); // 422 Unprocessable Entity - 验证失败 res.status(422).json({ success: false, error: { code: 'VALIDATION_ERROR', message: '参数验证失败', details: [...] } }); ``` --- ## 📝 响应格式规范 ### 统一响应格式 ?必须遵守 **成功响应?* ```json { "success": true, "data": { // 实际数据 }, "message": "操作成功" } ``` **错误响应?* ```json { "success": false, "error": { "code": "ERROR_CODE", "message": "错误信息", "details": [...] // 可选,详细错误信息 } } ``` ### 列表数据响应 ```json { "success": true, "data": { "items": [ { "id": 1, "name": "项目1" }, { "id": 2, "name": "项目2" } ], "pagination": { "page": 1, "pageSize": 10, "total": 100, "totalPages": 10, "hasNext": true, "hasPrev": false } }, "message": "获取成功" } ``` ### 验证错误响应 ```json { "success": false, "error": { "code": "VALIDATION_ERROR", "message": "参数验证失败", "details": [ { "field": "email", "message": "邮箱格式不正? }, { "field": "password", "message": "密码长度必须大于6? } ] } } ``` --- ## 🔑 认证与授权规? ### JWT认证 **1. 登录获取Token** ```http POST /api/v1/auth/login Content-Type: application/json { "email": "user@example.com", "password": "password123" } # Response { "success": true, "data": { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expiresIn": 604800, // 7天(秒) "user": { "id": 123, "email": "user@example.com", "name": "张三", "role": "user" } } } ``` **2. 使用Token访问API** ```http GET /api/v1/literature/projects Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` **3. Token过期处理** ```http # Token过期,返?01 { "success": false, "error": { "code": "TOKEN_EXPIRED", "message": "Token已过期,请重新登? } } # 使用refreshToken刷新 POST /api/v1/auth/refresh Content-Type: application/json { "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } ``` ### 权限控制 | 端点类型 | 需要认?| 角色要求 | |---------|---------|---------| | 公开端点 | ?| ?| | 用户端点 | ?| user | | 管理端点 | ?| admin | **示例?* ```typescript // 公开端点(无需认证? POST /api/v1/auth/login POST /api/v1/auth/register // 用户端点(需要认证,user角色? GET /api/v1/literature/projects POST /api/v1/literature/projects // 管理端点(需要认证,admin角色? GET /api/v1/admin/users POST /api/v1/admin/users/:id/disable ``` --- ## 📄 分页规范 ### 请求参数 ``` GET /api/v1/literature/projects?page=1&pageSize=20&sortBy=createdAt&sortOrder=desc Query参数? - page: 页码(默?? - pageSize: 每页数量(默?0,最?00? - sortBy: 排序字段(默认createdAt? - sortOrder: 排序方向(asc/desc,默认desc? ``` ### 响应格式 ```json { "success": true, "data": { "items": [...], "pagination": { "page": 1, "pageSize": 20, "total": 100, "totalPages": 5, "hasNext": true, "hasPrev": false } } } ``` --- ## 🔍 筛选与搜索规范 ### 筛选参? ``` GET /api/v1/literature/projects?status=active&keyword=骨质疏松 Query参数? - status: 状态筛选(active/inactive? - keyword: 关键词搜索(搜索name和description字段? - userId: 用户ID筛选(管理端) - startDate/endDate: 日期范围筛? ``` ### 搜索响应 ```json { "success": true, "data": { "items": [...], "pagination": {...}, "filters": { "status": "active", "keyword": "骨质疏松" } } } ``` --- ## ⚠️ 错误码设? ### 标准错误? | 错误?| HTTP状?| 说明 | |--------|---------|------| | `VALIDATION_ERROR` | 422 | 参数验证失败 | | `UNAUTHORIZED` | 401 | 未认?| | `TOKEN_EXPIRED` | 401 | Token过期 | | `FORBIDDEN` | 403 | 无权?| | `NOT_FOUND` | 404 | 资源不存?| | `ALREADY_EXISTS` | 409 | 资源已存?| | `QUOTA_EXCEEDED` | 429 | 配额超限 | | `INTERNAL_ERROR` | 500 | 服务器错?| ### 业务错误? ```typescript // 模块特定错误码(前缀区分? ASL_IMPORT_FAILED // AI文献:导入失? ASL_SCREENING_IN_PROGRESS // AI文献:筛选进行中 PKB_QUOTA_EXCEEDED // 知识库:配额超限 LLM_QUOTA_EXCEEDED // LLM:配额超? ``` --- ## 🚀 性能优化规范 ### 1. 分页必须 ``` 所有列表接口必须支持分页: - 默认pageSize=10 - 最大pageSize=100 - 禁止一次性返回全部数? ``` ### 2. 字段过滤 ``` GET /api/v1/users/me?fields=id,name,email 只返回需要的字段,减少数据传? ``` ### 3. 缓存策略 ```http # 设置缓存? Cache-Control: public, max-age=300 # 使用ETag ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" # 返回304 Not Modified ``` --- ## ?检查清? **设计新API时必须检查:** - [ ] URL符合RESTful规范(使用名?复数? - [ ] 使用正确的HTTP方法(GET/POST/PUT/DELETE? - [ ] 使用正确的HTTP状态码 - [ ] 响应格式符合统一规范(success + data/error? - [ ] 需要认证的接口检查JWT Token - [ ] 需要权限的接口检查用户角? - [ ] 列表接口支持分页 - [ ] 列表接口支持排序 - [ ] 错误响应包含明确的错误码和错误信? - [ ] 所有API都有文档说明 --- ## 🔗 相关文档 **总览?* - [API路由总览](./04-API路由总览.md) ?查看所有API端点 **模板?* - [API设计模板](../_templates/API设计-模板.md) **各模块设计:** - [平台基础层](../01-平台基础?README.md) - [通用能力层](../02-通用能力?README.md) - [业务模块层](../03-业务模块/README.md) --- **最后更新:** 2025-11-06 **维护人:** 技术架构师 **版本?* v2.0