HTTP

HTTP

常见状态码

状态码 含义
1xx Information response
100 continue
101 Switching Protocols
2xx success
200 OK: 成功响应
201 Created
202 Accepted
204 No Content: 服务器已经成功处理请求,没有返回任何 Body (比如服务器收到一个发邮件的请求,服务器返回 204,表示已经收到请求,邮件后续会发送)
206 Partial Content: 服务器返回了某个文件的一部分
3xx redirection
301 Moved Permanently: 永久重定向
302 Found: 临时重定向
304 Not Modified: 浏览器通过 If-None-Match 头或 If-Modified-Since 头询问,服务器告知文件未改动
4xx client errors
400 Bad Request: 客户端发送的 HTTP 有语法错误、太大、帧错误等
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
429 Too Many Requests
5xx server errors
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout

HTTP 方法

方法 含义
GET 获取数据
HEAD GET 类似,但只返回响应头
POST 提交表单
PUT 用一个新的资源完全替换掉服务器的资源
DELETE 删除资源
CONNECT 建立一个 tunnel
OPTIONS 询问服务器支持哪些方法
TRACE 发起环回诊断,主要用于诊断
PATCH 对服务器资源进行部分更新

HTTP 报文

在浏览器中输入 “kunzhao.org”,然后敲击回车的时候,浏览器发送的请求报文示例:

GET / HTTP/1.1
Host: kunzhao.org
Accept-Language: en-US

服务器对应的返回的响应报文示例:

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Aug 2020 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close

<html>
  <head>
    <title>首页|赵坤的个人网站</title>
  </head>
  <body>
    <p>首页内容示例</p>
  </body>
</html>

常见 HTTP 头

通用头

通用头:请求和响应都可以使用的头。

HTTP 头 示例 含义
Date Date: Wed, 21 Oct 2015 07:28:00 GMT 消息的日期和时间
Cache-Control Cache-Control: no-cache 控制缓存的策略
Connection Connection: keep-alive 服务器/浏览器读/写完消息后,这个 TCP 连接是否应该维持打开的状态,还是说立即关闭

请求头

HTTP 头 示例 含义
User-Agent User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Edg/85.0.564.51 包含操作系统、浏览器等字符串形式的描述信息
Host Host: example.com:8001 服务器的域名和端口
Cookie Cookie: PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1 存储了由服务器 Set-Cookie 头设置的 Cookie 信息
Referer Referer: example.org 哪个 URL 跳转到当前页面的
Accept Accept: text/html;q=0.9,image/webp,image/apng 浏览器期望收到的是什么 MIME 类型的资源
Accept-Charset Accept-Charset: utf-8, iso-8859-1;q=0.5 浏览器理解哪些字符编码
Accept-Encoding Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5 浏览器能够处理哪些压缩算法
Accept-Language Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 浏览器期望返回的是英文?中文?还是俄文?
If-Match If-Match: “67ab43”, “54ed21”, “7892dd” 只有匹配任意一个 ETag,服务器才会返回资源
If-None-Match If-None-Match: “bfc13a64729c4290ef5b2c2730249c88ca92d82d” 只要有不匹配的 ETag,服务器就会返回资源,响应码:200
If-Modified-Since If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT 只有在这个日期之后修改后,服务器才返回资源,响应码:200
If-Unmodified-Since If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT 只有在这个日期之后未被修改过,服务器才会返回资源

响应头

HTTP 头 示例 含义
Age Age: 24 这个资源在代理缓存中待了有多少秒了
Location Location: /index.html 页面重定向到哪个 URL 了
Server Server: Apache/2.4.1 (Unix) 服务器用的是哪款 Web 服务器软件/框架
Set-Cookie Set-Cookie: id=a3fWa; Max-Age=2592000 设置 Cookie
Last-Modified Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT 资源的上次修改时间
ETag ETag: “33a64df551425fcc55e4d42a148795d9f25f89d4” 唯一标识一个资源

Entity 头

Entity 头:请求和响应都可以使用的头,并且是用来描述消息体的头。

HTTP 头 示例 含义
Content-Length Content-Length:128 描述 entity body 的大小(单位:字节)
Content-Language Content-Language: en-US 描述这个 entity 面向的受众,是中国用户?还是美国用户?
Content-Encoding Content-Encoding: gzip 采用的什么压缩算法?

HTTP 1.1 upgrade

  • 升级为 HTTP over TLS

浏览器发送:

GET http://example.bank.com/acct_stat.html?749394889300 HTTP/1.1
Host: example.bank.com
Upgrade: TLS/1.0
Connection: Upgrade

服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
  • 升级为 WebSocket

浏览器发送:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
  • 升级为 HTTP/2

浏览器发送:

GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

服务器响应:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c

POST vs GET

  • 在某些浏览器中,通过 Ajax 请求调用 GET 请求会缓存结果,拿到的响应可能只是一个缓存结果
  • GET 参数暴露在了 URL 中
  • POST 可以传递更多的信息、更多的数据

GET 存在的必要

既然数据通过 POST 请求也可以获取到,那 GET 存在的必要是什么?

  • 浏览器地址栏、<a href="kunzhao.org"> 这些链接等发送的都是 GET 请求
  • GET 请求的 URL 可以放到收藏夹
  • GET 请求的 URL 可以多次刷新

持久连接

HTTP 1.0

Connection: keep-alive

HTTP 1.1

所有连接默认都是持久连接。

参考