GET与POST的区别?

作者:Gakki

我们先来看看 w3school 中对于 GET 与 POST 的解释。 GET 与 POST 的区别

分类 GET POST 对比
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交) 每次都重新提交这无疑会对浏览器造成压力,该问题也是作为 web 端性能优化的重要方向之一
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存 缓存可以为浏览器减少请求链数,web 端性能优化的重要方向之一
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码
历史 参数保留在浏览器历史中 参数不会保存在浏览器历史中 相当于缓存,可减少浏览器压力
对数据长度的限制 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) 无限制 HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因;服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制
对数据类型的限制 只允许 ASCII 字符 没有限制。也允许二进制数据 POST 选择更多
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分 POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,浏览器F12下什么都一目了然,或者抓个包,就能完整地获取数据报文 ;要想安全传输,Encode(转码)当然对于懂的人来说也不安全; 比较安全的只有加密,也就是 HTTPS
可见性 数据在 URL 中对所有人都是可见的 数据不会显示在 URL 中
  • 注:上述区别在大部分浏览器上是存在的,因为这些浏览器实现了 HTTP 标准
  • 所以,从上述标准来看,GET 与 POST 的区别在于:
    • GET 用于获取信息,是无副作用的,是幂等的且可缓存
    • POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存
    • 注,幂等的概念:如果一个操作没有副作用,或者多次操作对资源产生的副作用相同,我们就说这个操作是幂等的

1. GET 与 POST

  • 一般在面试的时候,面试官都会问道这个问题,一般这样回答:

    1. GET 在浏览器回退时是无害的,而 POST 会再次提交请求
    2. GET 参数通过 URL 传递,POST 放在 body 中
    3. GET 比 POST 更不安全,因为 GET 请求的时候将参数直接暴露在 URL 上,所以最好不要用来传递敏感信息
    4. 对比参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制
    5. GET 请求只能进行 URL 编码,而 POST 支持多种多种编码方式
    6. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    7. GET 常用于获取数据,POST 用于提交数据
  • 但其实,GET 与 POST 并没有实质的区别

  • POST 与 GET 是什么?它们都是 HTTP 协议中的两种发送请求的方法

  • 那什么是 HTTP 了? HTTP 超文本传输协议(Hypertext Transfer Protocol,缩写 HTTP)旨在启用客户端和服务器之间的通信。HTTP 充当客户端和服务器之间的请求-响应协议。如:客户端(浏览器)向服务器发送 HTTP 请求;然后服务器将响应返回客户端。响应包含有关请求的状态信息,也可能包含所请求的内容。HTTP 的底层是 TCP/IP ,因此 GET 和 POST 的底层也是 TCP/IP 。换句话说,GET 和 POST 都是 TCP 链接,你可以给 GET 的 request body 中传值,也可以给 POST 加上 URL 参数,只是看服务器那边是否接受处理。导致 GET 与 POST 在应用中区别的是由于 HTTP 的规定和浏览器/服务器的限制

  • TCP 是用来传输数据的,是可靠传输。HTTP 规定了几种常用的请求方法,最常用的POST 、 GET ,HTTP 规定在 GET 请求的时候,要求把传送的数据放在 URL 中,POST 请求的时候,放在 body 中。但是,你也可以在 GET 请求的时候,在 body 中放参数,POST 请求的时候,在 URL 放数据。HTTP 只是一个准则,主要的还是需要看 TCP

  • 关于 w3school 所说的参数大小的限制是在哪体现的了?理论上,你可以在 URL 中无限制的加参数,但是浏览器与服务器会去限制单次传输的参数来控制风险,数据量太大会对浏览器与服务器造成很大的风险。因此,在万维网(WWW)中,大多数的浏览器通常都会限制 URL 长度在 2K 个字节,而大多数服务器最多也只处理 64K 大小的 URL ,超过的部分都不会去处理。但如果用 GET 请求的时候,在 request body 中放了数据,不同的服务器处理的方式也不同,有的会处理,有的服务器会直接忽略。因此,虽然 GET 可以在 body 放参数,但也不能保证服务器会接收数据

  • 因此,GET 与 POST 本质上都是 TCP 链接,没有什么差别。但是由于 HTTP 的规定 与 浏览器/服务器 的限制,导致 GET 与 POST 在应用中存在区别

2. GET 与 POST 实质的区别

  • GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包
  • 对于 GET 请求,浏览器会把 header 和 data 一起发送出去,服务器会响应数据
  • 而对于 POST 请求,浏览器会先将 header ,服务器响应 100 状态码,接着浏览器再将 data 数据发送出去,服务器响应数据
  • 总结,GET 只需要发送一次包,而 POST 会发送给两次包。因为 POST 需要发送两次的原因,导致会比 GET 更会费时间。但是在网络环境比较好的情况下,发一次包的时间和发两次包的时间基本没有差别;而在网络环境比较差的情况下,两次包的 TCP 在验证数据包的完整性上有着非常大的优势。然后就是并不是所有的浏览器都会在 POST 中发送两次包,FireFox 、Chrome 只会发送一次;header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 POST 必然行为。

3. 杂谈

POST 方法比 GET 方法安全?

  • 按照网上大多数博文的回答,POST 都比 GET 安全,因为 POST 是将参数放在 body 中传输的,在 URL 中是不可见的。但是,从传输的角度来说,它们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上进行抓包,就可以把数据完整的获取下来。要想安全传输,最好使用加密,也就是 HTTPS
  • 关于 GET 方法的长度限制?
  • 在 w3school 中,我们看到 URL 的长度是受限制的。但 HTTP 协议没有对 body 与 URL 的长度设置限制,对 URL 设置限制大多数都是浏览器和服务器的原因。当服务器处理较长的 URL 的时候,需要消耗比较多的资源,为了性能和安全考虑(防止恶意构置长 URL 来攻击服务器),会给 URL 长度加限制

为什么body更安全?

  • 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET
  • POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
  • 从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,浏览器F12下什么都一目了然,或者抓个包,就能完整地获取数据报文 ;要想安全传输, 比较安全的只有加密,也就是 HTTPS

get长度和浏览器有关?

  • HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因;服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容