当同时发文件和json请求时,通常会报一个这样的错误:
“ Data must not be a string”
有两种方法,可以根据实际需要来选择:
1、不使用json转换
- import requests
-
-
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)
也就是,不是用json.dumps 对 data 进行格式化
*请注意,这可能不一定是您想要的,因为它将成为另一个表单数据部分
2、将json和文件放到一个参数里
★不要自己设置Content-type标头,将其留给pyrequests生成
-
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)
-
-
或者
-
-
files = {
-
'data' : data,
-
'document': open('file_name.pdf', 'rb')
-
}
-
- r = requests.post(url, files=files, headers=headers)
3、使用 MultipartEncoder
如果接口是用 CommonsMultipartFile[] files 写的,那么用files发送就会报错,需要使用MultipartEncoder 来发送文件
-
from requests_toolbelt import MultipartEncoder
-
-
json_data = {"pig":"peity"}
-
-
# 如果是zip文件
-
-
fields = {'file': (file_name,open('c:\test.zip', 'rb'),'application/zip')}
-
-
# 将要发送的json字典合并到fields里
-
fields.update(json_data)
- # 编码
-
myfiles = MultipartEncoder(fields)
# 请求头里加入Content-Type
-
head_upfile["Content-Type"] = myfiles.content_type
-
- # 数据放到 data 里来发送,而不是通过files参数
- rest = session.post(urls, headers=head_upfile, data=myfiles, timeout=60).text