requests 的 post 中的 data 如何按顺序进行封装?

2021-08-20 20:05:43 +08:00
 zhuzhuaini

假设 data 如下 data={

a = '11',

b = '22',

c = 某个变量,

d = 另一个变量,

e = '33'

} 然后我 requests.post 理论来说 他 data 的顺序应该是 a=11&b=22.....依次按顺序,但是我测试抓包发现,他顺序是乱的,特别是变量,他可能会封装成 a=11&c=某个变量&d=另一个变量值&b=22..... 我想让他就按照从上往下的顺序进行封装起来,百度了下也没人问这类的问题,请问有解吗?

2508 次点击
所在节点    Python
17 条回复
ThirdFlame
2021-08-20 20:08:54 +08:00
一般不关心这个顺序, 因为 http 服务器那边也不是按照顺序解析的。
你要是非得控制这个顺序,就不要用 requests 了。 可以自行实现。
Trim21
2021-08-20 20:09:57 +08:00
升级到 python3.6 以上
surbomfla
2021-08-20 20:10:05 +08:00
接收方能正确接收到就行了
Building
2021-08-20 20:10:55 +08:00
用数组,或者排序。
zhuzhuaini
2021-08-20 20:13:44 +08:00
@Trim21 已经 3.8 了 没用
zhuzhuaini
2021-08-20 20:14:16 +08:00
@Building 请教一下想稍微具体点 不是很明白 谢谢!
zhuzhuaini
2021-08-20 20:15:53 +08:00
@ThirdFlame
@surbomfla
目前碰到个网页,比如我要上传 2 段文字,他的逻辑是先来一个 base64 文本 1 然后来一个“TXT[0]”再来个 base64 文本 2,然后再来个"TXT[1]",如果顺序不对的话他就没法识别两段文字了(因为顺序变成了 base1,base2,txt0,txt1 )
ysc3839
2021-08-20 20:16:14 +08:00
尝试传 OrderedDict 进去?
Trim21
2021-08-20 20:19:21 +08:00
你传的这个 data 是 built-in 的 dict 类型吗?
requests 内部调用的是 data.items(),我试了一下是有序的啊

r = requests.post("https://httpbin.org/post", data=data)

print(type(r.request.body), r.request.body)
ysc3839
2021-08-20 20:19:32 +08:00
或者尝试传 [('key1', 'val1'), ('key2', 'val2')] 这样的数据进去。
zhuzhuaini
2021-08-20 20:28:02 +08:00
@Trim21
@ysc3839
抱歉各位,我似乎知道问题出在哪了 他的打他实际上是这样的
data = {

txt = '1',

txt[0]=txt,

txt = '2',

txt[1]=txt

}
他是类似这样的格式 应该是 data 中只允许一个 txt 出现 所以后面的 txt 等于 2 的这个值会将前面的 1 覆盖,,,,所以导致我以为是乱序了,其实是被覆盖了,现在我想问能不能让这个 txt 不被覆盖,可以重复,就是变成'''txt=1&txt[0]=txt&txt=2&txt[1]=txt'''
也就是 txt 作为字典他可以重复出现
zhuzhuaini
2021-08-20 20:28:25 +08:00
@zhuzhuaini 抱歉各位,我似乎知道问题出在哪了 他的打他(data)实际上是这样的
Trim21
2021-08-20 20:34:12 +08:00
@zhuzhuaini #11 按照 10 楼说的那样传 list 进去
skinny
2021-08-20 20:39:00 +08:00
没办法复现……
zhuzhuaini
2021-08-20 20:40:44 +08:00
@Trim21 好的了解
@skinny 已解决 感谢尝试 是我搞错了
securityCoding
2021-08-21 15:26:41 +08:00
不用按顺序解啊,本身就有 k v 映射
RRRoger
2021-08-21 15:52:45 +08:00
requests 的 data 和 json 两个参数的区别 楼主是不是有点模糊

data: A dictionary, list of tuples, bytes or a file object to send to the specified url

json: A JSON object to send to the specified url

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

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

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

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

© 2021 V2EX