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

第 2 课:请求的信封:方法、路径与请求头

本课目标:

  • 在请求中识别 HTTP 方法。
  • 在请求中识别路径或 URL。
  • 说出至少一个常见请求头,并解释它的作用。

上一篇 << 1 | 下一篇 3 >>

一封信需要动作、地址,还有信封上的备注

浏览器发请求时,并不是大喊一声「把页面给我」。它会写一个正式的信封。这个信封有三个部分:它想做什么、想在哪里做,以及写给服务器的几条附加备注。

在 HTTP 里,这三个部分分别叫方法路径请求头1

讲解

方法:动作

HTTP 方法是一个单词,说明浏览器想做什么。最常见的两个是:

  • GET:「请把这个资源发给我。」2
  • POST:「这里有一些数据,请收下。」3

大多数页面加载用的是 GET。HTTP 还定义了另外几个:PUT 整体替换一个资源,DELETE 删除一个资源,PATCH 做局部修改,HEAD 索取和 GET 一样的响应但不要响应体4

安全、幂等、可缓存

方法之间在三项性质上有差别,而这三个词不是同义词4

  • 安全的方法是只读的:它不应该改变服务器上的任何东西。GET 和 HEAD 是安全的,POST 不是4
  • 幂等的方法可以重复执行,最终结果和只执行一次相同。GET、PUT、DELETE 是幂等的,POST 不是——同一个 POST 发两次,可能就下了两笔订单4
  • 可缓存的方法,其响应可以被存下来重复使用。GET 默认可缓存,POST 只在特定条件下可缓存4

要注意它没有说什么:这三项是语义,是关于「意思」的约定,而不是网络会替你强制执行的能力。服务器完全有能力在收到一个 GET 时删掉一条记录;这么做只是违反了所有缓存、爬虫和浏览器预取都赖以工作的那份约定4

路径:地址

路径是 URL 中域名之后的部分。对 https://example.com/about 来说,路径是 /about。请求本身只写路径,因为域名已经放在一个请求头里发出去了15。路径加上查询字符串合起来叫请求目标——请求行里的第二个位置,在方法之后、协议版本之前1

请求头:附加备注

请求头是跟在请求行之后的元数据行。每个请求头都有名字和值,用冒号隔开。例如:

http
Host: example.comUser-Agent: Mozilla/5.0Accept: text/html

Host 头告诉服务器这个请求属于哪个域名。User-Agent 头告诉服务器是哪个浏览器在发问。Accept 头告诉服务器浏览器能处理哪类内容1。头部的名字大小写不敏感1

请求体

GET 请求通常不带请求体2。POST 带:被提交的数据跟在头部之后,中间用一个空行隔开1。有两个头专门描述这个请求体——Content-Type 说明接收方该按什么格式来解析它,Content-Length 说明要读多少字节13。表单常用的一种编码是 application/x-www-form-urlencoded,它把各个字段像查询字符串那样打包成键值对1

只要服务器在此前某个响应里发过 Set-Cookie 头,浏览器就会在后续请求上把存下来的值附回去,附在一个 Cookie 头里6。哪些请求会带上它,由这条 cookie 的 DomainPath 属性决定,这两个属性界定了它的作用范围——即 cookie 会被发往哪些 URL6。不写 Domain 反而是更严格的选择:此时 cookie 只发给设置它的那台服务器本身,不发给它的子域名6

完整示例(跟着做)

下面是对 https://example.com/about 的一个完整 GET 请求:

http
GET /about HTTP/1.1Host: example.comUser-Agent: LearnBrowser/1.0Accept: text/html
  • GET 是方法。
  • /about 是路径。
  • Host: example.comUser-Agent: LearnBrowser/1.0Accept: text/html 是请求头。

你来试试(填空示例)

给这个请求的每个部分做标注:

http
POST /contact HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencoded
  • 方法:POST
  • 路径:/contact
  • 请求头:Host: example.comContent-Type: application/x-www-form-urlencoded

小结 + 下一步

请求是一个有三部分的信封:方法(做什么)、路径(哪个资源)、请求头(附加备注)。下一课,你将看服务器的回信。

Footnotes

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

  2. MDN: GET request method — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/GET 2

  3. MDN: POST request method — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/POST 2

  4. MDN: HTTP request methods — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods 2 3 4 5 6

  5. MDN: Overview of HTTP — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Overview

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

练习

01

打开浏览器开发者工具的 Network 面板(下一课会更详细地介绍,这个标签页通常叫 Network,右键菜单里的入口叫「检查」)。重新加载任意页面。点击一条请求,找到它的 Headers 区域。你能找到方法和路径吗?

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

一条请求的方法是 GET,路径是 /search?q=cats。请求的哪个部分在索取搜索结果,哪个部分只是携带关键词?

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

我的笔记

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