还搞不懂HTTP GET和POST的区别,看这里
前言
我在其它文章中曾说到了处理HTML表单时用到了GET和POST方法,那么,GET和POST是两个什么东西呢?用它们处理表单又有啥区别呢?你不知道,就看这篇文章吧。对你绝对有用,不管你信不信,反正我是信了。
除了GET和POST这两种方式以后,还有哪些呢?我接下来就先对HTTP中定义的操作进行总结一下。
HTTP中定义的有哪些?
我们都知道,使用URL可以确定一个资源所在的位置,那么我们确定这个资源以后,是如何对这个资源进行处理的呢?
Http协议定义了客户端与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL定位了这个资源,而HTTP中的GET,POST,PUT,DELETE就是对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。那么,除了上面说的四种方法,HTTP还有其它方法么?其实HTTP中定义了以下几种请求方法:
GET方法;
HEAD方法;
PUT方法;
POST方法;
TRACE方法;
OPTIONS方法;
DELETE方法。
现在就对上述的所有方法都介绍一下,增加大家对这些方法的一个总体认识。
Get是最常用的方法,通常用于请求服务器发送某个资源。
HEAD方法与GET方法的行为很类似,但服务器在响应中只返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查,使用HEAD,我们可以更高效的完成以下工作:
在不获取资源的情况下,了解资源的一些信息,比如资源类型;
通过查看响应中的状态码,可以确定资源是否存在;
通过查看首部,测试资源是否被修改。
PUT方法是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档;如果那个文档存在的话,就用这个主体来代替它。
POST方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。
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也是以五十步笑百步了。
抓个包看看
我们来抓个包看看,做个试验:
打开这个链接,去cn.cocos2d-x.org注册个账号;
填好注册信息;
打开Wireshare进行抓包;
在注册页面,提交注册信息。
查看抓包信息并分析,以下是我抓到的包的一些信息:
"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
看到了吗?里面都是我输入的信息,具体如下:
username=JellyThink
password=e10adc3949ba59abbe56e057f20f883e(MD5码)
repassword=e10adc3949ba59abbe56e057f20f883e
email=jellythink@163.com
vcode=5gp8(验证码)
现在你还觉POST安全吗?关于GET方式,我这里就不再举例说明了。你也赶紧动手去抓个包看看吧。
最后呢?
最后呢,很多时候,大家都觉的使用GET很方便,毕竟使用POST要用到Form,但是,你要知道,你使用GET方法时,浏览器可能会缓存你的地址等信息,还会留下历史记录,而对于POST方法呢,则不会进行缓存。以后在开发中,一定要分清楚GET和POST的使用场合,什么时候要使用GET,什么时候要使用POST,自己做到心中有数。
可能,你在Google类似的文章的时候,可能会看到分析POST和PUT区别的文章,这又是一类纠结的东西,更多的时候,我们分析这种东西都是分实际情景,结合设计者的语义去使用,慢慢体会吧。至少我现在也不知道如何准确的区分POST和PUT。当然了,我还是要推荐一位大牛的文章,有时间去拜读一下吧,《REST当中为什么要使用HTTP PUT》。
书籍推荐
人生是个圆,有的人走了一辈子也没有走出命运画出的圆圈,其实,圆上的每一个点都有一条腾飞的切线。
玩代码、玩技术
长按识别二维码,关注“果冻想”