HTTP 调试核心目标:看请求头、请求体、响应头、响应体、状态码、耗时、Cookie、重定向、SSL/TLS、代理,定位参数错误、跨域、超时、报文格式、服务端返回异常等问题。下面分客户端工具、代码内埋点、抓包工具、服务端调试、网络底层、常见坑完整整理。
一、接口快速测试工具(构造 HTTP 请求)
适合手动发请求,验证接口是否正常。
Postman / Apifox
支持 GET/POST/PUT/DELETE,自定义 Header、Cookie、Query、Body (form‑data/x‑www‑form‑urlencoded/json)
看完整 Request/Response,状态码、响应时间,支持环境变量、代理、SSL 关闭校验
curl(命令行,最通用)
# 完整打印请求+响应,-v verbose看完整HTTP报文 curl -v -X POST https://api.example.com/test \ -H "Content-Type:application/json" \ -d '{"name":"test"}' # 保存响应到文件 curl -v https://api.example.com > resp.txt-v会输出 DNS 解析、TCP 连接、SSL 握手、完整 http request/response 报文,定位握手、证书问题非常好用。httpie(curl 替代品,输出格式化)
http -v POST https://api.example.com/test name=test

二、浏览器调试(前端 HTTP,最常用)
F12 → Network (网络)面板
过滤:选择
Fetch/XHR只看 ajax/fetch 请求;All 看全部 http 请求(图片、js、css)选中一条请求:
Headers:请求头、响应头、Query 参数、请求 URL、状态码
Payload:请求参数,form/json body
Response:服务端返回报文
Initiator:哪个 JS 代码发起的请求
Timing:DNS、TCP、SSL、TTFB、下载耗时,定位慢请求
重放请求:右键请求 → Replay,或者「Copy as fetch/curl」复制报文到其他工具复现。
局限:浏览器受同源策略、浏览器缓存、Cookie、CORS 限制;看不到非浏览器程序(Java/Python 后端、APP)的 http 流量。
三、抓包工具:捕获进程真实 HTTP 流量
浏览器 Network 只能看浏览器;抓包可以看后端服务、APP、桌面程序真实网络报文。
1. Fiddler(Windows)
原理:本地 HTTP 代理,程序把代理指向 Fiddler,全部 http 流量走它。
可以查看、修改、拦截、重放请求;修改 Request/Response 做 Mock。
HTTPS:需要安装 Fiddler 根证书,才能解密 https 报文。
注意:代码里要配置 HTTP 代理
127.0.0.1:8888;Java 需要把 Fiddler 证书导入 JDK 信任库,否则报 SSL 握手失败。
2. Charles(Mac/Windows)
和 Fiddler 类似,代理抓包,移动端 APP 抓包高频使用,手机 wifi 设置代理到本机 IP,安装证书抓 HTTPS。
3. Wireshark(底层数据包抓包)
工作在 TCP/IP 层,不是 HTTP 代理。
可以抓本机、局域网所有数据包;HTTPS 默认是密文,无法直接看到 http 明文。
适合排查:TCP 丢包、RST 断开、端口不通、DNS 异常;想看 http 明文优先用 Fiddler/Charles。
如果要解密 HTTPS:需要浏览器导出 SSL key log,Wireshark 加载密钥文件解密。
4. mitmproxy(命令行 / WEB 界面,开源)
mitmproxy # 交互式控制台抓包
mitmweb # 浏览器web界面查看流量
作为中间人代理,脚本可以自动化修改 http 请求响应,自动化测试调试很方便。
四、代码层面埋点调试 HTTP 请求
Java(SpringBoot / RestTemplate / OkHttp / HttpClient)
OkHttp:开启拦截器打印完整报文
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor(System.out::println)
.setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
BODY 级别会打印请求头、请求体、响应头、响应体;生产环境关闭,避免日志泄露敏感数据。
Spring RestTemplate:添加拦截器输出报文
Spring WebClient:配置 ExchangeStrategies 打印请求响应 body
Apache HttpClient:设置 logger 级别
DEBUG,输出 http 完整报文
# logback
<logger name="org.apache.http" level="DEBUG"/>
⚠️ Java 使用代理抓 HTTPS:必须把抓包工具证书导入 JDK cacerts,否则 SSLHandshakeException。
Python requests
import requests
import logging
import http.client
http.client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
resp = requests.get("https://api.example.com")
Node.js axios
配置拦截器打印 request /response
axios.interceptors.request.use(req=>{
console.log("req:",req.method,req.url,req.headers,req.data);
return req;
})
axios.interceptors.response.use(res=>{
console.log("resp:",res.status,res.data);return res;
})
五、服务端侧调试 HTTP
SpringBoot
开启 Tomcat 访问日志
server.tomcat.accesslog.enabled=true,记录每个请求 url、状态码、ip、耗时。过滤器 Filter,打印 HttpServletRequest 的请求头、参数。
HttpServletRequest 的 Body 流只能读取一次,读取后业务拿不到,需要包装 Request 重写流。
Nginx access_log / error_log
access_log logs/access.log main;
记录客户端 IP、请求方法、url、状态码、响应大小、耗时、请求头。 可以看到请求有没有到达服务端;区分是客户端错误,还是 Nginx 层错误,还是后端应用错误。

六、定位常见 HTTP 问题调试思路
接口返回 4xx:400 参数错误、401 未鉴权、403 权限、404 路径错;对比抓包工具和代码发出的真实报文:Header、Content‑Type、body 格式是否一致。很多时候代码发送的 body 和你以为的不一样。
5xx:服务端异常,看服务端日志 + nginx 日志。
SSL/TLS 握手失败:用
curl -v排查;证书过期、证书不信任、TLS 版本不匹配。请求超时:Network Timing /curl -v 看卡在哪个阶段:DNS?TCP 连接?还是服务端 TTFB 慢。
跨域 CORS:浏览器 Network 看响应头
Access‑Control‑*;注意:跨域报错只发生浏览器,curl/postman 不会复现 CORS。代码和 postman 结果不一样:抓包!对比两边真实报文,很多坑:编码、header 大小写、多余换行、隐形字符、Cookie、代理、证书。
七、选型建议
重要提醒:生产环境不要开启 BODY 级别的 http 报文日志,会泄露密码、token 等敏感信息。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢