在我们进行接口测试时会出现若干问题,比如遇到是超时、错误码、返回数据异常还是完全无响应,这个时候我们就要收集接口的具体信息如请求参数、返回结果、错误日志、发生时间等。
接口出现问题后我们应该先做基本的排查,确认网络连接是否正常可以使用ping/telnet测试接口服务器是否可达,其次确认接口的URL地址输入是否正确,然后确认认证信息API密钥、token等是否有效,最后再确认接口的请求方法GET/POST/PUT等是否正确。
请求层面进行排查,使用Postman/CURL重现问题直接测试接口,检查头Content-Type、Accept请求头等是否正确,验证接口的请求参数格式、类型、必填项是否满足要求,再次检查请求体JSON/XML等数据格式是否正确。
可以使用日志追踪的形式进行排查接口出现的问题,比如查看客户端请求前后发出的日志,检查接口对应的服务器接口处理处理过程中的错误信息,在分布式系统中可以追踪全链路日志进行排查。
一、明确问题现象(先决条件)错误类型分类超时类:响应时间超过阈值(如HTTP 504)
错误码类:HTTP 4xx(客户端错误)/5xx(服务端错误)
逻辑错误:HTTP 200但返回数据异常
完全无响应:TCP连接失败
关键信息收集代码语言:javascript代码运行次数:0运行复制# 示例:通过curl记录完整请求信息
curl -v -X POST "https://api.example.com/data" \
-H "Authorization: Bearer token123" \
-d '{"key":"value"}' \
--output response.txt \
--trace-ascii debug.log# 示例:通过curl记录完整请求信息curl -v -X POST "https://api.example.com/data" \-H "Authorization: Bearer token123" \-d '{"key":"value"}' \--output response.txt \--trace-ascii debug.log二、分层排查法(OSI模型视角)1. 网络层验证代码语言:javascript代码运行次数:0运行复制# 连通性测试
ping api.example.com
telnet api.example.com 443
traceroute api.example.com
# 防火墙检查
iptables -L -n # Linux
netsh advfirewall show allprofiles # Windows# 连通性测试ping api.example.comtelnet api.example.com 443traceroute api.example.com# 防火墙检查iptables -L -n # Linuxnetsh advfirewall show allprofiles # Windows2. 传输层验证代码语言:javascript代码运行次数:0运行复制# 查看TCP连接状态
netstat -ano | grep 443
ss -tnlp | grep java # 查看服务监听状态# 查看TCP连接状态netstat -ano | grep 443ss -tnlp | grep java # 查看服务监听状态3. 应用层验证请求验证工具链
代码语言:javascript代码运行次数:0运行复制# 使用httpie测试API
http POST https://api.example.com/data key==value \
Authorization:"Bearer token123"
# 使用jq解析响应
curl -s https://api.example.com/data | jq '.error'# 使用httpie测试APIhttp POST https://api.example.com/data key==value \Authorization:"Bearer token123"# 使用jq解析响应curl -s https://api.example.com/data | jq '.error'三、问题定位矩阵列表图片四、深度诊断工具链全链路追踪代码语言:javascript代码运行次数:0运行复制// Spring Cloud Sleuth日志标记
@Slf4j
public class ApiController {
@GetMapping("/data")
public ResponseEntity> getData(Span span) {
log.info("TraceID: {}", span.context().traceId());
// ...
}
}// Spring Cloud Sleuth日志标记@Slf4jpublic class ApiController { @GetMapping("/data") public ResponseEntity> getData(Span span) { log.info("TraceID: {}", span.context().traceId()); // ... }}内存/线程分析代码语言:javascript代码运行次数:0运行复制# 使用arthas诊断JVM
thread -n 3 # 查看最忙线程
dashboard # 实时资源监控# 使用arthas诊断JVMthread -n 3 # 查看最忙线程dashboard # 实时资源监控数据库层验证代码语言:javascript代码运行次数:0运行复制-- 检查慢查询
SELECT * FROM information_schema.processlist
WHERE TIME > 5 AND COMMAND != 'Sleep';
-- 查看锁竞争
SHOW ENGINE INNODB STATUS;-- 检查慢查询SELECT * FROM information_schema.processlist WHERE TIME > 5 AND COMMAND != 'Sleep';-- 查看锁竞争SHOW ENGINE INNODB STATUS;五、经典问题案例库SSL握手失败现象:curl: (35) SSL connect error
解决方案:openssl s_client -connect api.example.com:443
请求头缺失现象:HTTP 415 Unsupported Media Type
修复:Content-Type: application/json
时区问题现象:创建时间比实际晚8小时
验证:SELECT @@global.time_zone, @@session.time_zone;
六、自动化预防方案接口监控三板斧代码语言:javascript代码运行次数:0运行复制# Prometheus监控规则示例
- alert: APIHighErrorRate
expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.1
for: 10m# Prometheus监控规则示例- alert: APIHighErrorRate expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.1 for: 10m混沌工程验证代码语言:javascript代码运行次数:0运行复制# 使用chaosblade模拟网络延迟
blade create network delay --time 3000 --interface eth0# 使用chaosblade模拟网络延迟blade create network delay --time 3000 --interface eth0接口测试出现问题后,我们要实施分层递进的排查方式,结合自动化工具,可以系统化定位90%以上的接口问题。在我们的实际工作中应该建立《接口故障自查手册》作为团队知识库,团队内部及时的总结经验,给后续的工作提升效能打下基础。