HTTP 请求与响应
复习
- 套接字:应用通过套接字通信
- DNS 查询与缓存:先把域名解析成地址
- 端口:网页服务常用 80 与 443
TL;DR
- HTTP 是浏览器与服务器交换资源的请求-响应协议
- 请求含方法、路径与首部;响应含状态码、首部与正文
- 它是无状态的:每个请求彼此独立
- 文本化的格式便于阅读与调试
正文
有了地址,也连上了服务器,接下来它们之间“聊”什么?这就要看 HTTP(超文本传输协议,HyperText Transfer Protocol)——互联网上最常见的应用协议。
HTTP 的模式非常单纯:客户端发一个请求,服务器回一个响应。
请求长什么样
一次请求,大致包含:
- 方法:想做什么,比如获取(GET)还是提交(POST)
- 路径:想要哪个资源,比如
/index.html - 首部:一些附加说明,比如能接受什么格式
比如你打开一个网页,浏览器可能发出 GET /index.html,意思是“把首页给我”。
响应长什么样
服务器收到后,回一个响应,包含:
- 状态码:结果如何
- 首部:关于内容的说明,比如类型、长度
- 正文:真正的内容(网页、图片等)
状态码用三位数字,按大类区分:
2xx:成功,比如200 OK3xx:重定向,资源换地方了,比如3014xx:客户端出错,比如404找不到5xx:服务器出错,比如500
看一眼数字就知道大概情况,这对排查问题非常方便。
无状态:每问每答,互不记挂
HTTP 有一个很鲜明的特点:无状态。
意思是,每个请求都是独立的,服务器默认不记得“你上一次来过”。第一个请求和第二个请求之间,服务器不主动保留任何联系。这样设计让服务器更简单、更容易扩展——任何一台服务器都能处理任何一次请求。
但也带来一个现实问题:如果记不住用户,那“登录”该怎么办?下一章要讲的 Cookie,正是为解决这个问题而生。
思考题 1
HTTP 为什么被设计成“无状态”的?
思考题 2
状态码
2xx、3xx、4xx、5xx分别大致表示什么?
小结
知识点
- HTTP 采用请求-响应模型
- 请求含方法、路径与首部
- 响应含状态码、首部与正文
- HTTP 无状态,为扩展性带来好处
参考资料
- Wikipedia(zh):超文本传输协议:万维网的数据通信协议
- Wikipedia(zh):HTTP状态码:用数字表示请求处理结果
思考题答案(仅供参考)
思考题 1
因为每个请求独立处理,服务器不必为每个用户保存会话状态,实现更简单、更容易横向扩展,任一服务器都能处理任一次请求。代价是登录等需要“记住用户”的功能要靠额外机制来实现。
思考题 2
2xx 表示成功;3xx 表示重定向,资源地址发生了变化;4xx 表示客户端一方有问题,比如请求的地址不存在;5xx 表示服务器一方出错,自身处理失败。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪