详解get和post的那些事

写在最前,如果想立刻知道区别,直接看第四章即可。

一、误区

http get和post的区别?五大误区?

1、get用于获取数据,post用于提交数据

2、get提交参数追加在url后面,post参数可以通过http body提交

3、get的url会有长度上的限制,则post的数据则可以非常大

4、get提交信息明文显示在url上,不够安全,post提交的信息不会在url上显示

5、get提交可以被浏览器缓存,post不会被浏览器缓存

满满的套路,害死人不偿命。接下来为您一一解开谜底。。

二、交互方式

为了更好的说明问题,先扯扯淡,说说客户端与服务器交互方式。

我们都知道,使用URL可以确定一个资源所在的位置,那么我们确定这个资源以后,是如何对这个资源进行处理的呢?

Http协议定义了客户端与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL定位了这个资源,而HTTP中的GET,POST,PUT,DELETE就是对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。那么,除了上面说的四种方法,HTTP还有其它方法么?其实HTTP中定义了以下几种请求方法:

  • GET方法
  • HEAD方法
  • PUT方法
  • POST方法
  • TRACE方法
  • OPTIONS方法
  • DELETE方法
2.1 Get

Get是最常用的方法,通常用于请求服务器发送某个资源。

HEAD方法与GET方法的行为很类似,但服务器在响应中只返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查,使用HEAD,我们可以更高效的完成以下工作:

在不获取资源的情况下,了解资源的一些信息,比如资源类型;
通过查看响应中的状态码,可以确定资源是否存在;
通过查看首部,测试资源是否被修改。

2.2 Put

PUT方法是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档;如果那个文档存在的话,就用这个主体来代替它。

2.3 Post

POST方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。

2.4 Trace

TRACE方法会在目的服务器端发起一个“回环”诊断,我们都知道,客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关、或者其它的一些应用程序。这中间的每个节点都可能会修改原始的HTTP请求,TRACE方法允许客户端在最终将请求发送服务器时,它变成了什么样子。由于有一个“回环”诊断,在请求最终到达服务器时,服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文的最终模样。这样客户端就可以查看HTTP请求报文在发送的途中,是否被修改过了。

2.5 Options

OPTIONS方法用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

2.6 Delete

DELETE方法就是请求服务器删除指定URL所对应的资源。但是,客户端无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。

上面对HTTP所支持的所有方法大体上进行了介绍,但是在实际开发中,我们使用的更多的是GET和POST,而且在面试的时候,也经常会问GET和POST的区别,这里就着重对GET和POST的区别进行总结。

三、揭露真相

3.1 get用于获取数据,post用于提交数据

GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端get方法也可以用作资源更新,都有“写”功能,最简单的例子就是/delete?id=1,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。

3.2 get提交参数追加在url后面,post参数可以通过http body提交

http没明确规定什么get/post方法要用什么样的方式传输数据,之所以有这种描述,原因主要有两点:浏览器设计、服务器设计。

  • 浏览器不支持get+httpbody是比较常见的。fiddler模拟请求时,如果是get,你填下面的body部分会红色显示,告诉你这样不好,仅仅是不好,因为fiddler并没有禁止get+body这种请求,但看得出它不建议你用这种方式的请求。

  • 常见的servlet服务器不支持。比如tomcat,默认不解析get的body部分,造成了get不能用body传递参数的现象。

3.3 get的url会有长度上的限制,则post的数据则可以非常大

由于使用GET方法提交数据时,数据会以&符号作为分隔符的形式,在URL后面添加需要提交的参数,有人就会说了,浏览器地址栏输入的参数是有限的,而POST不用再地址栏输入,所以POST就比GET可以提交更多的数据。难道真的是这样的么?

而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

同时,POST是没有大小限制的,HTTP协议规范也没有进行大小限制。POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。

总归一句话,这个限制是针对所有HTTP请求的,与GET、POST没有多少关系。

3.4 get提交信息明文显示在url上,不够安全,post提交的信息不会在url上显示

GET将提交到服务器的数据添加到URL中了,可见;虽然POST的数据,你肉眼看不到,你抓个包看看,在HTTP包的包体中,我们提交的数据时仍然可见的;所以说,从这方面来说,POST也是以五十步笑百步了。

另外扯一句,Base64不是加密,用这个加密就是掩耳盗铃啊。

3.5 get提交可以被浏览器缓存,post不会被浏览器缓存

get被建议做成幂等的,缓存是很有必要的,一般静态资源的get请求都是会设置有效缓存时间的,这一点很容易想明白。很多时候缓存get在服务器和浏览器中是默认行为,这对大量使用get请求的ajax不利,所以ajax请求一般会在请求url后加上一个随机数,浏览器和服务器就认为它是不同的get请求,不会缓存这个get请求。

POST的resp实际上是允许被缓存的,但是一般都不实现这个。
浏览器不实现是有道理的,现实中POST大多执行的是写操作,缓存写操作结果无意义,还有POST可以说是登录/支付这类功能的标准方法了,双方交流的是敏感数据,缓存这类数据的安全隐患很大。

四、Get与Post的区别

4.1 post请求包含更多的请求头

post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如content-type),这其实是微乎其微的。

4.2 post比get慢
  • post请求的过程:
1.浏览器请求tcp连接(第一次握手)

2.服务器答应进行tcp连接(第二次握手)

3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

4.服务器返回100 continue响应

5.浏览器开始发送数据

6.服务器返回200 ok响应

  • get请求的过程
1.浏览器请求tcp连接(第一次握手)

2.服务器答应进行tcp连接(第二次握手)

3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

4.服务器返回200 ok响应

也就是说,目测get的总耗是post的2/3左右。

4.3 post能发送更多的数据类型

post能发送更多的数据类型、get只能发送ASCII字符。

4.4 安全性

post不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中。

4.5 post发送的数据量更大

前面误区说了,不是因为post和get的原因,是因为浏览器设计与服务器设计的问题导致的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,398评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,510评论 3 416
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,346评论 0 374
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,972评论 1 311
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,739评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,196评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,260评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,413评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,951评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,779评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,980评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,522评论 5 359
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,217评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,647评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,887评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,659评论 3 391
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,967评论 2 374

推荐阅读更多精彩内容