杂谈——HTTP的两种请求:GET和POST的作用、区别与本质

当面试的时候,考官问你:GET和POST的作用是什么,它们又有什么区别呢

这时候你该如何回答呢?

且让我们来理一理思绪~

开始入手web项目的伙伴们基本上都开始使用GET和POST请求了,那这两种请求到底是什么东西呢,它又有什么作用?

今天我们来细细了解一下。GET和POST作为http的两种请求,想要了解它们就得先认识一下HTTP协议。

那么什么是HTTP协议呢?

超文本传输协议,即Hyper Text Transfer Protocol——HTTP,是一个为了使客户端和服务器顺利进行通讯而设计的协议。

它是如何工作的呢?

HTTP在客户端与服务器之间以request-response protocol(请求-回复协议)工作。请求-回复协议主要有GETPOST两种方法。

那这两种方法有什么作用呢?

GET——从指定的服务器中获取数据

POST——提交数据给指定的服务器处理

接下来我们就好好了解一下这两种方法。

GET方法

概念:

使用GET方法时,查询字符串以键值对的形式被附加在URL地址后面,一起发送到服务器。

比如我们在CSDN搜索“什么是GET”,得到的网址如下:

从上图我们可以看到,GET方式将搜索的内容附加在URL地址后面,再从指定的服务器中获取数据显示。其格式为:

分割URL和传输数据,参数之间以&相连。 数据如果是英文字母/数字,原样发送, 如果是空格,转换为+, 如果是中文/其他字符,则直接把字符串用BASE64加密,及“%”加上“字符串的16进制ASCII码”。 

特点:

  • GET请求能够被缓存
  • GET请求会保存在浏览器的浏览记录中
  • 以GET请求的URL能够保存为浏览器书签
  • GET请求有长度限制
  • GET请主要用于获取数据。

从上面所述的特点可以发现,大多数的搜索引擎的搜索框用的都是GET请求,通过GET请求获取搜索到的相关数据。对于倒数第二点——GET请求有长度限制,这个想必很多人在用搜索引擎的时候也发现了:当你复制一大段文字到搜索框的时候,它只会显示少部分。这就说明了GET请求有长度限制。

POST方法:

概念:

使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器。

特点:

  • POST请求不能被缓存下来
  • POST请求不会保存在浏览器的浏览记录中
  • 以Post请求的URL无法保存为浏览器书签
  • POST请求没有长度限制

显然,POST请求的很多特点于GET请求相反,从这个对比我们可以知道,POST请求比GET请求更具有保密性以及安全性。像我们平常的登录网站的账号与密码的提交就属于POST请求。

接下来我们通过一张表来具体对比一下GET和POST这两种请求。

当然了, HTTP其实也不止GET和POST这两种,还有一些其他的请求方法,如下表:

想到这里,你恐怕即将要脱口而出一大段:

  • GET在浏览器回退时是无害的,而POST会再次提交请求。

  • GET产生的URL地址可以被添加为书签,而POST不可以。

  • GET请求会被浏览器主动存储,而POST不会,除非手动设置。

  • GET请求只能进行url编码,而POST支持多种编码方式。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  • GET请求在URL中传送的参数是有长度限制的,而POST么有。

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  • GET参数通过URL传递,POST放在Request body中。

 就在你信心满满,底气十足地将一通标准答案倾倒在面试官面前的时候,你却发现对方嘴角还带着一丝丝轻笑,似乎不是很满意这个答案。

难道,事情还有更进一步挖探的可能?

容ææèä¸ä¸è¡¨æå

按道理来说,上面答的已经很全面了呀,难不成还有遗漏?

且让我再梳理一遍。

GET和POST是什么?

HTTP协议中的两种发送请求的方法。

HTTP是什么?

HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。 

嗯?这好像和刚才梳理的不太一样。

那既然大家都是TCP链接,那为什么这两种方法特征不一?莫非在成长的路上变异了咩~

等等,HTTP的底层是TCP/IP,既然TCP没有啥不同的地方,那GET/POST的差别会不会是HTTP协议给捣鼓出来的?

那这次我们从底层出发,再来梳理梳理。

首先,在咱们万维网世界里,TCP就是运输工具(如汽车),我们用TCP来运输数据。它很可靠,从来不会发生丢件少件的现象。但是,大家都是TCP链接,也就是说所有的汽车都长一样,路上全是一样的汽车。那么假如有加急的数据需要传送,若是被不急的数据给挡住路,堵车了怎么办?整个交通系统一定会瘫痪。那怎么办?

这个时候就需要交通规则来约束行为。因此我们的奥义——HTTP协议,由此破壳而出。

HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,

HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。

如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,但这让人觉得傻乎乎的。

显然,TCP才是GET和POST怎么实现的基本。而HTTP只是个行为准则。

到这里也许你如果以为可以继续作答了,那你就too simple啦~

从上文的描述中我们可以知道,HTTP只是对GET和POST参数的传送渠道(url还是requrest body)提出了要求,那“标准答案”里关于参数大小的限制又是从哪来的呢?

我们仔细想想,既然万维网里边有那么多运输工具,那不还得有运输公司吗?这么多种运输工具,岂不是有很多家运输公司咩?

因此,在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。

注:业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

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

看到这里你是不是觉得自己已经明白了GET/POST的真谛,想要夺门而去?

这里,我不得不挽留一下:少年!请留步!

因为我手里还攥着一个终极大boss!

GET和POST还有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包。

这个怎么理解呢?

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

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

还是以运输车举例,贴着GET标签的运输车车跑一趟就把货送到了,而POST得先跑过去告诉服务器,说:“你准备一下,我要运货到你这里啦~”,然后再回去将货物运输到目的地。

从上面的描述来看,POST需要走两趟,而GET只需要一趟,似乎GET更加的高效一些。

但孔子说“因材施教”,这两种方式也因不同的运用环境而有着其各自的优势。

也许有些人会想要用GET来优化性能,还望大家多加谨慎一些,毕竟GET与POST都有自己的语义,不能随便混用。

而且在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,两种都很快。而在网络环境差的情况下,两次包的TCP在验证数据包完整性这一点上,有非常大的优点。

此外,也并不是所有的浏览器都会在POST中发送两次包,像Firefox就只发送一次。

所以,要想通过GET置换POST,还是要谨慎一些哟。

好啦,今天的内容就到这里。

关于GET和POST的作用、区别与其本质,只需要将上文中的标准答案以及文中后半部分对这两种方法本质的阐述结合来看即可。

只要总结理解好,天王老子也不怕~

biu~~~~

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/84146983