mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-10-27 13:33:43 +00:00
Update HTTP.md
按 RFC 6265、RFC 9110、RFC 9112 更新 Cookie、Connection 首部写法、安全方法和可缓存状态码的说明;更新 PUT 和证书费用的说明,补充 Chrome 默认禁用服务端推送;代码块标注语言。
This commit is contained in:
+16
-14
@@ -71,7 +71,7 @@
|
||||
- 一个空行用来分隔首部和内容主体 Body
|
||||
- 最后是请求的内容主体
|
||||
|
||||
```
|
||||
```http
|
||||
GET http://www.example.com/ HTTP/1.1
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
||||
Accept-Encoding: gzip, deflate
|
||||
@@ -94,7 +94,7 @@ param1=1¶m2=2
|
||||
- 一个空行分隔首部和内容主体
|
||||
- 最后是响应的内容主体
|
||||
|
||||
```
|
||||
```http
|
||||
HTTP/1.1 200 OK
|
||||
Age: 529651
|
||||
Cache-Control: max-age=604800
|
||||
@@ -163,7 +163,7 @@ POST 主要用来传输数据,而 GET 主要用来获取资源。
|
||||
|
||||
> 上传文件
|
||||
|
||||
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
|
||||
PUT 用于创建或者替换目标资源。它自身不带验证机制,需要配合身份认证使用,否则任何人都可以上传文件。
|
||||
|
||||
```html
|
||||
PUT /new.html HTTP/1.1
|
||||
@@ -371,8 +371,8 @@ CONNECT www.example.com:443 HTTP/1.1
|
||||
|
||||
长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。
|
||||
|
||||
- 从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 `Connection : close`;
|
||||
- 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 `Connection : Keep-Alive`。
|
||||
- 从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 `Connection: close`;
|
||||
- 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 `Connection: Keep-Alive`。
|
||||
|
||||
#### 2. 流水线
|
||||
|
||||
@@ -382,7 +382,7 @@ CONNECT www.example.com:443 HTTP/1.1
|
||||
|
||||
### Cookie
|
||||
|
||||
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
|
||||
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。可以使用 Cookie 来保存状态信息,Cookie 由 RFC 6265 单独定义,并不是 HTTP/1.1 的一部分。
|
||||
|
||||
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。
|
||||
|
||||
@@ -780,7 +780,7 @@ HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认
|
||||
### HTTPS 的缺点
|
||||
|
||||
- 因为需要进行加密解密等过程,因此速度会更慢;
|
||||
- 需要支付证书授权的高额费用。
|
||||
- 需要申请和维护证书,不过 Let's Encrypt 等机构可以免费签发证书。
|
||||
|
||||
## 七、HTTP/2.0
|
||||
|
||||
@@ -812,6 +812,8 @@ HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/e3f1657c-80fc-4dfa-9643-bf51abd201c6.png" width="800"/> </div><br>
|
||||
|
||||
需要注意的是,Chrome 106 起默认禁用了服务端推送,其它基于 Chromium 的浏览器也随之跟进。
|
||||
|
||||
### 首部压缩
|
||||
|
||||
HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。
|
||||
@@ -846,11 +848,11 @@ GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以
|
||||
|
||||
因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 `中文` 会转换为 `%E4%B8%AD%E6%96%87`,而空格会转换为 `%20`。POST 参数支持标准字符集。
|
||||
|
||||
```
|
||||
```http
|
||||
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
|
||||
```
|
||||
|
||||
```
|
||||
```http
|
||||
POST /test/demo_form.asp HTTP/1.1
|
||||
Host: w3schools.com
|
||||
name1=value1&name2=value2
|
||||
@@ -862,7 +864,7 @@ name1=value1&name2=value2
|
||||
|
||||
GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
|
||||
|
||||
安全的方法除了 GET 之外还有:HEAD、OPTIONS。
|
||||
安全的方法除了 GET 之外还有:HEAD、OPTIONS、TRACE。
|
||||
|
||||
不安全的方法除了 POST 之外还有 PUT、DELETE。
|
||||
|
||||
@@ -876,7 +878,7 @@ GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实
|
||||
|
||||
GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的:
|
||||
|
||||
```
|
||||
```http
|
||||
GET /pageX HTTP/1.1
|
||||
GET /pageX HTTP/1.1
|
||||
GET /pageX HTTP/1.1
|
||||
@@ -885,7 +887,7 @@ GET /pageX HTTP/1.1
|
||||
|
||||
POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:
|
||||
|
||||
```
|
||||
```text
|
||||
POST /add_row HTTP/1.1 -> Adds a 1nd row
|
||||
POST /add_row HTTP/1.1 -> Adds a 2nd row
|
||||
POST /add_row HTTP/1.1 -> Adds a 3rd row
|
||||
@@ -893,7 +895,7 @@ POST /add_row HTTP/1.1 -> Adds a 3rd row
|
||||
|
||||
DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:
|
||||
|
||||
```
|
||||
```text
|
||||
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists
|
||||
DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted
|
||||
DELETE /idX/delete HTTP/1.1 -> Returns 404
|
||||
@@ -904,7 +906,7 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404
|
||||
如果要对响应进行缓存,需要满足以下条件:
|
||||
|
||||
- 请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
|
||||
- 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
|
||||
- 响应报文的状态码是可缓存的,包括:200、203、204、206、300、301、308、404、405、410、414 和 501。
|
||||
- 响应报文的 Cache-Control 首部字段没有指定不进行缓存。
|
||||
|
||||
### XMLHttpRequest
|
||||
|
||||
Reference in New Issue
Block a user