🔌 第一章 浏览器生成消息
📄 一句话概括

请求消息三段式——请求行(方法+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 秒实验

  1. 用 telnet 或 curl -v 对某网站发一条手写的 GET,看响应。
  2. 在开发者工具里找一条 POST 请求,核对 Content-Type 的值。
  3. 把 Host 头删掉再发,看服务器如何回应(现代服务器会报 400)。

常见误区

  1. 以为请求头可有可无——Host 头在 1.1 版里是必填的。
  2. 以为 GET 不能带参数——参数拼在 URI 尾部,只是没有独立的体。
自测三问(点开对答案) 1. 请求消息的第一行写什么? —— 方法+URI+版本号(请求行)。 2. 头部和消息体之间用什么分隔? —— 一个空行。 3. POST 多出来的两样头部是什么? —— Content-Type 和 Content-Length。

相关笔记