与后期多部分/表单数据(包括文件和属性)进行斗争

时间:2019-11-30 20:02:22

标签: python-3.x https python-requests

我正在使用与服务器接口良好的API进行交互的程序的请求,除了文件上传使用了包含文件和属性的multipart / form-data之外。其他所有使用JSON的请求都没有问题。

文档说标头必须包含content-type:multipart/form-data,但我已经意识到请求是自动完成的。然后,它以author.fullName: Heidi Walker的形式列出许多文本属性,然后以content: [physical file]的形式列出文件属性

我在Postman中有一个有效的示例,但无法使其与Requests一起使用。这是我的代码:

header = {
    'session_id':sID,
}

# These are the required text attributes from the API docs + the actual file
fileInfo = { 
     'author.fullName' : 'Fred',
     'category.guid' : 'xxx',
     'description' : 'Data Sheet',
     'format' : 'PDF',
     'private' : 'false',
     'storageMethodName' : 'FILE',
     'title ' : 'Test Datasheet',
     'content': open(path, 'rb')
}     

resp = requests.post(url + '/files', headers = header, files = fileInfo)

我不断从服务器获取400个错误。

他们还可以通过任何方式查看请求的格式化主体吗?因此,我可以检查边界标记是否已正确添加,并与Postman创建的内容进行比较?

长期以来,我一直在为此苦苦挣扎,因此将不胜感激。

更新:

我能够使用此页面上概述的日志记录模块启用日志记录:https://requests.readthedocs.io/en/master/api/

检查请求的正文,我看到了:

Content-Disposition: form-data; name="author.fullName"; filename="author.fullName"\r\n\r\nFred\r\n

我想看到的(邮递员工作示例)是:

Content-Disposition: form-data; name=\"author.fullName\"\r\n\r\nFred\r\n

似乎在每一行上都插入了filename="author.fullName"

1 个答案:

答案 0 :(得分:0)

最后成功了,如果其他人为此感到困惑,这里是代码。

multi = MultipartEncoder(
    fields={'author.fullName' : 'Automatic Upload',
            'category.guid' : 'XXX',
            'description' : 'Data Sheet',
            'edition' : '01',
            'format' : 'PDF',
            'private' : 'false',
            'storageMethodName' : 'FILE',
            'title ' : title,
            'content': (fileName, open(path, 'rb'), 'application/pdf')}
)

mpHeader = {
    'Content-Type': multi.content_type,
    'session_id':sID,
    'cache-control': "no-cache",
}

resp = requests.post(url + '/files', headers = mpHeader, data = multi)