ozn*_*znu 28 python json urllib2
我需要进行API调用以上传文件以及带有文件详细信息的JSON字符串.
我试图使用python请求lib来做到这一点:
import requests
info = {
'var1' : 'this',
'var2' : 'that',
}
data = json.dumps({
'token' : auth_token,
'info' : info,
})
headers = {'Content-type': 'multipart/form-data'}
files = {'document': open('file_name.pdf', 'rb')}
r = requests.post(url, files=files, data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
raise ValueError("Data must not be a string.")
ValueError: Data must not be a string
Run Code Online (Sandbox Code Playgroud)
如果我从请求中删除"文件",它就可以了.
如果我从请求中删除"数据",它就可以工作.
如果我不将数据编码为JSON,则可以正常工作.
出于这个原因,我认为错误与在同一请求中发送JSON数据和文件有关.
关于如何使这个工作的任何想法?
pro*_*eer 19
不要使用json进行编码.
import requests
info = {
'var1' : 'this',
'var2' : 'that',
}
data = {
'token' : auth_token,
'info' : info,
}
headers = {'Content-type': 'multipart/form-data'}
files = {'document': open('file_name.pdf', 'rb')}
r = requests.post(url, files=files, data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)
请注意,这可能不一定是您想要的,因为它将成为另一个表单数据部分.
ral*_*htp 14
请参阅此主题如何将JSON作为多部分POST请求的一部分发送
不要自己设置Content-type标头,将其留给pyrequests生成
def send_request():
payload = {"param_1": "value_1", "param_2": "value_2"}
files = {
'json': (None, json.dumps(payload), 'application/json'),
'file': (os.path.basename(file), open(file, 'rb'), 'application/octet-stream')
}
r = requests.post(url, files=files)
print(r.content)
Run Code Online (Sandbox Code Playgroud)