# API接口设计详设文档 > **文档版本**: v1.0 > **撰写人**: 后端架构师 > **创建日期**: 2024年9月11日 ## 1. 设计原则与规范 - **RESTful风格**: API遵循RESTful设计原则,使用标准的HTTP方法 (`GET`, `POST`, `PUT`, `DELETE`)。 - **JSON格式**: 所有请求体和响应体均使用`application/json`格式。 - **URL版本控制**: API版本通过URL前缀进行管理,例如 `/api/v1/...`。 - **身份认证**: 所有需要认证的接口都通过`Authorization: Bearer `头进行身份验证。 - **统一响应格式**: 所有API响应都遵循统一的数据结构,便于客户端处理。 - **错误处理**: 使用标准的HTTP状态码表示请求结果,并在响应体中提供详细的错误信息。 ## 2. 统一响应格式 ### 2.1 成功响应 (`2xx`) ```json { "success": true, "code": 200, "message": "操作成功", "data": { "key1": "value1", "key2": "value2" } } ``` ### 2.2 失败响应 (`4xx`, `5xx`) ```json { "success": false, "code": 401, "message": "身份认证失败", "error": { "type": "AuthenticationError", "details": "JWT token is invalid or expired." } } ``` ## 3. API接口详解 ### 3.1 用户认证模块 (`/api/v1/auth`) #### 3.1.1 `POST /auth/login` - **功能**: 微信小程序登录。客户端使用`wx.login()`获取`code`后调用此接口。 - **请求体**: ```json { "code": "wx-login-code-from-miniprogram" } ``` - **成功响应 (`200 OK`)**: - **描述**: 返回JWT和新/老用户信息。 - **响应体**: ```json { "success": true, "code": 200, "message": "登录成功", "data": { "token": "jwt.string.here", "isNewUser": false, "user": { "id": "user-openid", "nickname": "张三", "avatarUrl": "url-to-avatar" } } } ``` - **失败响应**: - `400 Bad Request`: `code`无效或缺失。 - `500 Internal Server Error`: 微信服务器接口调用失败。 #### 3.1.2 `PUT /auth/profile` - **功能**: 更新用户信息(昵称、头像)。 - **认证**: 需要JWT。 - **请求体**: ```json { "nickname": "新的昵称", "avatarUrl": "新的头像URL" } ``` - **成功响应 (`200 OK`)**: - **描述**: 返回更新后的用户信息。 - **响应体**: ```json { "success": true, "code": 200, "message": "用户信息更新成功", "data": { "id": "user-openid", "nickname": "新的昵称", "avatarUrl": "新的头像URL" // ... } } ``` ### 3.2 用户信息模块 (`/api/v1/users`) #### 3.2.1 `GET /users/me` - **功能**: 获取当前登录用户的详细信息。 - **认证**: 需要JWT。 - **成功响应 (`200 OK`)**: - **描述**: 返回包含统计数据的完整用户信息。 - **响应体**: ```json { "success": true, "code": 200, "message": "获取成功", "data": { "id": "user-openid", "nickname": "张三", "avatarUrl": "url-to-avatar", "stats": { "gamesPlayed": 100, "gamesWon": 60, "winRate": 60.0, "eloRating": 1350 }, "createdAt": "2024-09-10T..." } } ``` #### 3.2.2 `GET /users/:id` - **功能**: 获取指定ID用户的公开信息。 - **认证**: 可选。 - **成功响应 (`200 OK`)**: - **描述**: 返回用户的公开信息(不含敏感数据)。 - **响应体**: ```json { "success": true, "code": 200, "message": "获取成功", "data": { "id": "other-user-id", "nickname": "李四", "avatarUrl": "url-to-avatar", "stats": { "gamesPlayed": 120, "winRate": 55.0, "eloRating": 1300 } } } ``` - **失败响应**: - `404 Not Found`: 用户不存在。 ### 3.3 游戏模块 (`/api/v1/games`) #### 3.3.1 `GET /games/history` - **功能**: 获取当前用户的历史对局列表(分页)。 - **认证**: 需要JWT。 - **查询参数**: - `page` (number, default: 1): 页码。 - `limit` (number, default: 10): 每页数量。 - **成功响应 (`200 OK`)**: - **描述**: 返回分页的游戏历史记录。 - **响应体**: ```json { "success": true, "code": 200, "message": "获取成功", "data": { "games": [ { "gameId": "game-id-1", "opponent": { "id": "user-id-2", "nickname": "李四" }, "result": "win", // "win" | "loss" "finishedAt": "2024-09-11T...", "duration": 600 // 秒 } ], "pagination": { "currentPage": 1, "totalPages": 10, "totalGames": 100 } } } ``` #### 3.3.2 `GET /games/:id` - **功能**: 获取指定游戏对局的详细信息(用于复盘)。 - **认证**: 需要JWT,且用户必须是该对局的参与者。 - **成功响应 (`200 OK`)**: - **描述**: 返回完整的游戏会话数据。 - **响应体**: (完整的 `GameSession` 对象) - **失败响应**: - `403 Forbidden`: 无权访问该对局。 - `404 Not Found`: 游戏不存在。 ### 3.4 排行榜模块 (`/api/v1/leaderboard`) #### 3.4.1 `GET /leaderboard` - **功能**: 获取Elo积分排行榜。 - **认证**: 可选。 - **查询参数**: - `limit` (number, default: 100): 返回的条目数。 - **成功响应 (`200 OK`)**: - **描述**: 返回排名列表。 - **响应体**: ```json { "success": true, "code": 200, "message": "获取成功", "data": { "ranking": [ { "rank": 1, "user": { "id": "user-id-1", "nickname": "高手" }, "eloRating": 2000 }, { "rank": 2, "user": { "id": "user-id-2", "nickname": "大师" }, "eloRating": 1950 } ], "lastUpdatedAt": "2024-09-11T..." } } ``` ## 4. WebSocket API WebSocket通信不属于RESTful API,但其认证和初始状态获取与HTTP API紧密相关。 - **连接地址**: `wss://your-domain.com/ws` - **认证流程**: 1. 客户端通过`POST /api/v1/auth/login`获取JWT。 2. 建立WebSocket连接。 3. 连接成功后,发送第一条消息进行认证。 - **认证消息**: ```json { "type": "AUTHENTICATE", "payload": { "token": "jwt.string.here" } } ``` - **认证成功响应**: ```json { "type": "AUTHENTICATED", "payload": { "userId": "user-id", // ... } } ``` - **后续通信**: 详见《实时通信模块详设文档》。