python将字典的文字值分配给另一个字典的密钥

时间:2017-02-20 10:12:37

标签: python dictionary python-requests

我正在尝试为特定请求主体形成Web有效负载,但无法正确完成。我需要的是传递我的身体数据,如下所示

data={'file-data':{"key1": "3","key2": "6","key3": "8"}}

我的完整有效负载请求如下所示

payload={url,headers, data={'file-data':{"key1": "3","key2": "6","key3": "8"}},files=files}

然而,当我通过它时,python尝试解析每个单独的键值并像这样分配给'file-data'键

    file-data=key1
    file-data=key2
    file-data=key3

等等我在嵌套字典中传递的密钥数量。然而,要求是将整个字典作为文字内容传递,如(不按每个键分割值)

    file-data={"key1": "3","key2": "6","key3": "8"}

理想情况下,预期的HTTP跟踪应如下所示:

    POST /sample_URL/ HTTP/1.1
    Host: sample_host.com
    Authorization: Basic XYZ=
    Cache-Control: no-cache
    Content-Type: multipart/form-data; boundary=----UVWXXXX

    ------WebKitFormBoundaryXYZ
    Content-Disposition: form-data; name="file-data"

    {"key1": "3","key2": "6","key3":"8" }
    ------WebKitFormBoundaryMANZXC
    Content-Disposition: form-data; name="file"; filename=""
    Content-Type: 


    ------WebKitFormBoundaryBNM--

因此,我想将此作为POST请求的有效负载的一部分(使用python请求库)。任何建议都需要提前感谢 -

Edit1 :为了更清晰,API定义如下:

    Body
    Type: multipart/form-data
    Form Parameters

    file: required (file)

    The file to be uploaded
    file-data: (string)

    Example:

    {
      "key1": "3",
      "key2": "6",
      "key3": "8"
    } 

我使用的python代码片段(检查建议后)是这样的:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import requests
    url = "https://sample_url/upload"
    filepath='mypath' 
    filename='logo.png'
    f=open(filepath+'\\'+filename)
    filedata={'file-data':"{'key1': '3','key2': '6','key3': '8'}"}  
    base64string = encodestring('%s:%s' % ('user', 'password').replace('\n', '')
    headers={'Content-type': 'multipart/form-data','Authorization':'Basic %s' % base64string} 


     r = requests.post(url=url,headers=headers,data=filedata,files={'file':f})
     print r.text

我现在得到的错误仍然如下所示:

     {"statusCode":400,"errorMessages":[{"severity":"ERROR","errorMessage":"An exception has occurred"]

它还说某些条目丢失或不正确。请注意,我已尝试在以二进制模式打开文件参数后传递它,但它会抛出相同的错误消息

我也通过python打印出了HTTP跟踪,它看起来像这样:

    send: 'POST sample_url HTTP/1.1
    Host: abc.com
    Connection: keep-alive
    Accept-Encoding: gzip,deflate
    Accept: */*
    python-requests/2.11.1
    Content-type: multipart/form-data
    Authorization: Basic ABCDXXX=
    Content-Length: 342
    --CDXXXXYYYYY
    Content-Disposition:form-data; name="file-data"
    {\'key1\': \'3\',\'key2\': \'6\'
    ,\'key3\': \'8\'}
    --88cdLMNO999999
    Content-Disposition: form-data; name="file";
    filename="logo.png"\x89PNG\n\r\n--cbCDEXXXNNNN--

1 个答案:

答案 0 :(得分:0)

如果你想发布带有python请求的 JSON ,你应该使用data但是json

r = requests.post('http://httpbin.org/post', json={"key": "value"})

由于您的示例,我只能猜测您正在使用data

payload={url,headers, data={'file-data':{"key1": "3","key2": "6","key3": "8"}},files=files}

这是无效的python语法btw。

相关问题