还搞不懂HTTP GET和POST的区别,看这里
我在其它文章中曾说到了处理html表单时用到了GET和POST方法,那么,GET和POST是两个什么东西呢?用它们处理表单又有啥区别呢?你不知道,就看这篇文章吧。对你绝对有用,不管你信不信,反正我是信了。
除了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,我们可以更高效的完成以下工作:
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我们究竟还有哪些误区呢?
我们来抓个包看看,做个试验:
查看抓包信息并分析,以下是我抓到的包的一些信息:
"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》。