第 3 课:响应的信封:状态码及其含义
本课目标:
- 读懂 HTTP 响应的状态行。
- 把状态码归入正确的类别。
- 说明响应体是否存在。
服务器用一个三位数作答
服务器的回答同样是一个信封。信封的第一行是状态行,它总是以一个三位数的状态码开头。这个数字是服务器在说「我明白你的请求了」,或者「我找不到那个东西」,或者「我在处理时出故障了」12。
讲解
状态行
典型的响应这样开头:
状态码类别
状态码的第一位数字告诉你它的类别:
- 1xx:信息性(初学者很少见到)
- 2xx:成功,例如
200 OK3 - 3xx:重定向,例如
301 Moved Permanently - 4xx:客户端错误,例如
404 Not Found4 - 5xx:服务器错误,例如
500 Internal Server Error5
状态码不是随意的报错文字,而是标准化的类别。
2xx 承诺了什么,又没承诺什么
2xx 是关于这次 HTTP 事务的陈述:消息送到了、被理解了、也被回答了。它不是关于「你想办的事到底办成了没有」的陈述。一个把你密码判为错误的登录表单,完全可以回 200 OK,然后在响应体里写「密码错误」;请求成功了,登录没成功2。所以当事情看起来坏了、状态码却是绿的时,先读响应体,别急着断定请求失败。
中文这里还多一层坑:把 2xx 读成「成功」两个字,很容易顺手读成「业务成功」。协议层面的「成功」只管到「你的话我收到并回了」这一步。
响应头
响应也带头部,只不过它们描述的是这个回答、而不是那个问题1:
- Content-Type 说明响应体的格式,浏览器据此决定是解析 HTML、解码图片,还是把 JSON 交给脚本1。
- Content-Length 说明响应体有多少字节1。
- Location 出现在重定向响应上,装着接下来要去的那个 URL6。
- Set-Cookie 要求浏览器存下一个值,并在后续请求里带回来7。
- Cache-Control 说明这个响应是否可以被重复使用、可以用多久8。
缓存:重用与校验是两件事
Cache-Control 是误解最密集的地方。私有缓存只服务一个客户端——通常就是浏览器自己的缓存;共享缓存待在客户端和服务器之间,可以用同一份存下来的副本服务很多用户8。有两个指令长得像、意思完全不同:no-store 是连副本都不许留,而 no-cache 允许存,只是要求浏览器在重用存下来的东西之前先跟服务器核对一次8。这次核对叫校验,它最省的那种回答是 304 Not Modified:不带响应体,只说一句「你手上那份还有效」86。
no-cache 这个名字在中文里格外容易骗人:直译成「无缓存」,字面就是「不缓存」,而它真正的意思是「可以缓存,但每次用前必须问一句」。真正的「不许缓存」是 no-store。
响应体
在响应头之后,响应可能带有一个响应体:浏览器索取的 HTML、图片、JSON 或其他数据本身。有些响应没有响应体,比如 204 No Content,因为状态码和响应头已经把答案说完了1。
完整示例(跟着做)
下面是一次 GET 请求得到的成功响应:
- 状态码:
200(成功) Content-Type: text/html告诉浏览器响应体是 HTML。Content-Length: 1276告诉浏览器要接收多少字节。- 响应体就是那个 HTML 页面。
再看一个 404 响应:
服务器在正常工作;它只是没有浏览器要的那个页面。
你来试试(填空示例)
把每个状态码和它的类别对上:
小结 + 下一步
响应以状态码开头。第一位数字告诉你类别:2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误。状态行和响应头之后,响应可能带着响应体。下一课,你将看到在浏览器里的什么位置能读到这一切。
Footnotes
-
MDN: HTTP messages — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Messages ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
MDN: HTTP response status codes — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status ↩ ↩2 ↩3
-
MDN: 200 OK — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200 ↩
-
MDN: 404 Not Found — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/404 ↩
-
MDN: 500 Internal Server Error — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/500 ↩
-
MDN: Redirections in HTTP — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections ↩ ↩2
-
MDN: Using HTTP cookies — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies ↩
-
MDN: HTTP caching — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Caching ↩ ↩2 ↩3 ↩4
练习
常见误判分析:一位学习者看到 404 Not Found,说「这个网站挂了」。解释为什么这个结论通常是错的,正确的结论应该是什么。
第 2 级(进阶)我的笔记
记下想法、痛点、没懂的地方。只写进这门课的附录,正课文件不动。