requests上传二进制文本或者二进制附件 Python

在做接口自动化的时候发现了一个问题,经过1天多的查询终于找到了解决方案

页面是一个富士文本加上其他的几个字段,如图:

在这里插入图片描述

它的接口是使用二进制的方式来发送的数据,使用requests中的files值无法实现该功能,在网上查找的有比较乱,因此在这里总结一下

接口是这样的,注意Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAfKUIh9OBfEL0OV4这一串,boundary的值是随机的,不是固定的值,至于怎么生成的就没了解,这个值在怎么获取?

requests_toolbelt里有个MultipartEncoder方法中有现成的,详细的下面再说。
请求头等
发送值

第一个是文件,第二个是文本内容,如果你用requests中的files传值会发现解析不了,如图file数据传入了,但是createPublicityNoticeRequest值没有传入,我查了很多资料还是没有发现为什么,只能认为files不支持传递文本数据

在这里插入图片描述

如果使用data发送文本参数,files发送文件,后端还是不接收这样的请求,因此只能寻求其他方法

fp = open('./附件/1c317515c36155a4c5401f5755c67c05.png', mode='rb')
files = {
    'file': ('1c317515c36155a4c5401f5755c67c05.png', fp.read(), 'image/jpeg'),
}
fp.close()
data = {'createPublicityNoticeRequest': ('blob', json.dumps(st), 'application/json')}
res = requests.post(url=url, headers=headers, json=data, files=files)
print(res.text)

返回值

{"message":"Required request part 'createPublicityNoticeRequest' is not present"}

网上搜索requests发送二进制文本
发现requests_toolbelt里有一个MultipartEncoder专门处理这些数据的,因此使用MultipartEncoder将这些数据处理后,使用data传到接口里,发现居然成功了

具体方法与files的写法完全相同,将files传给MultipartEncoder,经过MultipartEncoder处理后data传参,需要注意的是更改headers的Content-Type值
在这里插入图片描述

MultipartEncoder(fields=fields).content_type 就是获取boundary的值

下面是MultipartEncoder的一些用法

MultipartEncoder(fields, boundary=None, encoding='utf-8')
# fields 需要处理的数据
# boundary 自定义boundary值默认为空,不传自动生成,也就是'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryAfKUIh9OBfEL0OV4'这一串
# encoding 编码格式,具体什么编码问后端,默认为utf-8,有的会使用gbk

multipartEncoder.read() # 编码后的数据
multipartEncoder.content_type() # 请求头content-type值
multipartEncoder.fields # 编码前的数据
multipartEncoder.boundary_value # 随机字符串与content_type相同不过没有前面的----
multipartEncoder.to_string() # 转为字符串
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值