一般在浏览器中输入网址访问资源都是通过get方式;在from提交中,可以通过method制定提交方式为get或者post,默认为get提交;http定义了与服务器交互的不同方法,最基本的方法有4钟:分别是get,post,put和delete。
URL全称是资源描述符,我们可以这样认为,一个URL地址,她用于描述一个网络上的资源,而HTTP中的get,post,put,delete就对应着对这个资源的查,改,增,删4个操作。
根据HTTP规范,get用于信息获取,而且应该是安全的(是指没有明显的对用户有影响的副作用(包括修改该资源的状态))和幂等的(一个方法不论进行多少次操作,结果都是一样的,比如,虽然put(把内容放到指定URL)和delete(删除某个URL代表的资源)都修改了资源内容,但多次操作,结果都是相同的,因此说,get是幂等的)。
通常我们说post的安全性要比get的安全性高(这里提到的安全性和上面get提到的安全是不同的概念。上面get中的安全的含义仅仅是不作数据修改,而这里安全的含义是真正的security的含义)。比如,通过get提交数据,用户名和密码将明文出现在URL上,比如有一个常见的url:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD,通过这个url我们就知道该用户的用户名是:hyddd,密码是idontknow。但是就因为这个原因说 POST 比 GET 安全是错的,因为POST和GET都是明文传输,用httpfox等插件,或者像WireShark 等类似工具就能观察到。
post和get的差别其实是很大的,语义上,get是获取指定URL的资源,是读操作,重要的一点是不论对某个资源get多少次,它的状态是不会改变的,在这个意义上,我们说get是安全的。因为get是安全的,所以get返回的内容可以被浏览器,cache服务器缓存起来。 而post的语义是对指定资源追加或者添加数据,所以是并不安全的,每次提交的post,参与的代码都会认为这个操作会修改操作对象资源的状态。于是,浏览器在你按下F5的时候就会跳出确认框,缓存服务器不会缓存post请求返回的内容。
所以,做一个总结,http中get和post的区别:
(1)get用于信息的获取,是安全的和幂等的;而post用于对信息的添加或者追加,是不安全的,也是不幂等的;、
(2)get返回的内容可以被浏览器你和cache服务器缓存下来;而post返回的内容不会被缓存下来;
(3)下面比较了get和post方法的一些区别
get | post | |
后退、刷新按钮 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 可以被缓存 | 不可以被缓存 |
编码类型 | application/x-www-form-urlencoded | 为二进制数据使用的多重编码 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 是的,当发送数据时,get方法向URL添加数据;URL的长度是受限制的。(最大长度为2048) | 无限制 |
对数据类型的限制 | 只允许ASCII码 | 没有限制,也允许二进制数据 |
安全性 | 与post相比,get的安全性较差,因为所发送的数据时URL的一部分。在发送密码或者其他敏感信息时绝对不要使用get | post比get更安全,因为参数不会被保存在浏览器历史或web服务器日志中。 |
可见性 | 数据在YRL中对所有人都是可见的 | 数据不会显示在URL中 |