› httpbin - 协议调试工具
› httpstatuses - 协议状态码查询
› httpie - cURL-like tool for humans
Fiddler
okzpy9425
V2EX  ›  HTTP

Http 中 get 和 post 的区别?

  •  
  •   okzpy9425 · Jan 21, 2018 · 8456 views
    This topic created in 3207 days ago, the information mentioned may be changed or developed.

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

    70 replies  •  2018-01-23 22:16:08 +08:00
    throns
    throns
    Jan 21, 2018 via iPhone
    1
    不是没啥区别吗?
    est
    est
    Jan 21, 2018
    2
    没区别。都是数据传输

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

    然后,语意上的不同?

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

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

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

    这个问题可以从 HTTP 协议,浏览器行为,一般应用场景这些方面回答。
    rogwan
    rogwan
    Jan 21, 2018 via Android
    26
    get 的参数如果有中文传值,据说容易乱码?
    zhlssg
    zhlssg
    Jan 21, 2018
    27
    @rogwan get 请求参数只接受 ASCII 字符,中文需要被编码,
    yangxiongguo
    yangxiongguo
    Jan 21, 2018
    28
    post 请求在某种情况下会被微信浏览器缓存
    brickyang
    brickyang
    Jan 21, 2018 via iPhone
    29
    @okzpy9425 对错不重要,重点是面试官认为的正确答案啊。但是他不说答案,自己心里也未必有底。
    yemoluo
    yemoluo
    Jan 21, 2018
    30
    从 HTTP 上来说,区别就多了,想知道是请求时的差别还是响应时的差别,都可以去海底捞一晚,慢慢聊了
    tomczhen
    tomczhen
    Jan 21, 2018
    31
    @qinxi
    RFC 中对 POST 的描述是在一定条件下也是可缓存的。
    otakustay
    otakustay
    Jan 22, 2018
    32
    你们在逗我,POST 用于普通的幂等读请求也就无所谓了顶多损失缓存,但 GET 用于非幂等的增删改操作是不想活了吗,当浏览器的 preload 和 prefetch,以及各种代理的预缓存是玩儿的吗
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    33
    @l00t 他们说的本质上区别可能就是在运输层上无区别吧
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    34
    @glues 老哥稳
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    35
    这种问题就很有问题。没有一个特别标准的答案。。。可能面试官是百度随便找了一个问题来问的。。
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    36
    @brickyang 实话
    sujin190
    sujin190
    Jan 22, 2018
    37
    @hjc4869 #19 话说这个 get 发一个包,post 发两个包,这是从哪传出来的,wireshark 对浏览器抓包并没有显示这个啊,再说显然百分之 99 的 post 请求都是有效的,那么响应更快相比浪费数据传输来说不算什么了啊
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    38
    @sujin190 不同浏览器实现不同。。
    okzpy9425
    okzpy9425
    OP
    Jan 22, 2018 via Android
    39
    有的的确是俩包
    tomczhen
    tomczhen
    Jan 22, 2018❤️1
    40
    @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
    stcasshern
    Jan 22, 2018
    41
    擦,get post 差别还挺大呀。包括 request head 以及 url 的样式、都有区别呀,幂等那个是 post 和 update 吧
    xfriday
    xfriday
    Jan 22, 2018
    42
    真的只有语义的区别,可以去看看 elasticsearch 的 api ...
    jason19659
    jason19659
    Jan 22, 2018
    43
    可能是问现实世界习惯用性法上的区别
    qsnow6
    qsnow6
    Jan 22, 2018❤️1
    44
    让我想起那篇,Google spider 来爬 blog 的文章,结果爬完带个 blog 文章就消失了。

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

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

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

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

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