HTTP中GET和POST的区别

来源:互联网 发布:国家创新训练项目 知乎 编辑:程序博客网 时间:2024/05/16 03:47

浏览器与服务器的交互是通过http协议执行的(请求-应答协议),而get和post是http协议请求的两个方法。

咱先来看get和post的设计意图是什么。根据http的设计,大家在看到get的时候,都期望这个请求只获取数据,对服务器没有修改;看到post的时候,都认为这对服务器产生了修改。但是在实际开发中运用中,get请求也能修改数据,post请求也能获取数据,但这样在语义上混乱了,不推荐这么做。。

传递数据方式
如果你是遵从HTML标准对HTTP协议的用法的约定,GET请求的数据(参数)要放在URL中,POST请求放在(body)请求体中。但HTTP协议可没有规定你是怎么的传递方式,这可不是GET和POST的区别

安全性
首先,咱们从服务器角度讲,get不修改数据是安全的,post修改了数据不安全。
从传送数据角度讲,get和post请求都是明文传送,get是通过URL方式请求,可以在浏览器的地址栏直接看到传递的参数,并且参数会被保存在浏览器历史或 web 服务器日志中,敏感的信息不能通过get请求传递,所以不安全;post则不会,是安全的。
当然,在传输过程中,你要是被抓包了,同样完蛋。

长度的限制
HTTP协议对GET和POST还有URL都没有对长度的限制,而对URL长度上的限制是浏览器跟服务器造成的。
URL太长对服务器也是一种负担,原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。
从而你可以认为get请求是有长度限制的。

缓存
缓存技术目的是用来提高系统的性能,减少服务器的负载。而通常只适用于idempotent request(可以理解为查询请求,也就是不更新服务端数据的请求)也就是针对GET请求,W3School就总结get请求可以缓存,post请求不能缓存,
**但是**REF中POST也是可以被缓存的,虽然有这标准,但浏览器的实现也是很强大的。

幂等
幂等就是对同一个URL的多次请求,得到的结果是相同的,引入幂等主要是为了处理同一个请求重复发送的情况,get是幂等,post非幂等。

参考:http://www.nowamagic.net/librarys/veda/detail/1919
https://segmentfault.com/a/1190000004014583
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp