剖析http get和post请求的区别

原创 2017年01月03日 11:52:55

我们知道HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议,HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。 因此从传输层上来说,get和post请求是没有什么区别的,那么我们经常提到的get和post的区别如:

1.GET在浏览器回退时是无害的,而POST会再次提交请求.
2.GET产生的URL地址可以被Bookmark,而POST不可以。
3.GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4.GET请求只能进行url编码,而POST支持多种编码方式。
5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6.GET请求在URL中传送的参数是有长度限制的,而POST么有。
7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9.GET参数通过URL传递,POST放在Request body中。

用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。
但是网络是有很多这样的tcp数据包的,如何区别这些这些tcp数据包,并且规定其传输优先级别,这就是http的规范诞生了,HTTP给数据包运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,所以说HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

那么还有一个疑问,关于参数大小的限制又是从哪来的呢?
这就是我们浏览器和服务器的各自规定了,数据量太大,对浏览器和服务器都有很大负担,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。
因此HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

可能你还会忽略GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。

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

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。既然如此为何不用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

当然Firefox为什么要这么做是有他的原因的:

我们每个应用都会做用户体验的优化。当然有很多其它原因,但是对于POST的两阶段提交引起的访问超时也发生过好几次,而且基本无解,只能修改实现方式,尽量减少传输的数据以便改用GET方式。

有不少浏览器厂商对于POST的提交采用两阶段发送数据,特别是IE系统列的XMLHttpRequest对象,所以在IE浏览器上用AJAX提交POST的数据,是按两个阶段,第一步先发送header数据,第二步再发送body部分。如果我们用winshark抓包会看到两连次结过程。

而对于firefox浏览器,则采用一次连接,这也是原来HTTP协议的“本意”,http协议本身不保存任何状态信息,一次请求一次应答。对于TCP事务而言,通讯次数越多可靠性越低,在一次连结中传输完需要的消息是最可靠的,但是却有很多浏览器厂商不愿意遵守这个原则,它们的理由也很搞笑:
假如网络环境不好,网络延迟、丢包的时候,服务端会等待(延迟时),客户端重发POST的DATA数据到服务单,来确保本次请求的完整性。

这理由不太具有说服力,header数据相对于body数据来说都是很小,如果一次传输中只收到header,body却丢了,那么这一次请求对于服务端来说,它只有等待超时才会知道后面的body没有了,这时它已经向客户端传输了请求错误码。客户端根本就谈不上重发body。当然如果浏览器厂商和WEB服务器是同一厂商,他们可以在收到header后等待body超时时发送一个重发指令给客户端,但是目前没有任何WEB服务端是这么做的,而且,这也从根本上违反了HTTP协议的规范,因为对于超时连结,如果再等它重发数据,再超时,再重发?那用户在WEB服务端定义的“超时”还能得到什么保证?

还不如一次连同header加body发送,如果数据包不完整,服务端返回连结超时用户只需要重刷一次即可,而如果两次提交,当收到header时,服务端的处理程序首先要开辟内存hode住header数据再等待body,对于同步处理的话当前进程或线程不能服务其它请求,极大降低服务端性能。最后还是返回异常给客户端,对于异步处理的话你根本不知道body什么时候过来,如果客户端只发送header就下线了,服务端可能要hode这个数据n久。

HTTP请求中POST与GET的区别

一、原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。 HTTP定义了与服务器...
  • yipiankongbai
  • yipiankongbai
  • 2014年04月18日 17:15
  • 98259

get 请求和post请求的区别

HTTP的Get/Post请求区别 博客分类:  WEB - J2EE开发框架 IIS应用服务器浏览器MVCASP  HTTP的Get/Post请求区别归纳 1. g...
  • forgetworld
  • forgetworld
  • 2014年05月12日 18:07
  • 2160

HTTP请求中POST与GET的区别

一、原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。 HTTP定义了与服务器...
  • yipiankongbai
  • yipiankongbai
  • 2014年04月18日 17:15
  • 98259

http中post 和 get 请求方法区别

前言 做Web开发就一定会涉及到浏览器和服务器的交互,所以了解浏览器和服务器交互的方式就尤为重要。从接触B/S开始就已经接触到了get和post,但是对它们的了解确实不深入。在后来不断的做项目过程中...
  • wswit
  • wswit
  • 2016年03月01日 22:06
  • 9858

Http之Get/Post请求区别

一 原理区别     一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方...
  • zmx729618
  • zmx729618
  • 2016年05月12日 13:47
  • 854

Android Http方法:Get请求与Post请求的区别及实例示范

Http方法:Get请求与Post请求的区别 Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求 Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改...
  • chenlove1
  • chenlove1
  • 2014年04月30日 09:54
  • 7190

GET和POST面试知识点

导读:大部分APP都依赖于网络通信,对于开发者来说,基于网络通信的开发无疑是必须掌握的。HTTP通信作为目前计算机主要的通信协议,是企业面试当中必问的。对于HTTP通信的概念,本文不作说明,我将在后续...
  • gao1440156051
  • gao1440156051
  • 2016年08月16日 09:23
  • 3314

POST与GET的区别及RESTful

在网站开发的时候通常会对POST和GET产生混淆,让人混淆的主要原因是基本上POST能解决的问题GET都能解决,反之亦然。今天就来说说者两者的区别。 GET:字面理解就是获取资源 ...
  • Shiyaru1314
  • Shiyaru1314
  • 2015年08月05日 11:48
  • 2085

从HTTP GET和POST的区别说起(面试心得)

前沿 当说起这个话题,就要从面试开始说,有次面试官问两者区别,就直接想到这不是很简单,答到:两者就是传输url明码、post表单提交更安全。如果说这个,第一种面试管为继续深究、第二种面试官直接pas...
  • Apple_hsp
  • Apple_hsp
  • 2016年02月29日 15:13
  • 2946

HTTP 协议中GET和POST到底有哪些区别

HTTP 定义了与服务器交互的不同方法,最常用的有4种,Get、Post、Put、Delete,如果我换一下顺序就好记了,Put(增),Delete(删),Post(改),Get(查),即增删改查,下...
  • wangzhilife
  • wangzhilife
  • 2013年10月08日 16:40
  • 23393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剖析http get和post请求的区别
举报原因:
原因补充:

(最多只允许输入30个字)