2017-02-20 222 views
0

我正在尝试为特定的请求主体形成一个Web负载,但无法正确地获取它。我需要的是通过我的身体数据如下python将字典的字面值分配给另一个字典的键

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

我完成有效载荷的请求是这样

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

然而,当我通过这一点,巨蟒试图解析每个单独的键值,并赋值给像这样的'文件数据'键

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" 
    } 

蛇皮代码段我用(检查建议后)是这样的:

#!/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-- 
+0

你能告诉你如何分配和传递数据吗? – NoobEditor

+0

也许你应该把你的对象串起来。这样做,文件数据将包含您的对象作为一个字符串。 – iFlo

+0

@NoobEditor我传递的数据为:** data = {'file-data':{“key1”:“3”,“key2”:“6”,“key3”:“8”}} **如我的问题所示 –

回答

0

如果您想发表JSON与蟒蛇的要求,你应该使用datajson

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} 

WHIS的无效Python语法BTW。

+0

我正在使用数据参数,因为我想将指定元素传递给请求主体。我按照您的建议尝试了json,并且跟踪显示文件数据未被传递。也许,下面的代码片段可能有助于'filedata = {“key1”:“3”,“key2”:“6”,“key3”:“8”} f = open(filepath +'\\'+ filename) = {'Content-type':'multipart/form-data','Authorization':'Basic%s'%base64string} r = requests.post(url,headers = headers,json = {'file-data': filedata},files = {'file':f})print r.status_code print r.content ' –

+0

我刚刚看到您正在使用'data' ** AND **'files'。这应该如何工作?你读过:http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file?目前还不清楚你想要做什么。 –

+0

是的,使用多部分表单数据可以通过POST发送不同的表单数据类型。检查这个问题:[链接](http://stackoverflow.com/questions/22567306/python-requests-file-upload)它可能发送数据在表单主体和一个文件一起。我的问题是尝试并确保我得到第一个表单参数正确传递到请求,我目前无法。我使用的API期望文件+定义文件使用的某些描述性参数 –

相关问题