第 2 课:请求的信封:方法、路径与请求头
本课目标:
- 在请求中识别 HTTP 方法。
- 在请求中识别路径或 URL。
- 说出至少一个常见请求头,并解释它的作用。
一封信需要动作、地址,还有信封上的备注
浏览器发请求时,并不是大喊一声「把页面给我」。它会写一个正式的信封。这个信封有三个部分:它想做什么、想在哪里做,以及写给服务器的几条附加备注。
在 HTTP 里,这三个部分分别叫方法、路径和请求头1。
讲解
方法:动作
HTTP 方法是一个单词,说明浏览器想做什么。最常见的两个是:
大多数页面加载用的是 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。
请求头:附加备注
请求头是跟在请求行之后的元数据行。每个请求头都有名字和值,用冒号隔开。例如:
Host 头告诉服务器这个请求属于哪个域名。User-Agent 头告诉服务器是哪个浏览器在发问。Accept 头告诉服务器浏览器能处理哪类内容1。头部的名字大小写不敏感1。
请求体
GET 请求通常不带请求体2。POST 带:被提交的数据跟在头部之后,中间用一个空行隔开1。有两个头专门描述这个请求体——Content-Type 说明接收方该按什么格式来解析它,Content-Length 说明要读多少字节13。表单常用的一种编码是 application/x-www-form-urlencoded,它把各个字段像查询字符串那样打包成键值对1。
Cookie 头
只要服务器在此前某个响应里发过 Set-Cookie 头,浏览器就会在后续请求上把存下来的值附回去,附在一个 Cookie 头里6。哪些请求会带上它,由这条 cookie 的 Domain 和 Path 属性决定,这两个属性界定了它的作用范围——即 cookie 会被发往哪些 URL6。不写 Domain 反而是更严格的选择:此时 cookie 只发给设置它的那台服务器本身,不发给它的子域名6。
完整示例(跟着做)
下面是对 https://example.com/about 的一个完整 GET 请求:
GET是方法。/about是路径。Host: example.com、User-Agent: LearnBrowser/1.0和Accept: text/html是请求头。
你来试试(填空示例)
给这个请求的每个部分做标注:
- 方法:POST
- 路径:/contact
- 请求头:Host: example.com 和 Content-Type: application/x-www-form-urlencoded
小结 + 下一步
请求是一个有三部分的信封:方法(做什么)、路径(哪个资源)、请求头(附加备注)。下一课,你将看服务器的回信。
Footnotes
-
MDN: HTTP messages — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Messages ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
MDN: GET request method — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/GET ↩ ↩2
-
MDN: POST request method — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/POST ↩ ↩2
-
MDN: HTTP request methods — https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
MDN: Overview of HTTP — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Overview ↩
-
MDN: Using HTTP cookies — https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies ↩ ↩2 ↩3
Exercises
一条请求的方法是 GET,路径是 /search?q=cats。请求的哪个部分在索取搜索结果,哪个部分只是携带关键词?
第 2 级(进阶)My note
Jot down thoughts, sticking points, things you didn't get. Written to this course's appendix only — the lesson file is never touched.