• 午间邂逅 | post 和 get 的兄弟情深


    前言

    本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍:

    我的 Github 博客

    学习导图:

    image-20200710142453734
    image-20200710142453734
    image-20200710143104928
    image-20200710143104928
    image-20200710143516991
    image-20200710143516991

    一、面试情景模拟

    面试官:『请你说下 postget 的区别!』

    看到这里,很多人禁不住内心的喜悦,嘴角微微上扬,然后强装镇定,拿出背好的拿手绝活,轻轻松松给出了「标准答案」:

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

    这时候,面试官邪魅一笑,他说:『GET 和 POST 本质上没有区别。』怎么办有点慌,是不是要回家等消息了。

    别慌,让我们扒下 GETPOST 的外衣,坦诚相见吧!

    PS:终于考完试了,摸鱼摸鱼!

    二、GET 和 POST 是什么?

    • GET 获取资源: 用来请求访问已被 URI 识别的资源,指定的资源经服务器端解析后返回响应内容
    • POST 传输实体主体: 用来传输实体的主体 虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法

    总的来说,他们是「HTTP 协议中的两种发送请求的方法」

    三、HTTP 是啥?

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

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

    四、你能理清 HTTP, TCP/IP,GET/POST 三者的关系吗?

    首先,我们来打几个比方

    TCP——汽车

    HTTP——交通规则

    GET, POST等方法——汽车的标签(生活中类比,标记为警车,救护车,消防车)

    • 当执行 GET 请求的时候,要给汽车贴上 GET 的标签(设置 method 为 GET),而且要求把传送的数据放在车顶上(url 中)以方便记录
    • 如果是 POST 请求,就要在车上贴上 POST 的标签,并把货物放在车厢里
    • 当然,你也可以在 GET 的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在 POST 的时候在车顶上也放一些数据,让人觉得傻乎乎的。

    综上,HTTP 只是个行为准则,而 TCP 才是 GETPOST 怎么实现的根本

    五、参数大小的限制从何而来

    先说结论——「浏览器 / 服务器的限制」

    首先,我们来打几个比方

    不同的浏览器和服务器——运输公司

    虽然理论上,你可以在车顶上无限的堆货物(url 中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制 url 长度在 2K 个字节,而(大多数)服务器最多处理 64K 大小的 url。超过的部分,恕不处理。如果你用 GET 服务,在 request body 偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然 GET 可以带 request body,也不能保证一定能被接收到哦。

    六、GET 和 POST 的区别从何而来?

    • HTTP 的规定
    • 浏览器 / 服务器的限制

    七、GET 和 POST 的重大区别

    7.1 重大区别是什么?

    简单来说:

    • GET 产生一个 TCP 数据包
    • POST 产生两个 TCP 数据包

    详细来说:

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

    打个比方:

    • GET 只需要汽车跑一趟就把货送到了

    • POST 得跑两趟,第一趟,先去和服务器打个招呼 “嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去

    7.2 既然 看起来 GETPOST 有效,为啥不直接用 GET 来替换 POST

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

    如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力

    本文参考链接:

    本文使用 mdnice 排版

  • 相关阅读:
    玩家移动
    人物上线(激活玩家之后)
    map 玩家上线
    无锁的环形队列
    随笔
    std::bind
    如何查找文件中的schema约束
    myeclipse便捷导包方式
    21 求1+2!+3!+...+20!的和
    20 求出这个数列的前 20 项之和
  • 原文地址:https://www.cnblogs.com/xcynice/p/post-and-get.html
Copyright © 2020-2023  润新知