我在其它文章中曾说到了处理HTML表单时用到了GET和POST方法,那么,GET和POST是两个什么东西呢?用它们处理表单又有啥区别呢?你不知道,就看这篇文章吧。对你绝对有用,无论你信不信,反正我是信了。html
除了GET和POST这两种方式之后,还有哪些呢?我接下来就先对HTTP中定义的操做进行总结一下。面试
咱们都知道,使用URL能够肯定一个资源所在的位置,那么咱们肯定这个资源之后,是如何对这个资源进行处理的呢?浏览器
Http协议定义了客户端与服务器交互的不一样方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL定位了这个资源,而HTTP中的GET,POST,PUT,DELETE就是对应着对这个资源的查,改,增,删4个操做。到这里,你们应该有个大概的了解了,GET通常用于获取/查询资源信息,而POST通常用于更新资源信息。那么,除了上面说的四种方法,HTTP还有其它方法么?其实HTTP中定义了如下几种请求方法:缓存
如今就对上述的全部方法都介绍一下,增长你们对这些方法的一个整体认识。安全
Get是最经常使用的方法,一般用于请求服务器发送某个资源。服务器
HEAD方法与GET方法的行为很相似,但服务器在响应中只返回实体的主体部分。这就容许客户端在未获取实际资源的状况下,对资源的首部进行检查,使用HEAD,咱们能够更高效的完成如下工做:app
PUT方法是让服务器用请求的主体部分来建立一个由所请求的URL命名的新文档;若是那个文档存在的话,就用这个主体来代替它。测试
POST方法向服务器提交数据,好比完成表单数据的提交,将数据提交给服务器处理。url
TRACE方法会在目的服务器端发起一个“回环”诊断,咱们都知道,客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关、或者其它的一些应用程序。这中间的每一个节点均可能会修改原始的HTTP请求,TRACE方法容许客户端在最终将请求发送服务器时,它变成了什么样子。因为有一个“回环”诊断,在请求最终到达服务器时,服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文的最终模样。这样客户端就能够查看HTTP请求报文在发送的途中,是否被修改过了。操作系统
OPTIONS方法用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
DELETE方法就是请求服务器删除指定URL所对应的资源。可是,客户端没法保证删除操做必定会被执行,由于HTTP规范容许服务器在不通知客户端的状况下撤销请求。
上面对HTTP所支持的全部方法大致上进行了介绍,可是在实际开发中,咱们使用的更多的是GET和POST,并且在面试的时候,也常常会问GET和POST的区别,这里就着重对GET和POST的区别进行总结。
我记得我上大学那会,就问过老师,GET和POST有啥区别,老师就简单的告诉我,POST比GET安全,后来,我才发现,我被老师骗了。那么,对于GET和POST咱们究竟还有哪些误区呢?
误区一:POST能够比GET提交更多更长的数据? 因为使用GET方法提交数据时,数据会以&符号做为分隔符的形式,在URL后面添加须要提交的参数,有人就会说了,浏览器地址栏输入的参数是有限的,而POST不用再地址栏输入,因此POST就比GET能够提交更多的数据。难道真的是这样的么?
而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操做系统的支持。 同时,POST是没有大小限制的,HTTP协议规范也没有进行大小限制。POST数据是没有限制的,起限制做用的是服务器的处理程序的处理能力。 总归一句话,这个限制是针对全部HTTP请求的,与GET、POST没有多少关系。
误区二:POST比GET安全? 首先,咱们要认可安全的概念有不少种,要是从最基本的肉眼看到就不安全,肉眼看不到那就是安全的概念说呢,GET确实没有POST安全,毕竟小白用户确实能够看到在URL中带有的数据信息,这个你没法狡辩。那么要是往严谨了说呢,POST是否是要比GET安全呢?其实不是的。
上面也说了,GET将提交到服务器的数据添加到URL中了,可见;虽然POST的数据,你肉眼看不到,你抓个包看看,在HTTP包的包体中,咱们提交的数据时仍然可见的;因此说,从这方面来讲,POST也是以五十步笑百步了。
咱们来抓个包看看,作个试验:
查看抓包信息并分析,如下是我抓到的包的一些信息:
"192.168.199.125","117.121.57.62","HTTP","1304","POST /sso/signup?client_id=9&url=http://cn.cocos2d-x.org/main/sso_return HTTP/1.1 (application/x-www-form-urlencoded)"
192.168.199.125是个人本机地址;117.121.57.62是请求的目的地址。1304是包的长度;接下来的数据才是咱们须要关注的重点,能够很明显的看到,是以POST的方式向服务器发送注册信息的。咱们再来看看发送了那些信息,因为使用的POST方法,咱们没法从URL中获得任何有用的东西,那咱们就从HTTP包体中看看。内容以下:
username=JellyThink&password=e10adc3949ba59abbe56e057f20f883e&repassword=e10adc3949ba59abbe56e057f20f883e&email=jellythink%40163.com&vcode=5gp8&rgpermit=1
看到了吗?里面都是我输入的信息,具体以下:
如今你还觉POST安全吗?关于GET方式,我这里就再也不举例说明了。你也赶忙动手去抓个包看看吧。
最后呢,不少时候,你们都觉的使用GET很方便,毕竟使用POST要用到Form,可是,你要知道,你使用GET方法时,浏览器可能会缓存你的地址等信息,还会留下历史记录,而对于POST方法呢,则不会进行缓存。之后在开发中,必定要分清楚GET和POST的使用场合,何时要使用GET,何时要使用POST,本身作到心中有数。
可能,你在Google相似的文章的时候,可能会看到分析POST和PUT区别的文章,这又是一类纠结的东西,更多的时候,咱们分析这种东西都是分实际情景,结合设计者的语义去使用,慢慢体会吧。至少我如今也不知道如何准确的区分POST和PUT。固然了,我仍是要推荐一位大牛的文章,有时间去拜读一下吧,《REST当中为何要使用HTTP PUT》。
各位,圣诞快乐。
果冻想,玩代码,玩技术!
2014年12月25日 于深圳。