【笔记】HTTP协议

前言

HTTP协议学习笔记

HTTP的版本

  • HTTP/0.9:发布于1991年
    • 只支持GET方法
    • 只支持获取文本数据响应
  • 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

根据条件查询数据

request
1
GET http://127.0.0.1:8080/api/user?id=1
  • HEAD请求的响应只会返回响应头,而不会返回响应体,用于根据需要决定是否继续获取响应体

根据条件查询数据

request
1
HEAD http://127.0.0.1:8080/api/user?id=1

POST

新增一条数据

request
1
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

覆盖一条数据的所有字段

request
1
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

删除一条数据

request
1
DELETE http://localhost:8080/api/user/1

PATCH

新增一条数据

op:操作
path:资源路径
"username": "zhangsan":定义新增的数据的键和值

request
1
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:资源路径

request
1
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":定义修改的数据的键和值

request
1
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" }
]

移动一条数据

  • move操作相当于先remove数据再add数据

op:操作
from:资源的旧路径
path:资源的新路径

/-:移动到新路径的末尾

request
1
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/-" }
]

复制一条数据

  • copy操作相当于在新位置add数据

op:操作
from:资源的旧路径
path:资源的新路径

/0:复制到新路径的开头

request
1
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":定义预期键和值

request
1
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" }
]

批量操作

request
1
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加密连接
  • 它允许客户端通过代理服务器与目标服务器建立一个持久的连接

建立隧道

request
1
CONNECT http://127.0.0.1:8080/api

TRACE

  • TRACE用于回显服务器收到的请求,主要用于调试和测试
  • 它会将请求的内容原封不动地返回给客户端,帮助开发者检查请求是否被正确发送

测试连接

request
1
TRACE http://127.0.0.1:8080/api

HTTP的请求头

ContentType

  • 请求参数的数据类型

文本

request
1
Content-Type: text/plain

Form表单

request
1
Content-Type: application/x-www-form-urlencoded

JSON格式

request
1
Content-Type: application/json

XML格式

request
1
Content-Type: application/xml

文件上传

request
1
Content-Type: multipart/form-data

HTTP的状态码

完成