GET 请求和 POST 请求的区别
1. 本质区别
GET 和 POST 在 HTTP 协议层面都可以传输数据,但在语义和使用规范上有明显区别: GET 用于获取资源,是安全且幂等的;POST 用于提交数据,会对服务器产生副作用。 此外它们在参数传递方式、缓存机制、安全性以及浏览器行为上也存在差异。
2. 参数传递方式
GET:参数放在 URL 的查询字符串中
https://api.example.com/users?id=1&name=tom
POST:参数放在请求体 body 中
https://api.example.com/users
body: { "id": 1, "name": "tom" }
3. 核心区别对比
干什么--编码类型---参数位置---参数长度---参数安全 缓存---幂等---浏览器存储
| 对比维度 | GET | POST |
|---|---|---|
| 语义 | 获取资源 | 提交/修改资源 |
| 编码类型 | application/x-www-form-urlencoded | 支持多种格式 |
| 参数位置 | URL 查询字符串 | 请求体 Body |
| 数据长度 | URL 有长度限制(约 2KB~8KB) | Body 理论上无限制 |
| 安全性 | 参数暴露在 URL,较不安全 | 参数在 Body,相对安全 |
| 缓存 | ✅ 可被缓存 | ❌ 默认不缓存 |
| 幂等性 | ✅ 幂等(多次请求结果相同) | ❌ 非幂等(可能产生副作用) |
| 浏览器历史 | 参数会保存在历史记录 | 不会保存 |
4. 安全性细说
GET 的参数在 URL 中,有以下风险:
❌ 被浏览器历史记录保存
❌ 被服务器访问日志记录
❌ 被 Referer 头泄露给第三方
❌ 不适合传递密码、Token 等敏感信息
⚠️ 注意:POST 并不是真正安全,只是参数不在 URL 里。 真正的安全靠 HTTPS,两者都需要 HTTPS 加密传输。
5. POST 支持的 Content-Type
// 1. 表单格式(默认)
Content-Type: application/x-www-form-urlencoded
body: name=tom&age=18
// 2. JSON 格式(最常用)
Content-Type: application/json
body: {"name": "tom", "age": 18}
// 3. 文件上传
Content-Type: multipart/form-data
body: 二进制文件流
// 4. 纯文本
Content-Type: text/plain
6. 幂等性理解
幂等:多次操作,结果一样
GET /users/1 → 查询用户,查多少次结果都一样 ✅ 幂等
POST /users → 每次都创建一个新用户 ❌ 非幂等
7. TCP 报文发送(面试加分)
- GET 请求:Header 和 Body 一起发送(1 次 TCP 报文)
- POST 请求:部分浏览器/客户端会先发 Header,服务端返回
100 Continue,再发 Body(2 次 TCP 报文)
这也是 POST 比 GET 略慢的原因之一(实际差异极小,不影响选型)。
总结一句话
GET 是"查",幂等、可缓存、参数在 URL;POST 是"改",非幂等、不缓存、参数在 Body。选择依据是语义,而非数据大小或安全性。