python requests发送POST请求带文件和json

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值