从 RFC 规范到浏览器实现:GETPOST 的 7 个本质区别

115 阅读3分钟

1、核心区别:语义与设计目的 (RFC 规范)

  1. GET - 获取资源

    • 语义:从服务器获取指定资源(幂等操作)。
    • 设计场景:查询数据、页面跳转、静态资源加载(如 HTML/CSS/JS)。
    • 面试点:强调其安全性(Safe)幂等性(Idempotent) (多次调用结果相同)。
  2. POST - 提交数据

    • 语义:向服务器提交数据,可能修改资源状态(非幂等)。
    • 设计场景:表单提交、文件上传、创建新资源(如用户注册)。
    • 面试点:强调其非幂等性(多次调用可能产生副作用,如重复下单)。

2、技术实现差异(前端视角)

特性GETPOST
数据位置URL 查询字符串(?key=value请求体(Request Body)
数据长度限制受 URL 长度限制(约 2KB~8KB)理论上无限制(服务器可配置限制)
数据可见性暴露在 URL、浏览器历史、日志中在请求体中,相对隐蔽
缓存可被缓存、书签保存默认不可缓存,除非在响应头中包含适当的Cache-Control或Expires字段。
浏览器回退无害(幂等)会提示重新提交(非幂等)
Content-Type通常无请求体需指定(如 application/json

2.1、GET请求的缓存原理:为什么静态资源会被缓存,而查询接口可能不会

  • GET请求默认支持缓存:HTTP协议中,GET请求的设计是幂等的(即多次请求不会改变资源状态),因此它们可以被浏览器或中间代理(如CDN)缓存缓存机制包括ETag、Last-Modified等响应头,用于标识资源版本。当浏览器首次GET静态资源时,会缓存响应;后续请求时,检查缓存头,如果资源未变,则直接从缓存加载。

  • 浏览器差异导致查询接口不被缓存:

    • Chrome和Firefox的浏览器策略:默认只缓存静态资源(如JS、CSS、图片文件),因为它们通常不频繁变化。但对API查询接口(如获取数据的GET请求),浏览器可能不缓存,因为这些数据可能实时更新。

      • 浏览器会根据请求头识别是否是静态资源,比如请求的文件后缀、Content-Type资源类型都是识别的依据
    • IE浏览器策略:会缓存所有GET请求(包括查询接口),这可能带来数据不一致问题(如新增数据后,缓存返回旧数据。

3、安全性误区(重点!)

  • GET 不等于不安全,POST 不等于安全

    • GET 参数暴露在 URL 中,容易被嗅探或记录,但不代表 POST 绝对安全
    • 真正安全的传输需依赖 HTTPS(防止中间人攻击)。
    • 敏感操作(如转账)必须用 POST + CSRF Token,避免通过 URL 触发。

4、面试延伸问题(务必准备!)

  1. 为什么 POST 更适合提交敏感数据?

    • 答:GET 参数暴露在 URL 和服务器日志中,易被泄露;POST 数据在请求体中,且 HTTPS 下可加密传输。
  2. GET 请求能传 JSON 吗?

    • 答:技术上可以(将 JSON 字符串 URL 编码后放在 ?data= 参数中),但违反设计原则。应使用 POST 传递结构化数据。
  3. POST 比 GET 更耗性能吗?

    • 答:。请求性能主要取决于数据量和网络,与请求方法无关。但 POST 常伴随较大请求体,可能影响速度。
  4. 如何实现幂等的 POST 请求?

    • 答:服务端设计时通过唯一 Token(如订单ID)保证多次提交仅生效一次,常用于支付系统。

5、RESTful API 中的使用规范

  • GET → 获取资源(/users
  • POST → 创建资源(/users
  • PUT/PATCH → 更新资源(/users/1
  • DELETE → 删除资源(/users/1

面试点:错误使用 GET 创建资源(如 GET /create-user?name=Bob)违反 REST 设计原则。


6、总结

“GET 用于获取数据,参数在 URL 中,幂等且可缓存;POST 用于提交数据,参数在请求体中,非幂等且更适合敏感操作。但安全性最终依赖 HTTPS,而非请求方法本身。”