我正在使用与服务器接口良好的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"
。
答案 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)