前言
HTTP协议学习笔记
HTTP的版本
HTTP/0.9:发布于1991年
HTTP/1.0:发布于1996年
- 支持更多请求方法(HEAD、POST)
- 通过
Content-Type: 支持多种类型数据响应
- 无状态保持,浏览器每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
- 引入请求头和响应头
- 引入状态码
HTTP/1.1:发布于1997年
- 支持更多请求方法(PUT、DELETE)
- 通过
Connection: keep-alive支持持久连接,多个请求可以共用同一个TCP连接
- 支持管道化,可以在同一个连接中发送多个请求,而无需等待前一个请求的响应
- 通过
Host: 支持虚拟主机,允许在同一个IP地址上托管多个网站
- 支持分块传输编码,允许服务器分块发送响应,而不需要提前知道响应的总长度
- 通过
Cache-Control: 等字段引入缓存控制
HTTP/2.0:发布于2015年
- 支持多路复用,允许多个请求共享同一个TCP连接
- 支持二进制分帧,将HTTP请求和响应拆分成多个帧,帧可以交错发送,提高了传输效率
- 支持头信息压缩,使用HPACK压缩算法,减少了头信息的大小
- 支持服务器推送,服务器可以主动推送资源到客户端,而无需客户端显式请求
- 支持HTTP缓存
- 支持gzip压缩
- 支持WebSocket
HTTP/3.0:发布于2020年
- 支持QUIC协议,QUIC是一种基于UDP的传输层协议,QUIC的连接建立时间比TCP更短,在移动设备中进行网络切换时QUIC可以更快地恢复连接
HTTP的请求方法
GET
根据条件查询数据
request1
| GET http://127.0.0.1:8080/api/user?id=1
|
HEAD
- HEAD请求的响应只会返回响应头,而不会返回响应体,用于根据需要决定是否继续获取响应体
根据条件查询数据
request1
| HEAD http://127.0.0.1:8080/api/user?id=1
|
POST
新增一条数据
request1 2 3 4 5 6 7 8
| POST http://127.0.0.1:8080/api/user Content-Type: application/json
{ "id": 1, "username": "zhangsan", "password": "password" }
|
PUT
覆盖一条数据的所有字段
request1 2 3 4 5 6 7
| PUT http://127.0.0.1:8080/api/user/1 Content-Type: application/json
{ "name": "zhangsan", "key": "password" }
|
DELETE
删除一条数据
request1
| DELETE http://localhost:8080/api/user/1
|
PATCH
新增一条数据
op:操作
path:资源路径
"username": "zhangsan":定义新增的数据的键和值
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "add", "path": "/user", "username": "zhangsan" } ]
|
删除一条数据
op:操作
path:资源路径
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "remove", "path": "/user/1" } ]
|
修改一条数据的部分字段
op:操作
path:资源路径
"username": "zhangsan":定义修改的数据的键和值
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "replace", "path": "/user/1", "username": "zhangsan" } ]
|
移动一条数据
op:操作
from:资源的旧路径
path:资源的新路径
/-:移动到新路径的末尾
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "move", "from": "/user/1", "path": "/user/-" } ]
|
复制一条数据
op:操作
from:资源的旧路径
path:资源的新路径
/0:复制到新路径的开头
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "copy", "from": "/user/1", "path": "/user/0" } ]
|
测试一条数据
op:操作
path:资源路径
"username": "zhangsan":定义预期键和值
request1 2 3 4 5 6
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "test", "path": "/user/1/username", "username": "zhangsan" } ]
|
批量操作
request1 2 3 4 5 6 7 8 9 10 11
| PATCH http://127.0.0.1:8080/api Content-Type: application/json-patch+json
[ { "op": "add", "path": "/user", "username": "zhangsan" } { "op": "remove", "path": "/user/1" } { "op": "replace", "path": "/user/1", "username": "zhangsan" } { "op": "move", "from": "/user/1", "path": "/user/-" } { "op": "copy", "from": "/user/1", "path": "/user/0" } { "op": "test", "path": "/user/1/username", "username": "zhangsan" } ]
|
CONNECT
- CONNECT用于建立一个到代理服务器的隧道(tunnel),通常用于代理服务器和SSL/TLS加密连接
- 它允许客户端通过代理服务器与目标服务器建立一个持久的连接
建立隧道
request1
| CONNECT http://127.0.0.1:8080/api
|
TRACE
- TRACE用于回显服务器收到的请求,主要用于调试和测试
- 它会将请求的内容原封不动地返回给客户端,帮助开发者检查请求是否被正确发送
测试连接
request1
| TRACE http://127.0.0.1:8080/api
|
HTTP的请求头
ContentType
文本
request1
| Content-Type: text/plain
|
request1
| Content-Type: application/x-www-form-urlencoded
|
JSON格式
request1
| Content-Type: application/json
|
XML格式
request1
| Content-Type: application/xml
|
文件上传
request1
| Content-Type: multipart/form-data
|
HTTP的状态码
完成