JavaScript--GET请求和POST请求的区别到底是什么?

GET请求和POST请求是比较常见的俩种请求,基本都能说出一二,下面是来自w3c的标准答案:

  • GET请求的参数是在url中,而POST请求的参数是request body中;
  • GET请求会主动被浏览器缓存,而POST请求不会,除非手动设置;
  • GET请求的参数会被缓存在浏览器的历史记录中,而PSOT请求不会;
  • GET请求会比POST请求更加安全,因为GET请求的参数是在URL中裸奔;
  • GET请求在浏览器回退的时候是无害的,而POST请求会再次发起请求;
  • GET请求的参数的长度会有限制,而POST请求没有;
  • GET请求对参数的数据类型,GET只接受ASCII字符,而POST没有限制;
  • GET请求产生的URL地址可以被Bookmark,而POST请求不可以。

能答出这些答案的说明你很牛逼,但是离相当牛逼还差点对本质上区别的理解,且听我给你慢慢道来:

本质上来说,GET请求和POST请求其实没什么区别。get请求和post请求是什么,他们是HTTP协议中的俩种请求方法,那么HTTP又是什么呢?HTTP是基于TCP/IP的数据在万维网中传输的协议。因此,HTTP的底层就是TCP/IP,SO,GET请求和POST请求的底层也是TCP/IP,是不是很神奇?所以,GET/POST请求就是TCP链接,他们做的事情其实是一样的,把GET请求的参数放到request body中,把POST请求的参数放到URL上在技术层面将其实是可行的。那么为什么还有上面的那些区别呢?

其实在万维网的世界中,TCP就像是大货车,是用来运送数据的,这其实很安全,并不会出现丢包少包的现象。但有个很致命的问题就是,公路上跑的大货车都完全一样。根本无法区分。所谓无规矩不成方圆。所以,HTTP就应用而生。HTTP给大货车贴上了不同的标签。是GET,POST,PUT或者是DELETE等等?并且规定了所携带的货物(参数)放在那里?比如,GET请求要放到URL中,而POST请求要放到request body中。所以,这就是上面所说的GET请求的参数在URL,而POST请求参数在request body中的原因。

可是上面讲数据量的大小也不一样,这又是为什么呢?这是因为还有个运输公司的角色(浏览器)存在着。不同浏览器运输数据的成本也不相同,因此他们在浏览器和服务器数据传输上做了相应的限制。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

所以,GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

但是,但是,但是,但是,还没有完。。。。。

GET和POST还有一个重大区别:GET产生一个TCP数据包;POST产生两个TCP数据包

  • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
  • 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

这样来说,似乎GET请求会比POST请求更高效,但其实在网络环境比较好的情况下,几乎可以忽略他们的差别。还有一点就是其实并不是所有的浏览器的PSOT请求都是发送俩次,切记fireFox是个例外。

这才是GET请求和POST请求区别的完整版。。。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2022 Lee
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信