GET 和 POST 有什么区别?安全性、幂等性和参数位置该怎么理解?
🧑💻 面试官:GET 和 POST 的区别是什么?
🙋♂️ 我:GET 参数在 URL,POST 参数在请求体,所以 POST 更安全。
🧑💻 面试官:POST 能不能带查询参数?HTTPS 下 URL 和请求体在链路上有什么差别?
🙋♂️ 我:POST 也能带查询参数,两个都应该用 HTTPS。
🧑💻 面试官:那 HTTP 说 GET 是安全方法,这里的安全究竟指什么?
先讲方法语义,再讲参数位置。“安全方法”不等于保密,POST 也不会自动保证不重复执行。
面试速答(60 秒版)
GET 的语义是获取目标资源的表示,POST 是让目标资源按自己的规则处理提交的内容。参数放在哪里,不是二者的定义。
GET 属于安全、幂等的方法。这里安全指客户端没有请求改变资源状态,不是密码传输安全;幂等指重复同一请求的预期效果相同,不要求每次响应完全一样。POST 没有这两项普遍保证,但业务可以通过幂等键等机制避免重复处理。
POST 可以同时带 URL 查询参数和请求体。GET 请求体没有通用定义的语义,不应作为常规接口约定。保密要依靠 HTTPS、日志控制和敏感信息处理,不靠把 GET 改成 POST。
缓存也按协议头和实现判断,不能简单说 GET 必定缓存、POST 永远不能缓存。

知识点详解:方法名字决定的是意图,不是参数容器
读资料和提交操作,先分清接口要表达什么
假设查询某篇文章,GET /articles/42 表达获取其表示;提交一条评论,POST /articles/42/comments 表达请服务器处理评论内容。
两者都可能有查询参数,比如语言或处理选项。POST 的请求体可以承载 JSON、表单或其他内容,格式由 Content-Type 等约定表达。
把所有接口都改成 POST,确实能让你继续传数据,但会隐藏读写意图,影响缓存、链接、工具和基础设施的使用。
安全方法允许附带变化,但不该承载删改意图
读取文章时写访问日志、计数,这是服务端实现可能带来的附带效果;它不等于客户端请求删除或修改文章。
反过来,GET /delete?id=42 即使技术上能运行,也违背了安全方法的语义。浏览器预取、爬虫访问或代理重试可能在你没预料的时机触发它。
安全方法这个词并不承诺 URL 不被记录。HTTPS 保护传输链路,但应用、反向代理和浏览器历史等仍可能保存地址;把秘密塞进查询参数尤其需要谨慎。
幂等讨论的是效果,不是返回值
假设同一个删除请求执行两次,第一次删除成功,第二次返回不存在。返回值变了,但目标都处于已删除状态,这仍可能符合幂等语义。
POST 创建评论通常会新增多条,因此不能默认幂等。若客户端超时后重试,服务端需要识别这是同一次提交,还是用户真想提交两条。
业务幂等键的范围、有效期、并发处理和结果保存都要设计。只传一个 requestId,却没有唯一约束或可靠记录,不能保证避免重复。
不要把常见行为背成协议禁令
有的工具能发送带请求体的 GET,不表示所有服务器、代理和客户端都认可它的含义。公共接口尽量把查询条件放入明确约定的位置,过长或复杂查询可采用另行设计的 POST 查询接口。
HTTP 并没有统一规定 GET 参数最多只能多少字符。限制可能来自浏览器、代理、服务器或配置。缓存同样要看响应头、认证、缓存键和部署策略。
面试回答可以先用语义建立边界,再补充你熟悉的工程约束,不要用某个框架的行为替代标准。
本题机制参考:HTTP 语义 RFC 9110、MDN GET、MDN POST。
面试官继续追问
GET 的结果变化了,还算幂等吗?
可以。幂等描述请求的预期作用,资源被其他操作更新后,读取结果当然可能变化。
POST 接口能重试吗?
能,但需要确认应用语义和去重机制。不能因为网络层允许重发,就认定业务不会重复发生。
敏感查询改 POST 就足够了吗?
不够。HTTPS、授权、日志脱敏、缓存策略和数据最小化都要考虑,请求体也可能被记录。
面试速记卡
- GET:获取表示;POST:按目标资源规则处理提交内容。
- 安全:不请求状态变化,不是保证保密。
- 幂等:重复请求预期效果相同,不是响应相同。
- 参数:POST 也能带查询参数;GET body 无通用语义。
- 工程:TLS、缓存和业务幂等各自设计。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
小米 · 前端 · 原帖未明确批次
GET 与 POST 有什么区别?(题意整理)
小米前端二面 ↗
原帖编辑于 2024-05-29快手 · AI应用开发算法 · 原帖未明确批次
HTTP GET 和 POST 有什么区别?(题意整理)
快手AI应用开发算法一面面经 ↗
页面显示 05-02 发布,未明确年份