调接口时只看到返回的 JSON,状态码是 200 还是 500 全靠猜。同事说在 curl 后面加个 -i,响应行和响应头就一起打出来了。
-i 是 include 的意思,把 HTTP 状态行、响应头、空行、响应体全部输出到标准输出。第一行类似 HTTP/1.1 200 OK,下面几行是 Content-Type、Content-Length、Set-Cookie 这些字段。
curl -i https://example.com/api/health和 -I、-v 不是一回事
-I 只发 HEAD 请求,拿响应头不看正文,探测资源是否存在最省流量;-v 打印整个通信过程,请求头、TLS 握手、连接信息都有,排查连不上时用;-i 是正常请求加响应头,最接近浏览器收到的东西。三个参数别混着用。
响应头里能看出什么
接口返回 302,看 Location 就知道跳到哪;页面乱码,看 Content-Type 里的 charset;登录状态不对,看 Set-Cookie 有没有下发、Domain 和 Path 对不对;缓存不更新,看 Cache-Control 和 ETag。排查跨域问题时,Access-Control-Allow-Origin 也在头里。响应头里的 Server、X-Powered-By 能看出后端用了什么,排查环境差异有点用。
只想存响应头,用 -D header.txt,正文用 -o body.json 另存。用 -i 再重定向到文件时,头也会写进去,解析 JSON 前得先跳过前面几行。脚本里判断成功失败,用 -f 让 curl 在 4xx、5xx 时返回非零退出码,比 grep 状态码稳。响应体是二进制文件时别直接 -i 打到终端,先 -o 存下来再看。
还有个容易忽略的地方:加了 -L 跟随跳转时,-i 会把每一跳的响应头都打出来,中间可能夹着 301 和 302 的头,看着会乱。只想看跳转后的那次响应,用 -D 存头文件再配合 -o 存正文更清楚。
平时看接口,curl -i 够用了;要复现浏览器完整请求,加 -v 慢慢看。别把 -i 当成只看响应头,那是 -I 的活。