前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库GET POST 区别 语义 缓存
HTHTTPHTTP 语义

HTTP 中 GET 和 POST 在语义与缓存行为上有哪些本质区别?

GET与POST的本质区别不在数据量或可见性,而在请求语义:GET是安全、幂等、可缓存的信息查询,POST是提交动作,可能改变状态。缓存行为上,GET默认可缓存,POST仅在特定条件下可缓存。

前端进阶之旅 · 一题精讲更新于 2026.09.05
HTTP#HTTP 语义#缓存
先看核心答案
理解线索

HTTP方法语义与缓存

  1. 安全方法不修改服务器状态,GET为安全方法
  2. 幂等方法重复请求结果一致,GET幂等,POST不幂等
  3. 可缓存性GET默认可缓存,POST需显式标记

POST可缓存需同时满足响应含新鲜度信息和Content-Location头部。

核心回答

先记住这个答案

GET请求获取资源,安全且幂等,不改变服务器状态,因此可被浏览器、代理或CDN缓存;POST请求提交数据,可能产生副作用,不安全不幂等,默认不可缓存。其本质区别是HTTP方法语义的差异,决定了请求的预期影响、重试行为和缓存策略。

  • GET安全幂等,POST不安全非幂等
  • GET默认可缓存,POST需显式条件
  • POST可缓存需显式新鲜度与Content-Location

语义决定缓存契约

HTTP方法语义定义了请求的预期影响。GET表示获取资源,服务器不改变状态,因此可安全重试和缓存。POST表示提交数据,可能对服务器资源造成变更,因此非安全且非幂等。幂等性指同一请求执行多次与执行一次的效果相同,GET天然满足,POST需谨慎设计。

缓存行为是语义的延伸。浏览器和代理缓存通常只存储GET响应,因为可用作后续GET的回复。POST默认不可缓存,因为响应可能依赖请求体或造成副作用。HTTP规范允许POST缓存,但要求响应包含新鲜度信息如Cache-Control或Expires,并带有Content-Location头表示缓存标识。

后撒返回时的请求重放

用户在电商搜索页(GET)点击商品详情,然后使用POST提交订单。点击浏览器后退返回搜索页,浏览器可能显示缓存页面而不发送新GET;若再前进到订单提交页,浏览器会提示用户是否重新发送POST,因POST非幂等,重放可能导致重复下单。

解决方案是采用POST后重定向到GET模式:订单提交后服务器返回303 See Other,重定向到订单确认GET资源。这样刷新或后退时重放的只是GET请求,避免重复提交,且GET响应可缓存,提升响应速度。但这要求服务器正确处理重定向和缓存头。

语义被忽略的边界条件

工程中常见用GET实现搜索但参数含敏感信息,或POST仅查询不修改。前者会致URL泄露,应改用POST或对数据进行加密;后者违反语义,可能影响HTTP基础层的缓存行为。过度依赖约定而忽略方法语义会造成异常。

当POST响应需被缓存时,必须满足规范条件。若服务器返回200但缺少Content-Location和明确新鲜度头,缓存无法识别。此时若要支持分享等场景,可在响应体返回资源URL,客户端随后GET获取。权衡是增加一次请求,但语义清晰。

回答前,多想一步

容易答错的地方

以为GET不能带请求体
HTTP规范未禁止GET带body,但语义定义为获取资源,带body无意义且许多服务器或中间件会忽略或丢弃。在浏览器fetch API中,GET请求若设置body通常会被拒绝或忽略,依赖此特性会破坏缓存和重试逻辑,应避免。
认为POST响应绝对不可缓存
HTTP规范允许POST可缓存,条件是响应含显式新鲜度信息和Content-Location头。例如,更新资源后返回201及新资源的状态,若在CDN等中间层正确配置,也可能被缓存。实践中常依赖GET透明提升性能,但POST并非完全不可缓存。
试着用自己的话回答

面试官还会怎么问?

安全方法与幂等方法有何区别?

安全方法不修改资源状态,GET是安全方法;幂等方法指重复请求与一次请求效果相同,PUT和DELETE是幂等方法,但不安全。安全方法侧重无副作用,幂等方法强调可重试性。

POST请求如何实现可靠的重试?

可引入客户端生成的请求唯一编号(Idempotency-Key),服务器记录编号并去重,或采用异步模式:POST返回202 Accepted,客户端稍后通过资源URL查询处理结果。需权衡一致性与复杂度。

缓存GET响应时,为什么有时需要Vary头?

GET响应可能因用户代理、语言、编码等不同,Vary头告诉缓存根据哪个请求头区分存储。若忽视Vary,缓存可能向错误用户返回错误版本。例如响应依赖Accept-Language,必须发送Vary字段。

从一道题,走向一组知识

把知识连起来

HTTP 语义

HTTP 中什么是安全方法(safe method),为什么 GET 和 HEAD 被定义为安全方法?

理解GET为安全方法的基础,明确安全方法的定义和意义。

HTTP 语义

HTTP 中哪些方法是幂等的,PUT 和 DELETE 的幂等性在重试时意味着什么?

延伸讨论GET与POST在幂等性上的差异,以及重试时的不同策略。

参考资料

  • HTTP request methods

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 语义决定缓存契约
  3. 后撒返回时的请求重放
  4. 语义被忽略的边界条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑