关于 HTTP 请求, POST 请求为什么有的接口还在 url 里传参数呢?

2020-06-17 18:05:58 +08:00
 JieS

POST 可以直接将参数放在 body 里面,为什么多此一举呢? 或者什么情况下需要在 url 拼接参数呢?

比如 POST body 是 json 格式,但又需要传 x-www-form-urlencoded 的时候?

7341 次点击
所在节点    程序员
44 条回复
wangyzj
2020-06-17 19:32:16 +08:00
一种习惯吧
我习惯 body 里面只提交数据
不包括已有参数
Jackeriss
2020-06-17 19:37:05 +08:00
想怎么传就怎么传,你甚至可以把参数写 header 里
Vegetable
2020-06-17 19:37:28 +08:00
@sadfQED2 #20 NO,这个不行。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/GET
规范中 GET 方法是没有 BODY 的,如果你传了是有可能被某些实现丢弃的,属于规范禁止的行为。
kidtest
2020-06-17 19:42:27 +08:00
nginx hash 可以用到
mmdsun
2020-06-17 20:10:43 +08:00
因为 body 里面大多是实体之类的映射的。

像 accesstoken 统一要传的,不可能往实体里面扩展吧。

这种要么放 URL,要么放 head 了。
sadfQED2
2020-06-17 20:34:52 +08:00
@Vegetable 浏览器会丢掉,但是如果你只是实现 rpc 调用的话,也能带 body 体,比如 es 的 api 接口就支持 get 请求带 body 体
ClericPy
2020-06-17 20:37:53 +08:00
1. 设计
2. 日志分析
3. 历史遗留
liut2016
2020-06-17 20:44:45 +08:00
@GM 那可以把版本信息放在 path 里啊
rioshikelong121
2020-06-17 21:07:56 +08:00
为什么不行呢?有的参数我觉得完全可以放在 querystring 里面。
EminemW
2020-06-17 21:23:35 +08:00
我把 token 放在 queryString
yukiloh
2020-06-17 21:27:25 +08:00
我刚用 axios 的时候控制不好,经常就是想传个 json,结果传到 path 上
jerry
2020-06-17 21:31:54 +08:00
比如全局参数
JieS
2020-06-17 21:38:18 +08:00
@momocraft 不懂就问,激动个什么寂寞?
DOLLOR
2020-06-17 21:54:43 +08:00
有些中转代理工具处理 url 比 body 方便一些。
当然,更多的是保持 get 和 post 风格统一,action 之类的参数就直接写在 url search 里了。
otakustay
2020-06-17 22:04:49 +08:00
你看嘛,一个 HTTP 请求的 URL 放在第一行的
然后 body 可能是很大的,甚至可能是一个文件,所以 body 有可能是流式处理的
这也就代表着,如果你需要将一个请求分配到一个具体的函数上去的话,等 body 全部解析完是很慢的也很没必要的
举个例子,body 是一个文件流的话,只要我分配到了“把文件存起来”这个函数上,这个函数就可以把 body 流对接到 file 流。但如果我没办法分配到函数上,我就要等 body 流读完,把这个流放在内存里(假设内存没爆掉),然后解析 body 分析函数,把整个内存里的流给它,它再存到文件里,这效率多低啊
所以一些参数放在 URL 是非常合理的,特别是用来鉴权的、判断路由的等等
当然我可以不用 URL 而用 HTTP 头,但 HTTP 头的危险性在于你不知道中间有哪个 SB 一样的代理自说自画给你改了或者弄丢了……
jiangzm
2020-06-17 22:07:30 +08:00
这有啥不能理解的,POST 请求中 url 有 query params 一般和接口结构相关,body 里面一般放业务相关的参数。 这好理解了没。
@JieS @myCupOfTea
Vegetable
2020-06-17 22:55:36 +08:00
@sadfQED2 #26 没错呀,还有些骚的不行的也能自定义 HTTP 方法,规范毕竟只是一种规范,不推荐这么用大家还是别太奔放的好,如果两边都可控的话怎么玩都行
also24
2020-06-17 23:18:34 +08:00
今天还在和朋友说,GET 请求也是可以传 body 的啊,RFC 里面并没有禁止这么做 hhh
myCupOfTea
2020-06-18 09:22:43 +08:00
@also24 但实际上那天你的小伙伴升级成 fetch 来请求,就全部报错了
wangyanrui
2020-06-18 09:26:42 +08:00
方便且团队中大多数人认可,就可行!

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

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

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

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

© 2021 V2EX