外观
GET 和 POST 差在哪?
GET 用来取资源,参数在 URL 里,应当安全、幂等,可以被缓存。POST 用来提交,语义是「让服务器按请求去处理」,不是幂等的,默认不缓存。差别是约定和中间层的行为,不是「一个走 URL、一个走 body」这么简单。
原理
安全和幂等:GET 不应该改数据。重复执行 GET 或 PUT、DELETE(按规范)不应产生额外效果。POST 每调用一次可能多创建一份订单,所以刷新和重试要小心。
GET 的参数在查询字符串里,会进日志、历史记录和 Referer。不要把令牌放进查询参数。URL 长度没有统一的小上限,但浏览器、服务器和代理都有自己的限制。
POST 的正文可以是表单或 JSON。JSON 会让浏览器把它当成非简单请求,跨域时先预检。见 跨域。
GET 可以被浏览器和 CDN 缓存。POST 响应默认不作为缓存,除非显式给出缓存头,而且通常不该缓存。
追问
GET 能带 body 吗?
规范没有禁止,但很多服务器和缓存会忽略。需要正文的查询用 POST,或者把条件放在查询字符串里。不要依赖 GET body。
幂等为什么重要?
超时后客户端不知道服务器有没有处理。对幂等请求可以重试。对 POST 创建订单,要靠幂等键让服务器认出这是同一次提交。
易错点
- 用 GET 做删除或支付,爬虫、预取和 CSRF 都能触发它。
- 说 POST 比 GET 安全。两者都是明文的 HTTP,敏感数据靠 HTTPS,不是靠方法名。
- 把「参数位置」当成唯一区别,漏掉缓存和幂等。