V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
okzpy9425
V2EX  ›  HTTP

Http 中 get 和 post 的区别?

  •  
  •   okzpy9425 · 2018-01-21 20:33:46 +08:00 · 7163 次点击
    这是一个创建于 2496 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天去面试,被问道一个这样的问题。。 我回答的是主要区别是 一个是幂等的 一个不是。然后他说还有其他。我一时半会儿也没想出来。。然后就 GG 了。

    70 条回复    2018-01-23 22:16:08 +08:00
    throns
        1
    throns  
       2018-01-21 20:50:40 +08:00 via iPhone
    不是没啥区别吗?
    est
        2
    est  
       2018-01-21 20:59:50 +08:00
    没区别。都是数据传输

    说 get 幂等的。你说网页访问计数器如何实现甩他一脸。
    zhlssg
        3
    zhlssg  
       2018-01-21 21:00:37 +08:00
    GG 也不会因为一个问题吧,安全,请求数据大小限制? rest 风格的意义?缓存?
    okzpy9425
        4
    okzpy9425  
    OP
       2018-01-21 21:15:44 +08:00
    @throns 我说我知道的就这一点。。。然后那个人一直说就这一点? 言外之意就是还有了。。
    okzpy9425
        5
    okzpy9425  
    OP
       2018-01-21 21:16:20 +08:00
    @zhlssg 还有一个 csrf 的问题。。我忘了。然后 GG 了。
    thundernet8
        6
    thundernet8  
       2018-01-21 21:21:18 +08:00 via Android
    post 可以 body 负载较多数据 get 没有这么用的
    brickyang
        7
    brickyang  
       2018-01-21 21:21:31 +08:00 via iPhone
    你的面试官是不是看过这篇文章: https://zhuanlan.zhihu.com/p/22536382
    eslizn
        8
    eslizn  
       2018-01-21 21:23:15 +08:00
    querystring 和 body 的区别
    tongz
        9
    tongz  
       2018-01-21 21:24:54 +08:00
    GET 长度受限于浏览器,POST 长度和服务端配置有关。

    然后,语意上的不同?

    GET 携带参数是以 queryString 的形式,POST 有多种可选?
    okzpy9425
        10
    okzpy9425  
    OP
       2018-01-21 21:33:43 +08:00
    @brickyang 这篇文章是错的把。。。
    okzpy9425
        11
    okzpy9425  
    OP
       2018-01-21 21:34:40 +08:00
    @tongz 我也不知道人家要什么答案。。他也没说。。
    tomczhen
        12
    tomczhen  
       2018-01-21 21:35:20 +08:00 via Android   ❤️ 5
    get 也可以带 body,只要 client 支持,server 处理。同理,post 也可以有 query string。

    get 幂等与否要看 server 端如何处理,说到底各种差异是 client 和 server 如何处理造成的,协议本身来讲就只有语义差异,但本质上没区别。
    okzpy9425
        13
    okzpy9425  
    OP
       2018-01-21 21:35:23 +08:00
    @thundernet8 这个我倒是没说。。
    dobelee
        14
    dobelee  
       2018-01-21 21:42:30 +08:00 via Android
    从协议角度讲,没啥区别,正如 12 楼所讲。往往区别在于一些客观因素,如 get query 安全问题,get query 长度问题,post 不能浏览器访问等。
    Kilerd
        15
    Kilerd  
       2018-01-21 21:57:06 +08:00
    @brickyang 反正都是 01 串,啥协议都是没区别的。
    yoke123
        16
    yoke123  
       2018-01-21 22:04:06 +08:00
    怕不是过渡理解了 面试官就是想你回答 7 楼那篇文章里的东西
    估计面试官想的是百度就能了解到的区别 不是你理解的那种区别 仅此而已
    双方思路都不在一个频道
    sheep3
        17
    sheep3  
       2018-01-21 22:31:17 +08:00
    @tomczhen 正解
    hlwjia
        18
    hlwjia  
       2018-01-21 22:37:36 +08:00 via iPhone
    感觉面试官也一知半解
    hjc4869
        19
    hjc4869  
       2018-01-21 22:40:22 +08:00
    我猜面试官认为一个是发一个包,一个是发两个包。还有可能认为 POST 的内容不会显示在浏览器地址栏,更安全。(笑
    glues
        20
    glues  
       2018-01-21 22:51:24 +08:00   ❤️ 3
    说没区别的就别装逼了,一个是三个字母,一个是四个字母,怎么就没区别了?
    l00t
        21
    l00t  
       2018-01-21 22:53:04 +08:00   ❤️ 6
    应该是想让你说这些吧:www.diffen.com/difference/GET-vs-POST-HTTP-Requests

    说本质上没区别的,请问什么叫“本质”?
    elgae
        22
    elgae  
       2018-01-21 23:02:24 +08:00
    你说,只要我愿意,我可以把 delete 实现成 post。
    est
        23
    est  
       2018-01-21 23:03:58 +08:00
    @tongz GET 可以带 body。哈哈哈。
    qinxi
        24
    qinxi  
       2018-01-21 23:06:52 +08:00 via Android
    get 还能被缓存记住历史记录呢
    0ZXYDDu796nVCFxq
        25
    0ZXYDDu796nVCFxq  
       2018-01-21 23:07:33 +08:00 via Android
    什么叫没区别,那任何编程语言都可以说没区别了?
    只能说在四层协议是没有任何区别的。

    这个问题可以从 HTTP 协议,浏览器行为,一般应用场景这些方面回答。
    rogwan
        26
    rogwan  
       2018-01-21 23:07:54 +08:00 via Android
    get 的参数如果有中文传值,据说容易乱码?
    zhlssg
        27
    zhlssg  
       2018-01-21 23:31:54 +08:00
    @rogwan get 请求参数只接受 ASCII 字符,中文需要被编码,
    yangxiongguo
        28
    yangxiongguo  
       2018-01-21 23:38:18 +08:00
    post 请求在某种情况下会被微信浏览器缓存
    brickyang
        29
    brickyang  
       2018-01-21 23:44:17 +08:00 via iPhone
    @okzpy9425 对错不重要,重点是面试官认为的正确答案啊。但是他不说答案,自己心里也未必有底。
    GTim
        30
    GTim  
       2018-01-21 23:45:05 +08:00
    从 HTTP 上来说,区别就多了,想知道是请求时的差别还是响应时的差别,都可以去海底捞一晚,慢慢聊了
    tomczhen
        31
    tomczhen  
       2018-01-21 23:50:04 +08:00
    @qinxi
    RFC 中对 POST 的描述是在一定条件下也是可缓存的。
    otakustay
        32
    otakustay  
       2018-01-22 01:17:22 +08:00
    你们在逗我,POST 用于普通的幂等读请求也就无所谓了顶多损失缓存,但 GET 用于非幂等的增删改操作是不想活了吗,当浏览器的 preload 和 prefetch,以及各种代理的预缓存是玩儿的吗
    okzpy9425
        33
    okzpy9425  
    OP
       2018-01-22 09:34:07 +08:00 via Android
    @l00t 他们说的本质上区别可能就是在运输层上无区别吧
    okzpy9425
        34
    okzpy9425  
    OP
       2018-01-22 09:35:11 +08:00 via Android
    @glues 老哥稳
    okzpy9425
        35
    okzpy9425  
    OP
       2018-01-22 09:36:27 +08:00 via Android
    这种问题就很有问题。没有一个特别标准的答案。。。可能面试官是百度随便找了一个问题来问的。。
    okzpy9425
        36
    okzpy9425  
    OP
       2018-01-22 09:47:41 +08:00 via Android
    @brickyang 实话
    sujin190
        37
    sujin190  
       2018-01-22 09:53:26 +08:00
    @hjc4869 #19 话说这个 get 发一个包,post 发两个包,这是从哪传出来的,wireshark 对浏览器抓包并没有显示这个啊,再说显然百分之 99 的 post 请求都是有效的,那么响应更快相比浪费数据传输来说不算什么了啊
    okzpy9425
        38
    okzpy9425  
    OP
       2018-01-22 10:20:57 +08:00 via Android
    @sujin190 不同浏览器实现不同。。
    okzpy9425
        39
    okzpy9425  
    OP
       2018-01-22 10:21:31 +08:00 via Android
    有的的确是俩包
    tomczhen
        40
    tomczhen  
       2018-01-22 13:48:11 +08:00   ❤️ 1
    @okzpy9425

    都到应用层了在去说传输层不是扯么,要较真的话去读 RFC 最直接。

    举个例子,在 RFC 中并没有限制 URL 的长度,仅仅是说 “ It is RECOMMENDED that all HTTP senders and recipients support, at a minimum, request-line lengths of 8000 octets.” 也就是说上所说的 GET 请求因为 URL 长度有限制,这个并非协议所决定的,而是各个客户端(浏览器)和服务端的实现决定的。至于其他的“可以保存为书签”、“会有历史记录”,“浏览器会默认请求 GET ”,这些都是客户端或服务端的实现而非协议的规定。

    HTTP 协议描述中除开明确说明 “ MUST ” 的部分,其他并不是强制性的。因为 HTTP 协议并非是先定好协议规范,然后大家再来根据协议实现,很多时候各个厂家实现的功能并不会在当前的 HTTP 协议上有描述,协议制定组织也会根据实践来修改协议。换句话说,对于 GET 请求的中规定,只要没有说明“ MUST NOT ”在 POST 请求中如何处理,就算在 POST 请求中实现了,也是符合 HTTP 协议的。
    stcasshern
        41
    stcasshern  
       2018-01-22 13:49:48 +08:00
    擦,get post 差别还挺大呀。包括 request head 以及 url 的样式、都有区别呀,幂等那个是 post 和 update 吧
    xfriday
        42
    xfriday  
       2018-01-22 13:50:41 +08:00
    真的只有语义的区别,可以去看看 elasticsearch 的 api ...
    jason19659
        43
    jason19659  
       2018-01-22 13:59:25 +08:00
    可能是问现实世界习惯用性法上的区别
    qsnow6
        44
    qsnow6  
       2018-01-22 14:11:32 +08:00   ❤️ 1
    让我想起那篇,Google spider 来爬 blog 的文章,结果爬完带个 blog 文章就消失了。

    blog 经过排查发现,页面上有个删除按钮,是用 get 方式做的,而且没有权限验证。。
    zhouyg
        45
    zhouyg  
       2018-01-22 14:52:09 +08:00   ❤️ 1
    区别说大不大,说小也不小。作为开放题,肯定没有标准答案的,关键还是从问题中展现出自己的理解
    tailf
        46
    tailf  
       2018-01-22 15:16:11 +08:00
    在 HTTP 规范里面是没有区别的,但是成熟的开源 web server 实现是有区别的。

    这个东西本身不复杂,这已经是最高级别的答案了。
    robinlovemaggie
        47
    robinlovemaggie  
       2018-01-22 15:39:57 +08:00
    私以为这就好比旧时代的地主家的媳妇多了一样,两个了之后就分成了大房( post )二房( get )。大房能做的事情多一些(重量级),既要能生还要能管,二房相对少一些(轻量级),有时候就是个小玩具。
    haohong725
        48
    haohong725  
       2018-01-22 15:40:58 +08:00
    相同点:都是发 tcp 协议包
    不同点:post 发两次 tcp 包,get 发一次 tcp 包
    hoythan
        49
    hoythan  
       2018-01-22 15:44:26 +08:00
    差别还是很大的,get 请求会被浏览器所缓存,api 接口一些不复杂的查询类可以尽量使用 get 方法。
    scriptB0y
        50
    scriptB0y  
       2018-01-22 15:59:27 +08:00   ❤️ 1
    楼上很多人说的不同的确是存在的,但这好像说道“实现”上去了。撇开具体实现不说,单说 RFC 定义的 HTTP 方法,其实只有语义不同。
    okzpy9425
        51
    okzpy9425  
    OP
       2018-01-22 16:16:08 +08:00 via Android
    @scriptB0y 我感觉也是这样。真正的区别是在语义上。 至于可不可以被缓存,发送几次包这些都是可以具体实现
    tabris17
        52
    tabris17  
       2018-01-22 16:19:52 +08:00
    @brickyang 记得当年喷过这篇文章
    tabris17
        53
    tabris17  
       2018-01-22 16:24:33 +08:00
    @sujin190 发几次包和客户端实现有关,不是协议要求。
    tailf
        54
    tailf  
       2018-01-22 16:32:45 +08:00
    tcp 是流协议,请不要再说包了。。。
    fcten
        55
    fcten  
       2018-01-22 16:36:10 +08:00
    协议上只规定了两者有不同的用途,剩下都是客户端与服务端实现上的差别
    clino
        56
    clino  
       2018-01-22 16:41:19 +08:00
    @okzpy9425 #10 知乎这篇哪个地方是错的?
    0ZXYDDu796nVCFxq
        57
    0ZXYDDu796nVCFxq  
       2018-01-22 16:42:11 +08:00
    如果是 Web 相关的岗位,面试官问这个问题,必定是想知道应聘者对具体的工程实现上的经验
    而且这些经验和知识对开发有非常大的影响,可以具体到常见的应用场景、浏览器行为等,想展示自己基础知识好,可以聊点 RFC 的东西
    何必形而上的硬要往四层上扯说没区别呢

    那你们面试是不是这么回答的:
    OOP 和面向过程有什么区别?
    没区别,在 CPU 看来都是 0 和 1

    C 和 Java 有什么区别?
    没区别,在 CPU 看来都是 0 和 1

    TCP 和 UDP 有什么不同?
    在链路层看来,没区别
    okzpy9425
        58
    okzpy9425  
    OP
       2018-01-22 16:53:56 +08:00 via Android
    @gstqc 说的不错。
    okzpy9425
        59
    okzpy9425  
    OP
       2018-01-22 16:54:48 +08:00 via Android
    @gstqc 可能就是把问题想复杂了。。直接说什么时候用 get 什么时候用 post 会好很多
    zxybird
        60
    zxybird  
       2018-01-22 17:02:43 +08:00
    感觉最大的区别,就是语义的区别吧。毕竟 HTTP 是一个协议,它关心的只是语义层面。其它的区别,就是各个浏览器、服务器、面试官强加的吧。
    okzpy9425
        61
    okzpy9425  
    OP
       2018-01-22 17:13:38 +08:00 via Android
    @zxybird 本来也是想吐槽一下。。没想到这么多人看。。
    那个面试官要是直接问什么时候用 get 什么时候用 post 这种比较明确的问题效率会高很多。而不是这种从不同角度都可以回答,并且有不同答案的问题。
    crab
        62
    crab  
       2018-01-22 17:35:15 +08:00
    @otakustay 当 get 遇到爬虫..
    k9982874
        63
    k9982874  
       2018-01-22 18:23:57 +08:00
    同意 @gstqc
    bolide2005
        64
    bolide2005  
       2018-01-22 18:40:14 +08:00
    说没区别的,看过 rfc 吗?不懂可以,动不动就“鄙视面试官”的人,怕是水平也就那样了吧
    narrowei
        65
    narrowei  
       2018-01-22 18:47:43 +08:00
    @qsnow6 对,我也想到了这帖子 233
    2owe
        66
    2owe  
       2018-01-22 19:06:20 +08:00
    分析一下面试官想问的,可能就是 HTTP 的知识点吧,从协议和一般使用两个方面答呗。
    LuckCode
        67
    LuckCode  
       2018-01-22 19:17:26 +08:00 via iPhone
    让程序员立马吵起来的几个问题:
    1、什么是最好的语言?
    2、哪个是最好的编辑器?
    3、get 和 post 什么区别?
    okzpy9425
        68
    okzpy9425  
    OP
       2018-01-22 19:54:07 +08:00
    @LuckCode 本来搬砖就无聊。大家撕撕逼欢乐欢乐
    zxybird
        69
    zxybird  
       2018-01-23 16:41:35 +08:00
    @okzpy9425 其实,我感觉,假使真正面试的时候,回答,自己是怎么探究这个问题的,查了哪些资料,自己动手做了哪些实验,得出了哪些结论,是不是更能获得面试官的芳心?假使自己理解和面试官有误,现场撕撕逼,也无妨啊。哈哈。
    okzpy9425
        70
    okzpy9425  
    OP
       2018-01-23 22:16:08 +08:00
    @zxybird 你说的很对。。当时没有想那么多。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:42 · PVG 02:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.