| name | api-design-safety |
| description | 当设计或修改 REST API 响应结构、处理 API 返回值时触发。防止 API 设计缺陷导致的字段错位、类型歧义等问题。 |
API 设计安全规范
当设计或修改 REST API 响应结构时,防止常见的设计缺陷。
陷阱 #1: 泛型方法重载歧义
场景: 返回类型为 String 时,Java 重载解析可能匹配错误的方法
问题根因
Java 方法重载解析时,String 类型参数会优先匹配 success(String message) 而非 success(T data),导致数据进入错误的字段。
错误示例
public static <T> ApiResponse<T> success(T data)
public static <T> ApiResponse<T> success(String message, T data)
String avatarUrl = "http://example.com/avatar.jpg";
return ApiResponse.success(avatarUrl);
正确做法
return ApiResponse.success("上传成功", avatarUrl);
return ApiResponse.<String>success(avatarUrl);
return ApiResponse.success(new UploadResult(avatarUrl));
检查清单
陷阱 #2: 响应字段语义不清
场景: message 和 data 字段职责混淆
规范
| 字段 | 用途 | 类型 | 示例 |
|---|
code | 业务状态码 | int | 200, 400, 500 |
message | 用户可读的提示信息 | String | "上传成功", "参数错误" |
data | 业务数据 | T | {"url": "..."}, [...] |
timestamp | 响应时间戳 | String | ISO 8601 格式 |
错误示例
return ApiResponse.success("avatars/2026-04/xxx.jpeg");
return ApiResponse.error("NullPointerException at line 42");
正确做法
return ApiResponse.success("上传成功", avatarUrl);
return ApiResponse.error("文件格式不支持,请上传 JPG/PNG 格式");
陷阱 #3: 空值处理不一致
场景: 无数据时返回 null、{}、[] 不统一
规范
| 场景 | 推荐返回 | 说明 |
|---|
| 单个对象不存在 | data: null | 前端判断 if (!data) |
| 列表为空 | data: [] | 前端可直接遍历 |
| 分页数据为空 | data: {list: [], total: 0} | 保持结构一致 |
错误示例
if (user == null) {
return ApiResponse.success(null);
}
return ApiResponse.success(new UserVO());
正确做法
if (user == null) {
return ApiResponse.success(null);
}
return ApiResponse.success(userVO);
List<UserVO> users = userService.list();
return ApiResponse.success(users);
陷阱 #4: HTTP 状态码与业务状态码混淆
场景: 业务失败时返回 HTTP 500
规范
| 场景 | HTTP 状态码 | 业务 code | 说明 |
|---|
| 成功 | 200 | 200 | 正常响应 |
| 参数错误 | 200 | 400 | 业务层校验失败 |
| 未授权 | 401 | - | 认证失败 |
| 无权限 | 403 | - | 授权失败 |
| 资源不存在 | 200 | 404 | 业务资源不存在 |
| 服务器错误 | 500 | - | 代码异常 |
错误示例
if (user == null) {
throw new RuntimeException("用户不存在");
}
正确做法
if (user == null) {
return ApiResponse.error(404, "用户不存在");
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ApiResponse<?>> handleException(Exception e) {
log.error("服务器错误", e);
return ResponseEntity.status(500)
.body(ApiResponse.error("服务器错误,请稍后重试"));
}
检查清单(API 设计)
返回值设计:
状态码设计:
前后端协议:
适用范围
- Java: Spring Boot REST API
- Go: Gin/Echo REST API
- Node.js: Express/Koa REST API
- Python: FastAPI/Flask REST API
规则溯源
> 📋 本回复遵循:`api-design-safety` - API 设计安全规范