浏览器 GET 请求和 POST 请求的区别

0 阅读2分钟

GET 请求和 POST 请求的区别

1. 本质区别

GET 和 POST 在 HTTP 协议层面都可以传输数据,但在语义和使用规范上有明显区别: GET 用于获取资源,是安全且幂等的;POST 用于提交数据,会对服务器产生副作用。 此外它们在参数传递方式、缓存机制、安全性以及浏览器行为上也存在差异。


2. 参数传递方式

GET:参数放在 URL 的查询字符串中
​
https://api.example.com/users?id=1&name=tomPOST:参数放在请求体 body 中
​
https://api.example.com/users
body: { "id": 1, "name": "tom" }

3. 核心区别对比

干什么--编码类型---参数位置---参数长度---参数安全 缓存---幂等---浏览器存储

对比维度GETPOST
语义获取资源提交/修改资源
编码类型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。选择依据是语义,而非数据大小或安全性。