浅谈HTTP中Get与Post的区别
Http定义了与服务器交互的不同方法,最基本的方法有4中,分别是get,post,put,delete。URL全称是统一资源定位符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而http中的get,post,put,delete就对应着写个资源的查,改,增,删4个操作。get一般用于获取/查询资源信息,而post一般用于更新资源信息。
1.根据http规范,get用于信息获取,而且应该是安全和幂等的
(1)所谓的安全意味着该操作用于获取信息而非修改信息。换句话说,get请求一般不产生副作用。它仅仅是获取资源信息,就像数据库查询一样,不会修改、增加数据,不会影响资源的状态。
*注意:这里的安全的含义仅仅是指不修改信息。
(2)幂等的意思是对同一URL的多个请求应该返回同样的结果。
*注意:但在实际应用中,以上两条跪着并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是用户打开的一个链接时,他可以确信从自身角度来看没有改变资源即可。
上面大概说了一下http规范中的get和post的一些原理性问题。但在实际做的时候,很多人却没有按照http规范去做,导致这个问题的原因有很多,比如说:
1.很多人为了贪方便,更新资源时用了get,因为post必须要到form(表单),这样会麻烦
2.对资源的增删改查操作,其实都可以通过get/post完成,不需要用到put和delete
3.早起的web mvc框架设计者们并没有有意识的将url当做抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的web mvc框架基本上都只支持get/post两种http方法,而不支持put和delete方法
从表面现象看看get和post的区别:
1.get请求的数据会负载url后(就是把数据放置在http协议头中),以“?”来分割url和传输的数据,参数之间以&相连,如果数据是英文字母/数字则原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符用BASE64加密。
2.首先get是通过url提交数据,那么get提交数据量就跟url的长度有直接关系了。而实际上,url不存在参数上限的问题,http协议规范没有对url长度进行限制。这个限制是特定的浏览器以及服务器对他的限制。IE对URL长度的限制是2083字节,对于其它浏览器,如firefox,理论上没有长度限制,其限制取决于操作系统的支持。post数据是没有限制的,其起限制作用的是服务器的处理程序的处理能力。
3.post的安全性要比get的安全性高。这里所提到的安全性和上面get提到的“安全”不是同个概念。上面“安全”的含义仅仅是不做数据的修改,而这里的含义是真正的Security,比如通过get提交数据,用户名和密码将明文出现在url上,因为登录页面可能被浏览器缓存,其他人查看浏览器的历史记录,别人就可以拿到你的账号和密码,除此之外,使用get提交数据还可能造成Cross-site request forgery攻击。