GET和POST两者的区别
GET 和 POST 是 HTTP 协议中的两种发送请求的基本方法,对于前端开发者而言,几乎每天都在使用它们,再熟悉不过了,一般也都能说出几点两者的区别。
如果面试中被问到这个问题,先回答一下几点,肯定是不会有错的:
- GET 参数通过 URL传值,参数可见且不够安全,不能用来传递敏感信息,而 POST 参数放在 Request body 中,参数不可见,相对而言比较安全;
- GET 请求在 URL 中传送的数据大小是有限制的(一般不超过2k-4k,取决于浏览器),而 POST 请求中的数据大小长度根据后台配置文件设定,理论上没有限制;
- GET 在浏览器回退时是无害的,而 POST 在浏览器回退时会再次提交请求;(GET 会将请求参数放在请求的 URL 中,回退操作实际上浏览器会从之前的缓存中拿结果,POST 每次调用都会创建新的资源)
- GET 请求会被浏览器主动 cache,而 POST 除非手动设置,否则不会;(浏览器缓存分为强缓存和协商缓存)
- GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以;(GET 请求会把参数带到 URL 中,可以此保存浏览器书签)
- GET 请求参数会被完整地保留在浏览器历史记录里,而 POST 中的参数不会被保留;(道理同上)
- GET 请求只能进行 URL 编码,而 POST 支持多种编码方式;
- 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制;(URL 是 HTTP 的一个首部,根据约定,一定是 ASCII 字符的)
- GET 请求产生一个 TCP 数据包,而 POST 请求产生两个数据包;
但是!
这就结束了吗?
NO!NO!NO!
想要拿到高薪,得说出一点别人不知道的东西,气场这块要拿捏地死死的。
抛开固有印象,我们重新来审视一下 GET 和 POST,会发现它们本质上没有区别!
我们知道 GET 和 POST 是 HTTP 协议中的两种发送请求的方法,而 HTTP 是基于 TCP/IP 的关于数据在万维网中如何通信的协议。
HTTP 的底层是 TCP/IP,所以 GET 和 POST 的底层也是 TCP/IP。也就是说, GET 和 POST 都是 TCP 连接(这应该可以算是两者的相同点)。
换句话说,GET 和 POST 能做的事情是一样的,在技术上完全可以给 GET 请求 加上 Request body,给 POST 请求带上 URL 参数。
但是存在也不代表着一定合理。
在万维网世界中,TCP就像汽车,负责用来运输数据,但路上的汽车不会只有一辆的,而为了维护交通的高效运行,交通规则 HTTP 应运而生。HTTP 给汽车设定了几种服务类别,有 GET、POST、PUT、DELETE 等。HTTP 规定,当执行 GET 请求时,要给该车贴上 GET 标签,并且把要传输的数据放在车顶上(url 中)以方便记录;当执行 POST 请求时,要给该车贴上 POST 标签,并且为了安全把要传输的数据放在车厢里(Request body 中)。
当然规定是规定,你要非要在 GET 的时候偷偷在车厢里放一点货,或者在 POST 的时候把货往车顶上放,谁也拦不住你,只是会让别人觉得你是个憨憨,不跟你玩。
所以,HTTP 只是个行为准则,而 TCP 才是 GET 和 POST 怎么实现的基本。
上面我们了解了 HTTP 对 GET 和 POST 参数的传输渠道(url 还是 Request body)提出了要求,但我们还知道,两种请求的还对参数大小做出了限制,这又是怎么回事呢?
在万维网世界中,还有另一个重要角色:运输公司。不同的浏览器(发起 HTTP 请求)和服务器(接收 HTTP 请求)就是不同的运输公司。虽然理论上,可以在车顶无限堆放货物(url 中无限加参数),但是装货和卸货也是要成本的,运输公司要核算成本和控制风险,所以他们会限制单次运输量,数据量太大对浏览器和服务器都是很大的负担。
所以,大多数浏览器会限制 url 长度最多在 2k 个字节,大多数服务器最多处理 64k 大小的 url。如果你用 GET 服务,在 Request body 中偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你读出数据,但有些服务器会直接忽略。所以还是不要这样操作了。
现在我们知道,GET 和 POST 本质上就是 TCP 连接,并无差别,只不过由于 HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
说道这里,GET 和 POST 要说的也就差不多了。等等,或许你注意到了,上文中我特意给第9点加粗了,也就是:GET 请求产生一个 TCP 数据包,而 POST 请求产生两个数据包。
这是怎么回事呢?
对于 GET 请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200;
而对 POST 请求,浏览器先发送 header,服务器响应 100,浏览器再发送 data,服务器响应 200。
可以看出,POST 请求需要两步,而 GET 请求仅需一步,很明显 GET 的用时更短,效率更高。但如果你想用 GET 来代替 POST 来优化网站性能的话,还是需要谨慎的,以为:
- GET 和 POST 都有自己的语义,不能随便混用;
- 在网络环境好的情况下,GET 和 POST 所需的时间差别基本可以无视,但是在网络环境差的情况下,两次包的 TCP 在验证数据包完整性上,有非常大的优点;
- 并不是所有的浏览器都会在 POST 中发送两次包,如 Firefox 就只发送一次。
以上就是我总结的关于 GET 和 POST 的关系,望诸君雅正。
GET和POST两者的区别的更多相关文章
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- MySQL中interactive_timeout和wait_timeout的区别
在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...
- 设置line-height:1.5和line-height:150%或者line-height:150px的区别
直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
随机推荐
- [SCOI2009] [BZOJ1026] windy数
windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数?\(1 \le A \le ...
- 最小生成树(MST)Prim算法和Kruskal算法
刚学完最小生成树,赶紧写写学习的心得(其实是怕我自己忘了) 最小生成树概念:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 就是说 ...
- Codeforces Round #604 (Div. 2) A. Beautiful String(贪心)
题目链接:https://codeforces.com/contest/1265/problem/A 题意 给出一个由 a, b, c, ? 组成的字符串,将 ? 替换为 a, b, c 中的一个字母 ...
- Codeforces Round #651 (Div. 2) E. Binary Subsequence Rotation(dp)
题目链接:https://codeforces.com/contest/1370/problem/E 题意 给出两个长为 $n$ 的 $01$ 串 $s$ 和 $t$,每次可以选择 $s$ 的一些下标 ...
- 【uva 10954】Add All(算法效率--Huffman编码+优先队列)
题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...
- 【noi 2.6_6045】开餐馆(DP)
题意:有N个地址,从中选一些开餐馆,要保证相邻餐馆的距离大于k.问最大利润. 解法:f[i]表示在前 i 个地址中选的最大利润. 1 #include<cstdio> 2 #include ...
- C++实现邻接表
对于无向图(V0,V1),(V1,V2),(V2,V3),(V0,V2)对应的邻接表表示就是 在代码中,你要单独对V1.V2.V3创建一种结构体类型.在对后面的节点0,1,2,3创建一种结构体类型 代 ...
- 牛客编程巅峰赛S1第5场 - 青铜&白银 C.排队 (优先队列,归并排序)
题意:有\(m\)个窗口,\(n\)个人排队,每个人都有各自的办理时间,只有办理完成窗口才能空出来,后面的人开始办理,求有多少人比后面的人开始办理的早但完成的晚. 题解:我们可以用优先队列来模拟办理, ...
- 9.PowerShell DSC之Pull
前言 一般生产环境都使用Pull模式 配置Pull Server 配置Pull Server需要安装两个WindowsFeture:IIS.windows DSC,这两都可以通过UI界面化引导安装,也 ...
- Operating System:信号量
pv原语操作(1)操作系统PV意思:PV操作与信号量的处理相关,P表示通过的意度思,V表示释放的意思.(2)p操作和v操作是不可中断问的程序段,称为原语.如果将信号量看作共享变量,则pv操作为其临界区 ...