HTTP 响应报文怎么看:状态行、响应头和响应体
围绕HTTP 响应报文章节,拆解状态行、响应头、空行和响应体,并说明状态码、重定向、缓存和 Cookie 应该怎么看。
相关工具
响应报文回答的是:服务器怎么回
上一篇看的是 HTTP 请求报文,它回答“客户端发了什么”。响应报文回答另一半问题:服务器收到请求后,怎么把处理结果返回给客户端。文中把标准 HTTP 响应报文拆成状态行、响应头、空行和响应体,这个拆法很适合排查网页和接口问题。
看响应报文时,第一眼不要先看正文。先看状态行,尤其是状态码。状态码能告诉你请求大致成功、跳转、缓存命中、客户端错误还是服务器错误。接着看响应头,判断内容类型、缓存策略、重定向位置、Cookie 设置等信息。最后再看响应体,也就是服务器真正返回的内容。
很多问题只看页面显示是看不出来的。浏览器里看到一段错误文案,背后可能是 404,也可能是 200 返回了一页错误 HTML;接口工具里看到 JSON 解析失败,可能是服务端实际返回了 HTML 登录页。响应报文能把这些情况拆开。

状态行判断结果,响应头补充规则,响应体放实际内容。
状态行:协议版本、状态码、状态消息
状态行一般长这样:`HTTP/1.1 200 OK`。它包含三部分:HTTP 协议版本、状态码、状态消息。协议版本说明服务器按哪个 HTTP 版本返回,状态码是三位数字,状态消息是对状态码的简短说明。
文中用 `HTTP/1.1 200 OK` 作为例子。`200` 表示请求成功,`OK` 是状态消息。实际排查时,状态消息可以帮助阅读,但最应该盯住的是状态码。因为不同客户端、框架或代理可能对消息文本处理不完全一致,三位数字才是核心。
状态码不是这篇的重点,后面会单独讲。这里先记住几个方向:2xx 多数表示成功,3xx 多数表示重定向或缓存相关,4xx 多数表示客户端请求有问题,5xx 多数表示服务器处理失败。先看状态码,能少走很多弯路。
响应头:服务器把规则写在这里
响应头和请求头一样,也是 `key: value` 的形式。文中列了几个常见字段:Content-Type、Content-Length、Server、Location、Set-Cookie。它们不是正文内容,却经常决定浏览器怎么处理响应。
`Content-Type` 指定响应体的 MIME 类型。返回 HTML、JSON、图片、下载文件,浏览器的处理方式都不同。接口明明应该返回 JSON,却返回了 `text/html`,通常说明你拿到的可能不是接口数据,而是错误页、登录页或网关页面。
`Content-Length` 表示响应体长度。它能帮助判断响应是不是异常为空,或者文件大小是否符合预期。`Server` 会暴露服务器软件信息,有些生产环境会隐藏或弱化它。`Location` 常见于重定向,浏览器会根据它跳到新的地址。`Set-Cookie` 用来让浏览器保存 Cookie,登录态、会话追踪经常依赖它。

响应头能解释页面类型、跳转、缓存和会话问题。
空行:响应头和响应体的边界
响应头后面也有一个空行,用来分隔头部和主体。空行之前是服务器返回的元信息,空行之后才是实际内容。文中把它单独列出来,是因为 HTTP 文本报文靠这个边界完成解析。
你平时不需要手写这个空行,但看原始响应时要知道它存在。抓包、代理日志、网关调试里,空行能帮你判断哪一部分是 header,哪一部分是 body。
如果响应头里写了 `Content-Type: text/html; charset=UTF-8`,空行之后一般就是 HTML。若写的是 `application/json`,空行之后通常应该是 JSON。头部和主体不一致时,就要小心中间层或后端返回是否异常。
响应体:真正返回给客户端的内容
响应体包含服务器返回的实际数据。请求网页时,它可能是一段 HTML;请求接口时,可能是 JSON;请求图片时,就是图片二进制数据。响应体是否存在,取决于请求类型、状态码和服务器处理结果。
示例里,响应体是一段完整 HTML:`<!DOCTYPE html>`、`<html>`、`<head>`、`<body>`。浏览器拿到后会继续解析,构建 DOM、加载 CSS 和 JavaScript,再把页面渲染出来。
请求排查时,响应体要和状态码一起看。状态码是 200,但响应体里写着业务错误,也可能代表 HTTP 层成功、业务层失败。状态码是 500,响应体里可能有错误详情,也可能被生产环境隐藏。不要只凭一个字段下结论。
重定向时重点看 Location
当状态码是 301、302、307、308 这类重定向状态时,响应头里的 `Location` 就很关键。它告诉客户端下一步该去哪里。浏览器默认会自动跟随跳转,所以用户看到的最终页面,可能已经不是第一次请求的地址。
排查登录跳转、HTTP 跳 HTTPS、旧域名跳新域名、接口被网关重定向时,要关掉自动跟随,先看第一跳的响应。第一跳状态码是多少,Location 指向哪里,请求方法有没有被改变,这些信息比最终页面更重要。
如果接口预期返回 JSON,却返回 302 并跳到登录页,前端可能会报 JSON 解析失败。真正的问题不是 JSON 格式错了,而是请求没有带登录态,服务端让它跳登录。
Cookie 和缓存也藏在响应头里
`Set-Cookie` 用来让浏览器保存 Cookie。登录成功后,服务器常通过这个响应头写入 session id 或其他会话信息。下一次请求同域名时,浏览器再把 Cookie 放进请求头发回服务器。
`Cache-Control` 虽然在 相关的常见字段里归到通用头部,但排查响应时也经常要看。它决定资源能不能缓存、缓存多久、是否必须重新验证。页面明明更新了,用户还看到旧内容,很多时候要看缓存头和浏览器缓存状态。
所以响应头不是可有可无的附属信息。页面类型、文件大小、服务信息、跳转地址、Cookie、缓存策略,都在这里。响应体告诉你“内容是什么”,响应头告诉你“客户端应该怎么处理这些内容”。
一段响应报文可以这样读
文中的响应示例可以简化成这样:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Server: Apache/2.4.38 (Unix)
Set-Cookie: session_id=abcd1234; Expires=Wed, 11 Aug 2023 00:00:00 GMT
<!DOCTYPE html>
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>第一行表示请求成功。`Content-Type` 说明响应体是 HTML,编码是 UTF-8。`Content-Length` 表示响应体长度。`Server` 暴露了服务端软件。`Set-Cookie` 要求浏览器保存一个会话 Cookie。空行之后,就是实际 HTML 内容。
这样读一遍,你就能把响应报文从“服务器返回的一坨东西”拆成几个可判断的部分。后面看状态码、缓存、Cookie、重定向,都会更顺。
常见问题
状态码 200 就一定表示业务成功吗?
不一定。200 只说明 HTTP 层请求成功,业务是否成功还要看响应体里的业务码、错误信息或数据结构。
Location 头什么时候出现?
常见于 3xx 重定向响应。它告诉客户端下一步跳转到哪个 URL。
Content-Type 错了会怎样?
客户端可能按错误方式解析响应。例如接口实际返回 HTML,却被前端当 JSON 解析,就会报解析错误。