Http 中 get 和 post 的区别?

2018-01-21 20:33:46 +08:00
 okzpy9425

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

7154 次点击
所在节点    HTTP
70 条回复
l00t
2018-01-21 22:53:04 +08:00
应该是想让你说这些吧:www.diffen.com/difference/GET-vs-POST-HTTP-Requests

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/424734

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX