Http 中 get 和 post 的区别? - V2EX
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 7587 次点击
    这是一个创建于 2820 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天去面试,被问道一个这样的问题。。 我回答的是主要区别是 一个是幂等的 一个不是。然后他说还有其他。我一时半会儿也没想出来。。然后就 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  
       span class="ago" title="2018-01-21 21:21:31 +08:00">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  
    PRO
       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 对错不重要,重点是面试官认为的正确答案啊。但是他不说答案,自己心里也未必有底。
    yemoluo
        30
    yemoluo  
       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     Solana     850 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:40 PVG 04:40 LAX 13:40 JFK 16:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86