【网络】get与post的区别 - w3c用法区别/从HTTP来看实质的区别
w3c对于区别做出的定义:(用法上)
(1)对参数的数据类型,GET只接受ASCII字符,而POST没有限制,允许二进制。
(2)GET在浏览器回退/刷新时是无害的,而POST会再次提交请求。
(3)GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以为二进制使用多重编码 - HTML标准对HTTP协议的用法的约定,是浏览器拦截不让发
(4)POST 比 GET 更安全,因为GET参数直接暴露在URL上,POST参数在HTTP消息主体中,而且不会被保存在浏览器历史或 web 服务器日志中。- GET提交数据还可能会造成Cross-site request forgery攻击+对于用户名等敏感信息暴露
(5)对参数数据长度的限制,GET方法URL的长度是受限制的,最大是2048个字符,POST参数数据是没有限制的。- 浏览器/服务器行为,http没有做出限制:恶意伪造大额content-length让服务器响应时间变长
(6)GET请求会被浏览器主动缓存,POST不会,除非手动设置。
(7)GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
(8)GET请求可被收藏为书签,POST不能。
常见答案:
1. GET使用URL或Cookie传参,而POST将数据放在BODY中。
2. GET方式提交的数据有长度限制,则POST的数据则可以非常大。
3. POST比GET安全,因为数据在地址栏上不可见。
在HTTP上看
辟谣:
- HTTP规范定义:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
方法都只是规定:使用哪个Method与应用层的数据如何传输是没有相互关系的,get一样可以发送body - HTTP协议对GET和POST都没有对长度的限制
本质区别:
GET幂等,POST不幂等
http的method的定义,只是对行为的定义,幂等(有无副作用)的定义,没有强制定义,对其约束很低,为了服务器/浏览器的压力和安全,才对http的method做出了一些限制,且对于不用浏览器和服务器这些限制是不同,其两者本质都是基于TCP传输,区别只是幂等
幂等
定义:是指同一个请求方法执行多次和仅执行一次的效果完全相同。 1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。 2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。 3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
总结:
- GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-Control Header的约束),GET方法的报文主体没有任何语义。
- POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。