GET和POST的区别可以归结为两方面,一方面是规范(specification)的区别,另一方面是用法和实现(implementation)上的区别
规范上的区别
HTTP有关GET和POST的请求规范定义在RFC7231
- GET的语义是请求获取指定的资源;POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同,比如提交表单。
- GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束);POST不安全,不幂等,(大部分实现)不可缓存。
- GET方法的报文主体没有任何语义;POST的报文大部分都具有特定语义。
实现上或者用法上的区别
- 请求方式
- GET请求的时候可以有参数也可以无参数;参数可以放在path里也可以放在header里
- POST请求的报文一般放在BODY里面,有时候需要设置header
- 提交的数据长度
- GET从理论上或者规范上对数据长度没有限制,但浏览器和操作系统会对这个长度有限制。比如IE对URL长度的限制是2083字节
- POST也没有大小限制的,HTTP协议规范也没有进行大小限制。但服务器一般对长度都有限制,比如微软的 IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB
- 网络安全
- GET因为有缓存和明文传输,安全性相对较弱。使用GET提交敏感数据还可能会造成Cross-site request forgery攻击
- POST 安全性相对较高
- 数据包个数
- GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
- POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。但是,从客户端的角度来看:并不是所有的Server都会正确实现100-continue协议,如果Client发送 头{"Expect":"100-continue"}消息后,在timeout时间内无响应,Client需要立马上传POST数据;有些Server会错误实现100-continue协议,在不需要此协议时返回100,此时客户端应该忽略。从服务器的角度来看:正常情况下,收到请求后,返回100或错误码;如果在发送100-continue前收到了POST数据(客户端提前发送POST数据),则不发送100响应码(略去)。具体可以参考 https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3
- 请注意:对于SOA架构的后台RESTful接口,GET和POST都是请求一次,很少见到请求两次的POST。
- 其他区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
网友评论