目录
- 1.签名
- 2.加密
- 3.IP白名单
- 4.限流
- 5.参数校验
- 6.统一返回值
- 7.统一封装异常
- 8.请求日志
- 9.幂等设计
- 10.限制记录条数
- 11.压测
- 12.异步处理
- 13.数据脱敏
- 14.完整的接口文档
- 15.请求方式
- 16.请求头
- 17.批量操作
- 18.职责单一
1.签名
目的
:防止数据被篡改。
方法:
- 接口请求方将请求参数、时间戳和密钥拼接成一个字符串;
- 使用MD5等hash算法生成签名(sign);
- 在请求参数或请求头中增加sign参数传递给API接口;
- API接口网关服务验证传递的 sign 值,与自己生成的 sign 值对比,若相等则认为是有效请求。
时间戳的作用
:防止同一次请求被反复利用,增加密钥被破解的可能性,每次请求设置合理的过期时间(如:15分钟)。
2.加密
目的
:保护重要数据(如:密码、银行卡号等)。
方法:
- 使用AES对称加密算法;
- 在前端使用公钥加密用户密码;
- 在注册接口中使用密钥解密并做相关校验;
3.IP白名单
目的
:防止恶意请求。
方法:
- 限制请求IP;
- 添加IP白名单在API网关服务上;
- 防止内部服务器被攻破,需增加 web 防火墙。
4.限流
目的
:防止API接口被频繁调用导致服务不可用。
方法:
- 对请求IP、请求接口、请求用户做限流;
- 使用Nginx、Redis或Gateway 实现限流功能。
5.参数校验
目的
:拦截无效请求,保护系统资源。
方法:
- 校验字段是否为空、字段类型、字段长度、枚举值等;
- 使用Hibernate Validator框架进行校验,如:@Null、@NotEmpty、@Size、@Max、@Min等。
6.统一返回值
目的
:避免返回值结构不统一,便于接口维护。
方法:
- 返回异常通过API网关捕获并转换成统一的异常结构返回。
7.统一封装异常
目的
:防止泄露敏感信息。
方法:
{"code":1000,"message":"服务器内部错误","data":null
}
8.请求日志
目的
:便于快速分析和定位问题。
方法:
- 记录请求URL、参数、头信息、请求方式、响应数据和响应时间等;
- 使用traceId串联整个请求的日志。
9.幂等设计
目的
:防止多次请求产生错误数据。
方法:
- 使用数据库唯一索引或Redis保存requestId和请求参数来保证幂等性。
10.限制记录条数
目的
:避免接口超时问题。
方法:
- 限制批量接口请求的数量(如最多1000条记录);
- 超过限制直接提示用户。
11.压测
目的
:了解各接口的QPS情况,确保上线后的稳定性。
方法:
- 使用 jmeter 或 apache bench 进行压力测试。
12.异步处理
目的
:提升复杂业务逻辑的接口性能。
方法:
- 接口发送MQ 消息后立即返回成功,消息由 MQ 消费者异步处理。
13.数据脱敏
目的
:保护敏感数据,防止隐私泄露。
方法:
- 返回数据中部分内容用星号代替(如用户手机号显示为182****887).
14.完整的接口文档
目的
:减少沟通成本,方便对接。
方法:
- 接口地址、请求方式、请求参数和字段介绍、返回值和字段介绍、返回码和错误信息、加密或签名示例、请求demo等。
15.请求方式
方法:
- 根据实际情况选择合适的请求方式(如GET、POST等)。
16.请求头
方法:
- 将公共功能参数,如权限验证、traceId参数放入Header请求头中,使用统一拦截器解析。
17.批量操作
目的
:满足更多业务场景需求。
方法:
- 设计支持批量操作的接口,避免单个操作导致效率低下。
18.职责单一
目的
:降低接口维护成本。
方法:
- 接口设计应职责单一,避免复杂的 if…else 判断。