python 使用 requests 的POST方法,发送一个 带文件和 json 的请求
当同时发文件和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"}
file_path = 'c:\test.zip'
# 如果是zip文件
fields = {'file': (os.path.basename(file_path),open(file_path, '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