📄 一句话概括
请求消息三段式——请求行(方法+URI+版本)、消息头(一行一条属性)、空行之后的消息体;GET 没有体,POST 才有。
📝 本节和前面几节的关系
1.1.4 定了思路;本篇把思路落成具体文本——浏览器到底写出一封什么样的信。
一、第一行:请求行
格式是【方法 URI 版本】,例如 GET /dir1/file1.html HTTP/1.1。 URI 直接用 1.1.2 解析出来的路径(含默认文件补全)。
二、第二行起:消息头
一行一条【属性名: 值】——告诉服务器环境信息: Host(哪台主机)、User-Agent(什么浏览器)、 Accept-Language(想要什么语言)等等。
三、空行之后:消息体
GET 没有消息体;POST 用它装表单数据, 并在头部写 Content-Type 和 Content-Length 让服务器知道怎么读。
四、动手 Demo:手搓一条 GET 请求
完整请求文本用脚本拼出来:
req = ['GET /dir1/file1.html HTTP/1.1',
'Host: www.lab.glb.com',
'User-Agent: DemoClient/1.0',
'Accept-Language: zh-cn',
'']
print(chr(10).join(req))
实跑输出:
--------------------------------------------------------------------
手搓一条 GET 请求
--------------------------------------------------------------------
浏览器生成的请求消息,原文长这样(GET 版):
GET /dir1/file1.html HTTP/1.1
Host: www.lab.glb.com
User-Agent: Mozilla/5.0 ...
Accept: text/html, */*
Accept-Language: zh-cn
(空行)
三段式:请求行(方法 + URI + 版本)→ 消息头(一行一条)→
空行之后是消息体(GET 没有体,POST 才有)。
POST 版只多两行头 + 一个体:
POST /register.cgi HTTP/1.1
Host: www.lab.glb.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
(空行)
name=bozai&mail=bozai@lab
最后一行是空行——它就是头与体的分界线; 服务器逐行读到空行就知道:头部完了。
30 秒实验
- 用 telnet 或 curl -v 对某网站发一条手写的 GET,看响应。
- 在开发者工具里找一条 POST 请求,核对 Content-Type 的值。
- 把 Host 头删掉再发,看服务器如何回应(现代服务器会报 400)。
常见误区
- 以为请求头可有可无——Host 头在 1.1 版里是必填的。
- 以为 GET 不能带参数——参数拼在 URI 尾部,只是没有独立的体。
自测三问(点开对答案)
1. 请求消息的第一行写什么? —— 方法+URI+版本号(请求行)。 2. 头部和消息体之间用什么分隔? —— 一个空行。 3. POST 多出来的两样头部是什么? —— Content-Type 和 Content-Length。- ☐ 下一节(1.1.6 发送请求后会收到响应)
相关笔记
- HTTP的基本思路 —— 本篇是它的文本化
- 发送请求后会收到响应 —— 信寄出去,看回信
- 🔌 网络是怎样连接的 · 索引