Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

HTTP 请求与响应

复习

  • 套接字:应用通过套接字通信
  • DNS 查询与缓存:先把域名解析成地址
  • 端口:网页服务常用 80 与 443

TL;DR

  • HTTP 是浏览器与服务器交换资源的请求-响应协议
  • 请求含方法、路径与首部;响应含状态码、首部与正文
  • 它是无状态的:每个请求彼此独立
  • 文本化的格式便于阅读与调试

正文

  有了地址,也连上了服务器,接下来它们之间“聊”什么?这就要看 HTTP(超文本传输协议,HyperText Transfer Protocol)——互联网上最常见的应用协议。

  HTTP 的模式非常单纯:客户端发一个请求,服务器回一个响应。

请求长什么样

  一次请求,大致包含:

  • 方法:想做什么,比如获取(GET)还是提交(POST)
  • 路径:想要哪个资源,比如 /index.html
  • 首部:一些附加说明,比如能接受什么格式

  比如你打开一个网页,浏览器可能发出 GET /index.html,意思是“把首页给我”。

响应长什么样

  服务器收到后,回一个响应,包含:

  • 状态码:结果如何
  • 首部:关于内容的说明,比如类型、长度
  • 正文:真正的内容(网页、图片等)

  状态码用三位数字,按大类区分:

  • 2xx:成功,比如 200 OK
  • 3xx:重定向,资源换地方了,比如 301
  • 4xx:客户端出错,比如 404 找不到
  • 5xx:服务器出错,比如 500

  看一眼数字就知道大概情况,这对排查问题非常方便。

无状态:每问每答,互不记挂

  HTTP 有一个很鲜明的特点:无状态

  意思是,每个请求都是独立的,服务器默认不记得“你上一次来过”。第一个请求和第二个请求之间,服务器不主动保留任何联系。这样设计让服务器更简单、更容易扩展——任何一台服务器都能处理任何一次请求。

  但也带来一个现实问题:如果记不住用户,那“登录”该怎么办?下一章要讲的 Cookie,正是为解决这个问题而生。

思考题 1

  HTTP 为什么被设计成“无状态”的?

思考题 2

  状态码 2xx3xx4xx5xx 分别大致表示什么?

小结

知识点

  • HTTP 采用请求-响应模型
  • 请求含方法、路径与首部
  • 响应含状态码、首部与正文
  • HTTP 无状态,为扩展性带来好处

参考资料

  1. Wikipedia(zh):超文本传输协议:万维网的数据通信协议
  2. Wikipedia(zh):HTTP状态码:用数字表示请求处理结果

思考题答案(仅供参考)

思考题 1

  因为每个请求独立处理,服务器不必为每个用户保存会话状态,实现更简单、更容易横向扩展,任一服务器都能处理任一次请求。代价是登录等需要“记住用户”的功能要靠额外机制来实现。

思考题 2

  2xx 表示成功;3xx 表示重定向,资源地址发生了变化;4xx 表示客户端一方有问题,比如请求的地址不存在;5xx 表示服务器一方出错,自身处理失败。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪