前几天去面试,被问道一个这样的问题。。 我回答的是主要区别是 一个是幂等的 一个不是。然后他说还有其他。我一时半会儿也没想出来。。然后就 GG 了。
1
throns 2018-01-21 20:50:40 +08:00 via iPhone
不是没啥区别吗?
|
2
est 2018-01-21 20:59:50 +08:00
没区别。都是数据传输
说 get 幂等的。你说网页访问计数器如何实现甩他一脸。 |
3
zhlssg 2018-01-21 21:00:37 +08:00
GG 也不会因为一个问题吧,安全,请求数据大小限制? rest 风格的意义?缓存?
|
6
thundernet8 2018-01-21 21:21:18 +08:00 via Android
post 可以 body 负载较多数据 get 没有这么用的
|
7
brickyang 2018-01-21 21:21:31 +08:00 via iPhone
你的面试官是不是看过这篇文章: https://zhuanlan.zhihu.com/p/22536382
|
8
eslizn 2018-01-21 21:23:15 +08:00
querystring 和 body 的区别
|
9
tongz 2018-01-21 21:24:54 +08:00
GET 长度受限于浏览器,POST 长度和服务端配置有关。
然后,语意上的不同? GET 携带参数是以 queryString 的形式,POST 有多种可选? |
12
tomczhen 2018-01-21 21:35:20 +08:00 via Android 5
get 也可以带 body,只要 client 支持,server 处理。同理,post 也可以有 query string。
get 幂等与否要看 server 端如何处理,说到底各种差异是 client 和 server 如何处理造成的,协议本身来讲就只有语义差异,但本质上没区别。 |
13
okzpy9425 OP @thundernet8 这个我倒是没说。。
|
14
dobelee 2018-01-21 21:42:30 +08:00 via Android
从协议角度讲,没啥区别,正如 12 楼所讲。往往区别在于一些客观因素,如 get query 安全问题,get query 长度问题,post 不能浏览器访问等。
|
16
yoke123 2018-01-21 22:04:06 +08:00
怕不是过渡理解了 面试官就是想你回答 7 楼那篇文章里的东西
估计面试官想的是百度就能了解到的区别 不是你理解的那种区别 仅此而已 双方思路都不在一个频道 |
18
hlwjia 2018-01-21 22:37:36 +08:00 via iPhone
感觉面试官也一知半解
|
19
hjc4869 2018-01-21 22:40:22 +08:00
我猜面试官认为一个是发一个包,一个是发两个包。还有可能认为 POST 的内容不会显示在浏览器地址栏,更安全。(笑
|
20
glues 2018-01-21 22:51:24 +08:00 3
说没区别的就别装逼了,一个是三个字母,一个是四个字母,怎么就没区别了?
|
21
l00t 2018-01-21 22:53:04 +08:00 6
|
22
elgae 2018-01-21 23:02:24 +08:00
你说,只要我愿意,我可以把 delete 实现成 post。
|
24
qinxi 2018-01-21 23:06:52 +08:00 via Android
get 还能被缓存记住历史记录呢
|
25
0ZXYDDu796nVCFxq 2018-01-21 23:07:33 +08:00 via Android
什么叫没区别,那任何编程语言都可以说没区别了?
只能说在四层协议是没有任何区别的。 这个问题可以从 HTTP 协议,浏览器行为,一般应用场景这些方面回答。 |
26
rogwan 2018-01-21 23:07:54 +08:00 via Android
get 的参数如果有中文传值,据说容易乱码?
|
28
yangxiongguo 2018-01-21 23:38:18 +08:00
post 请求在某种情况下会被微信浏览器缓存
|
29
brickyang 2018-01-21 23:44:17 +08:00 via iPhone
@okzpy9425 对错不重要,重点是面试官认为的正确答案啊。但是他不说答案,自己心里也未必有底。
|
30
GTim 2018-01-21 23:45:05 +08:00
从 HTTP 上来说,区别就多了,想知道是请求时的差别还是响应时的差别,都可以去海底捞一晚,慢慢聊了
|
32
otakustay 2018-01-22 01:17:22 +08:00
你们在逗我,POST 用于普通的幂等读请求也就无所谓了顶多损失缓存,但 GET 用于非幂等的增删改操作是不想活了吗,当浏览器的 preload 和 prefetch,以及各种代理的预缓存是玩儿的吗
|
35
okzpy9425 OP 这种问题就很有问题。没有一个特别标准的答案。。。可能面试官是百度随便找了一个问题来问的。。
|
37
sujin190 2018-01-22 09:53:26 +08:00
@hjc4869 #19 话说这个 get 发一个包,post 发两个包,这是从哪传出来的,wireshark 对浏览器抓包并没有显示这个啊,再说显然百分之 99 的 post 请求都是有效的,那么响应更快相比浪费数据传输来说不算什么了啊
|
39
okzpy9425 OP 有的的确是俩包
|
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 协议的。 |
41
stcasshern 2018-01-22 13:49:48 +08:00
擦,get post 差别还挺大呀。包括 request head 以及 url 的样式、都有区别呀,幂等那个是 post 和 update 吧
|
42
xfriday 2018-01-22 13:50:41 +08:00
真的只有语义的区别,可以去看看 elasticsearch 的 api ...
|
43
jason19659 2018-01-22 13:59:25 +08:00
可能是问现实世界习惯用性法上的区别
|
44
qsnow6 2018-01-22 14:11:32 +08:00 1
让我想起那篇,Google spider 来爬 blog 的文章,结果爬完带个 blog 文章就消失了。
blog 经过排查发现,页面上有个删除按钮,是用 get 方式做的,而且没有权限验证。。 |
45
zhouyg 2018-01-22 14:52:09 +08:00 1
区别说大不大,说小也不小。作为开放题,肯定没有标准答案的,关键还是从问题中展现出自己的理解
|
46
tailf 2018-01-22 15:16:11 +08:00
在 HTTP 规范里面是没有区别的,但是成熟的开源 web server 实现是有区别的。
这个东西本身不复杂,这已经是最高级别的答案了。 |
47
robinlovemaggie 2018-01-22 15:39:57 +08:00
私以为这就好比旧时代的地主家的媳妇多了一样,两个了之后就分成了大房( post )二房( get )。大房能做的事情多一些(重量级),既要能生还要能管,二房相对少一些(轻量级),有时候就是个小玩具。
|
48
haohong725 2018-01-22 15:40:58 +08:00
相同点:都是发 tcp 协议包
不同点:post 发两次 tcp 包,get 发一次 tcp 包 |
49
hoythan 2018-01-22 15:44:26 +08:00
差别还是很大的,get 请求会被浏览器所缓存,api 接口一些不复杂的查询类可以尽量使用 get 方法。
|
50
scriptB0y 2018-01-22 15:59:27 +08:00 1
楼上很多人说的不同的确是存在的,但这好像说道“实现”上去了。撇开具体实现不说,单说 RFC 定义的 HTTP 方法,其实只有语义不同。
|
51
okzpy9425 OP @scriptB0y 我感觉也是这样。真正的区别是在语义上。 至于可不可以被缓存,发送几次包这些都是可以具体实现
|
54
tailf 2018-01-22 16:32:45 +08:00
tcp 是流协议,请不要再说包了。。。
|
55
fcten 2018-01-22 16:36:10 +08:00
协议上只规定了两者有不同的用途,剩下都是客户端与服务端实现上的差别
|
57
0ZXYDDu796nVCFxq 2018-01-22 16:42:11 +08:00
如果是 Web 相关的岗位,面试官问这个问题,必定是想知道应聘者对具体的工程实现上的经验
而且这些经验和知识对开发有非常大的影响,可以具体到常见的应用场景、浏览器行为等,想展示自己基础知识好,可以聊点 RFC 的东西 何必形而上的硬要往四层上扯说没区别呢 那你们面试是不是这么回答的: OOP 和面向过程有什么区别? 没区别,在 CPU 看来都是 0 和 1 C 和 Java 有什么区别? 没区别,在 CPU 看来都是 0 和 1 TCP 和 UDP 有什么不同? 在链路层看来,没区别 |
59
okzpy9425 OP @gstqc 可能就是把问题想复杂了。。直接说什么时候用 get 什么时候用 post 会好很多
|
60
zxybird 2018-01-22 17:02:43 +08:00
感觉最大的区别,就是语义的区别吧。毕竟 HTTP 是一个协议,它关心的只是语义层面。其它的区别,就是各个浏览器、服务器、面试官强加的吧。
|
61
okzpy9425 OP @zxybird 本来也是想吐槽一下。。没想到这么多人看。。
那个面试官要是直接问什么时候用 get 什么时候用 post 这种比较明确的问题效率会高很多。而不是这种从不同角度都可以回答,并且有不同答案的问题。 |
64
bolide2005 2018-01-22 18:40:14 +08:00
说没区别的,看过 rfc 吗?不懂可以,动不动就“鄙视面试官”的人,怕是水平也就那样了吧
|
66
2owe 2018-01-22 19:06:20 +08:00
分析一下面试官想问的,可能就是 HTTP 的知识点吧,从协议和一般使用两个方面答呗。
|
67
LuckCode 2018-01-22 19:17:26 +08:00 via iPhone
让程序员立马吵起来的几个问题:
1、什么是最好的语言? 2、哪个是最好的编辑器? 3、get 和 post 什么区别? |