V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
situs
V2EX  ›  问与答

当你问到 GET 和 POST 的区别的时候,想听到什么样的答案?

  •  
  •   situs · 2017-09-13 11:24:39 +08:00 · 4642 次点击
    这是一个创建于 2627 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面试中经常会有“看起来”很简单的问题,rt 就是其一,再比如“从地址栏输入 url 到页面展示经历了什么”。 这类的问题,要说,都能列举一二,但不知道作为面试官的您最想听到的是哪方面的答案??

    dalao 能分享一下吗?

    30 条回复    2017-09-16 23:17:39 +08:00
    doublleft
        1
    doublleft  
       2017-09-13 11:44:12 +08:00
    我一般会从语义化开始讲,列举几个为什么用 POST/GET 的场景,延伸到区别,再回归到本质都一样
    doublleft
        2
    doublleft  
       2017-09-13 11:45:00 +08:00
    再扯扯跨域,OPTIONS 请求,资源引用和 xhr 请求区别,聊聊 JSONP ……
    Moker
        3
    Moker  
       2017-09-13 11:45:27 +08:00
    这两个请求的具体请求参数存放在哪里?有长度限制么?如果有,分别是多少?
    楼下接着补充
    Ryans
        4
    Ryans  
       2017-09-13 11:47:06 +08:00
    页面资源幂等性
    GET 参数在 URL 传递会暴露
    什么场合不建议 GET


    我乱说的
    falcon05
        5
    falcon05  
       2017-09-13 11:50:24 +08:00 via iPhone
    正确 /不正确使用的场景和 why?
    SuperMild
        6
    SuperMild  
       2017-09-13 11:58:12 +08:00
    然而面试官又各不一样,有的人可能喜欢听最基本的解释,确认你理解没有错误,而有的人可能喜欢听新奇的答案,看你能不能玩出新花样。
    oott123
        7
    oott123  
       2017-09-13 12:07:11 +08:00 via Android
    有个十分扯淡,但很多面试官喜欢听的答案:「 POST 比 GET 更安全」么
    tomczhen
        8
    tomczhen  
       2017-09-13 12:12:46 +08:00 via Android
    对于服务端和中间人来说没有区别,所谓的 URL 在地址栏这是客户端自己的实现,跟 HTTP 协议无关。
    URL 长度 HTTP 协议中也没有规定,但是受客户端和服务端实现影响,不同的应用可能限制不同,或者可以配置范围不同。
    situs
        9
    situs  
    OP
       2017-09-13 13:29:51 +08:00
    @SuperMild 这倒是,面试这种很主观的东西确实是没有统一的答案。
    DCjanus
        10
    DCjanus  
       2017-09-13 13:33:20 +08:00
    在中国的网络环境下,部分运营商会缓存 GET 请求,所以如果你不是用 HTTPS,那么用 POST 则好得多
    虽然某运营商也缓存过 POST
    a87150
        11
    a87150  
       2017-09-13 13:39:08 +08:00
    这种基础问题最考验水平
    nekoyaki
        12
    nekoyaki  
       2017-09-13 14:04:02 +08:00
    @a87150
    也挺考验面试官水平……我觉得可能一般面试官都未必有正确的理解
    qooweds
        13
    qooweds  
       2017-09-13 18:39:48 +08:00
    那么最正确的答案到底是什么?我也搜过类似问题,已经被搞蒙了
    codermagefox
        14
    codermagefox  
       2017-09-13 19:12:37 +08:00
    萌新表示看了楼上的回复最喜欢 4L 的回答,mark 一下
    wangdu2012
        15
    wangdu2012  
       2017-09-13 19:21:52 +08:00 via iPhone
    招前端这么问?
    isCyan
        16
    isCyan  
       2017-09-13 19:23:28 +08:00 via Android
    本质区别:一个在 uri 里一个在 body 里
    GTim
        17
    GTim  
       2017-09-13 19:33:12 +08:00
    @isCyan 这不是最本质的区别
    misaka20038numbe
        18
    misaka20038numbe  
       2017-09-13 19:37:11 +08:00   ❤️ 1
    GET 发送请求,POST 发送数据
    lxml
        19
    lxml  
       2017-09-13 19:40:49 +08:00
    @isCyan #16 本质上没啥区别,就是贴标签而已,Get 也可以塞 Body 里
    akira
        20
    akira  
       2017-09-13 19:42:46 +08:00   ❤️ 1
    最最本质的区别
    一个请求方法是"GET"
    一个请求方法是"POST"
    songdezu
        21
    songdezu  
       2017-09-13 19:45:44 +08:00 via iPhone
    安全性没区别吧,post 不能缓存
    hxsf
        22
    hxsf  
       2017-09-13 21:27:27 +08:00
    GET 方法 语义上来说指获取由 URI 标识的任何信息。是幂等的(重要)

    1. 如果请求消息包含 IfModified-Since、If-Unmodified-Since、If-Match、If-None-Match 或 If-Range header 字段则 GET 方法的语义将变为 “条件 GET ”。一个条件 GET 方法请求满足描述的情况下
    的资源。(通过允许缓存被刷新而不需要多个请求或传输客户端已经有的数据,来减少不必要的网络使用)
    2. 如果请求消息包含 Range 头,则 GET 方法的语义将变为“部分 GET ”。
    部分 GET 请求仅传输实体的一部分,(还是为了减少不必要的网络使用)

    POST 方法 语义上来说是指新增或修改(取决于你的服务器代码)不一定是幂等的(重要)

    1. 除非注明了 Cache-Control 或者 Expires,否则不应该被缓存。
    2. message-body 不会被忽略, ( GET 也可以加 message-body,不过会被忽略掉(当然,你可以自己写个不遵循 rfc 的 server,但是连路中间的缓存或者代理啥的,嘿嘿))
    hxsf
        23
    hxsf  
       2017-09-13 21:30:56 +08:00
    @songdezu #21 前半句见 v 友帖子 “被谷歌爬虫删了所有博客”,

    后半句,参考 rfc 的缓存规则,post 请求的响应如果注明了 Cache-Control 之类的,是有用的。 当然,中间的 Cache、Proxy 的实现有没有遵循 rfc 就是另外一回事了。。。
    lzjamao
        24
    lzjamao  
       2017-09-13 21:36:23 +08:00
    * 协议格式的区别
    * 服务器响应的区别
    weakish
        25
    weakish  
       2017-09-13 22:05:38 +08:00
    语义上说幂等性。

    不过这只是一个约定。实际上,如果服务器乱来,GET 完全可以不幂等。
    实际的区别可能是用 GET 发送数据的话,
    由于浏览器和服务器通常对 url 长度有限制,
    因此 GET 发送的数据量上限比 POST 要低很多。
    但实际上 HTTP 协议并没有指定 url 长度,所以完全可以开发支持「无限」长度的 url 的 http 客户端和服务器。
    msg7086
        26
    msg7086  
       2017-09-14 00:09:37 +08:00
    GET 和 POST 本质区别还是 HTTP VERB 不同。
    Post 的时候也可以在 URL 上带参数。
    Post 的时候也可以不带 Request Body。
    Get 的时候也可以带上 Request Body,只不过按照规范来说,不推荐服务端去根据 Request Body 的内容来改变输出。

    @hxsf 被删了博客那不是 Get 的锅,而是权限控制的锅。
    做成 Post 就算谷歌不能删,路人一样能删,反而安全性下降了。
    orFish
        27
    orFish  
       2017-09-14 00:25:58 +08:00
    POST 是幂等的。

    ssl 下 2 者都安全

    Get 也可以带 body
    iyaozhen
        28
    iyaozhen  
       2017-09-14 01:06:12 +08:00 via Android
    我也经常问这个问题,其实也没什么目的。相当于开场白吧,你说的时候可能面试官说不定在疯狂填上一个人的面试记录呢。

    但里面也能看出点端倪,比如你侧重说缓存,那么就可以继续聊一聊 http 缓存机制,运营商劫持,DNS 等。比如说安全,那就深入聊 web 安全。循序渐进嘛,不能一来就反转二叉树吧
    situs
        29
    situs  
    OP
       2017-09-14 09:29:59 +08:00
    @iyaozhen 这么多回复,只有您的是在回答我的主题~ 看来还得根据面试者的回答进行继续的深入呀。
    julyclyde
        30
    julyclyde  
       2017-09-16 23:17:39 +08:00
    (一般情况下)带不带 body
    可否缓存
    语义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:04 · PVG 08:04 · LAX 16:04 · JFK 19:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.