V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhuzhuaini
V2EX  ›  Python

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

  •  
  •   zhuzhuaini · 2021-08-20 20:05:43 +08:00 · 2469 次点击
    这是一个创建于 1175 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设 data 如下 data={

    a = '11',

    b = '22',

    c = 某个变量,

    d = 另一个变量,

    e = '33'

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

    17 条回复    2021-08-21 15:52:45 +08:00
    ThirdFlame
        1
    ThirdFlame  
       2021-08-20 20:08:54 +08:00
    一般不关心这个顺序, 因为 http 服务器那边也不是按照顺序解析的。
    你要是非得控制这个顺序,就不要用 requests 了。 可以自行实现。
    Trim21
        2
    Trim21  
       2021-08-20 20:09:57 +08:00
    升级到 python3.6 以上
    surbomfla
        3
    surbomfla  
       2021-08-20 20:10:05 +08:00 via Android
    接收方能正确接收到就行了
    Building
        4
    Building  
       2021-08-20 20:10:55 +08:00 via iPhone
    用数组,或者排序。
    zhuzhuaini
        5
    zhuzhuaini  
    OP
       2021-08-20 20:13:44 +08:00
    @Trim21 已经 3.8 了 没用
    zhuzhuaini
        6
    zhuzhuaini  
    OP
       2021-08-20 20:14:16 +08:00
    @Building 请教一下想稍微具体点 不是很明白 谢谢!
    zhuzhuaini
        7
    zhuzhuaini  
    OP
       2021-08-20 20:15:53 +08:00
    @ThirdFlame
    @surbomfla
    目前碰到个网页,比如我要上传 2 段文字,他的逻辑是先来一个 base64 文本 1 然后来一个“TXT[0]”再来个 base64 文本 2,然后再来个"TXT[1]",如果顺序不对的话他就没法识别两段文字了(因为顺序变成了 base1,base2,txt0,txt1 )
    ysc3839
        8
    ysc3839  
       2021-08-20 20:16:14 +08:00 via Android
    尝试传 OrderedDict 进去?
    Trim21
        9
    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
        10
    ysc3839  
       2021-08-20 20:19:32 +08:00 via Android
    或者尝试传 [('key1', 'val1'), ('key2', 'val2')] 这样的数据进去。
    zhuzhuaini
        11
    zhuzhuaini  
    OP
       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
        12
    zhuzhuaini  
    OP
       2021-08-20 20:28:25 +08:00
    @zhuzhuaini 抱歉各位,我似乎知道问题出在哪了 他的打他(data)实际上是这样的
    Trim21
        13
    Trim21  
       2021-08-20 20:34:12 +08:00
    @zhuzhuaini #11 按照 10 楼说的那样传 list 进去
    skinny
        14
    skinny  
       2021-08-20 20:39:00 +08:00
    没办法复现……
    zhuzhuaini
        15
    zhuzhuaini  
    OP
       2021-08-20 20:40:44 +08:00
    @Trim21 好的了解
    @skinny 已解决 感谢尝试 是我搞错了
    securityCoding
        16
    securityCoding  
       2021-08-21 15:26:41 +08:00 via Android
    不用按顺序解啊,本身就有 k v 映射
    RRRoger
        17
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 09:35 · PVG 17:35 · LAX 01:35 · JFK 04:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.