百科

http请求的get与post方式的区别

时间:2010-12-5 17:23:32  作者:知识   来源:综合  查看:  评论:0
内容摘要:GET和POST是HTTP协议里最常用的两个动词,但绝大多数开发者对它们的理解停留在“GET用来拿数据,POST用来提交数据”这个层面。这没错,但远远不够——两者真正的差异,藏在HTTP规范的字缝里,

GET和POST是请求HTTP协议里最常用的两个动词,但绝大多数开发者对它们的的区理解停留在“GET用来拿数据,POST用来提交数据”这个层面。请求这没错,的区但远远不够——两者真正的请求差异,藏在HTTP规范的的区字缝里,也藏在浏览器和服务器厂商的请求“自由发挥”中。

先说最核心的的区事实:GET的请求参数拼在URL问号后面,POST的请求参数放在请求体里。这个差别直接导致了三个连锁反应。的区第一,请求GET的的区URL有长度限制——不是HTTP规定的,是请求IE和Chrome这些浏览器自己定的,大约2048个字符后,的区多余的请求数据会被静默截断。我见过一个真实事故:某后台管理系统用GET传递一段JSON筛选条件,数据量一大,列表页就“神秘”地少了后半段记录,排查了半天才发现是URL被浏览器砍了。POST没有这个限制,传几兆的二进制文件都行。第二,GET的URL会出现在浏览器历史记录、服务器访问日志、代理服务器日志里——这意味着敏感信息一旦用GET传,就等于把密码写在明信片上寄出去。第三,GET可以被浏览器主动缓存,也可以被收藏为书签,POST两者都做不到。

但别急着下结论说“POST比GET安全”。POST只是把数据藏在了请求体里,但HTTPS加密之前,抓包工具照样能看见明文。真正的安全取决于传输层是否加密,跟GET还是POST没关系。一个用GET传密码的网站是傻,但一个用POST传明文密码的HTTP网站照样是裸奔。

再往深处看,GET和POST在语义上有着本质区别。HTTP规范把GET定义为“安全方法”,意思是它不应该对服务器产生副作用——你刷新十次GET请求,服务器上的数据不该有任何变化。而POST是非安全的,它天生就是用来创建资源、修改状态、触发动作的。这个语义区分在RESTful API设计里被放大成了一种哲学:GET是查询,POST是命令。但现实中很多程序员把POST当万能药,连删个用户都敢用POST,这其实混淆了语义——删除应该用DELETE,更新应该用PUT,但国内不少团队嫌麻烦,统一用POST带个action参数,结果就是API文档变成了一本猜谜手册。

还有个容易忽略的细节:GET请求是幂等的,POST不是。幂等的意思是,你发一次GET和发一百次GET,服务器状态完全一样。POST发一百次,就可能创建一百个订单。这个特性在重试机制里至关重要。我做过一个支付回调接口,对方用GET重试了三次,结果因为我们的接口设计成“每次GET都更新订单状态”,导致订单被重复处理。后来改成POST配合唯一请求ID,才解决了问题。

浏览器对这两个方法的态度也截然不同。GET请求可以被预加载——你在地址栏敲完URL回车,浏览器会主动发GET。POST不行,它必须通过表单提交或者AJAX显式触发。更麻烦的是,如果用户在一个POST响应后点击浏览器的“后退”按钮,浏览器会弹出一个“确认重新提交表单”的对话框——这个体验极其糟糕,但这是规范要求,因为浏览器不确定用户是否真的想重复提交。而GET后退就干净利落,直接显示缓存页面。

最后说个反直觉的事实:GET请求也能带请求体,POST请求也能把参数放在URL里——HTTP规范没有禁止。但没人会这么干,因为服务器、代理、网关对这种情况的处理方式五花八门,有的直接忽略,有的报错,有的诡异地把两者拼接起来。我见过一个老系统,用POST但把参数拼在URL上,结果某些网络环境下参数丢失,排查了三天才发现是某个老旧代理服务器把URL截断了。

所以,选GET还是POST,不该只看“取数据”还是“提交数据”这个表面功能。要看数据量、敏感程度、幂等性需求、是否允许缓存、以及你能否接受浏览器那个烦人的“重新提交”提示框。一个简单的判断标准:如果这个请求只是读取展示,且参数不敏感、数据量小,用GET——还能享受浏览器缓存带来的性能红利。但凡涉及状态变更、敏感数据、或者大体积内容,就老老实实用POST。别嫌规范繁琐,这些规则背后,都是无数个线上事故换来的教训。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap