HTTP:请求与响应入门 · 第 3 / 6 节

第 3 课:响应的信封:状态码及其含义

本课目标:

  • 读懂 HTTP 响应的状态行。
  • 把状态码归入正确的类别。
  • 说明响应体是否存在。

上一篇 << 2 | 下一篇 4 >>

服务器用一个三位数作答

服务器的回答同样是一个信封。信封的第一行是状态行,它总是以一个三位数的状态码开头。这个数字是服务器在说「我明白你的请求了」,或者「我找不到那个东西」,或者「我在处理时出故障了」12

讲解

状态行

典型的响应这样开头:

http
HTTP/1.1 200 OK
  • HTTP/1.1 是协议版本。
  • 200 是状态码。
  • OK原因短语,一个简短的人类可读标签。原因短语只是提示,真正起作用的是数字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 请求得到的成功响应:

http
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 1276
<!doctype html><html>...</html>
  • 状态码:200(成功)
  • Content-Type: text/html 告诉浏览器响应体是 HTML。
  • Content-Length: 1276 告诉浏览器要接收多少字节。
  • 响应体就是那个 HTML 页面。

再看一个 404 响应:

http
HTTP/1.1 404 Not FoundContent-Type: text/html

服务器在正常工作;它只是没有浏览器要的那个页面。

你来试试(填空示例)

把每个状态码和它的类别对上:

状态码类别
2002xx,成功
4044xx,客户端错误
5005xx,服务器错误
3013xx,重定向

小结 + 下一步

响应以状态码开头。第一位数字告诉你类别:2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误。状态行和响应头之后,响应可能带着响应体。下一课,你将看到在浏览器里的什么位置能读到这一切。

Footnotes

  1. MDN: HTTP messages — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Messages 2 3 4 5 6

  2. MDN: HTTP response status codes — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status 2 3

  3. MDN: 200 OK — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200

  4. MDN: 404 Not Found — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/404

  5. MDN: 500 Internal Server Error — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/500

  6. MDN: Redirections in HTTP — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections 2

  7. MDN: Using HTTP cookies — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies

  8. MDN: HTTP caching — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Caching 2 3 4

练习

01

打开浏览器的 Network 面板,重新加载一个页面,点击一条请求。查看响应头。你能找到状态码和 Content-Type 头吗?

第 1 级(热身)
完成标准 · 本地勾选
02

常见误判分析:一位学习者看到 404 Not Found,说「这个网站挂了」。解释为什么这个结论通常是错的,正确的结论应该是什么。

第 2 级(进阶)
完成标准 · 本地勾选

我的笔记

记下想法、痛点、没懂的地方。只写进这门课的附录,正课文件不动。