写接口自动化时遇到一个接口,功能是导入文件到系统,试了几个解决方法都不生效,最后找到解决方案:
requests_toolbelt库
什么是multipart/form-data:
multipart/form-data的请求体是一个字符串,但是和post的请求体不同,因为它的构造方式不一样,post是name=value,但multipart/form-data是添加了分隔符等内容的构造体,如下:
应用在pytest 里的做法:
1、导入第三方库
pip install requests-toolbelt
2、使用该第三方库
import requests
from requests_toolbelt import MultipartEncoder
url = "此处输入url地址"
m = MultipartEncoder(
fields={'uploadFile': (
'spark-learning-1.0-SNAPSHOT.jar', open(datas_dir + r'/spark-learning-1.0-SNAPSHOT.jar', 'rb'),
'text/plain')}
)
headers = zdata_info_dict["headers"]
headers['Content-Type'] = m.content_type
resp = requests.post(url=url, data=m, headers=headers)
headers['Content-Type'] = 'application/json' # 恢复全局的请求头,以免后续请求报错
return resp
执行结果:
可参考链接:
https://www.cnblogs.com/wangjunjiehome/p/13716503.html
官网:
https://toolbelt.readthedocs.io/en/latest/user.html
-------------------------------分割线·更新与2022.3.29----------------------------------------
调试接口又遇到上传文件,使用之前的代码一直在报错,研究了下官网文档,是需要将参数补齐,在此记录一下:
f12截图,贴在这:
后面使用了fiddler抓包去看的参数:
官方文档是这么说:
我的代码修改后是这样,再运行就不报错了:
def test_todo_upload(frame_info_dict):
"""待办任务-上传附件"""
taskId = getattr(EnvData, "taskId")
url = "{}/api/flow/attachment/upload/{}".format(frame_info_dict["pre_url"], taskId)
m = MultipartEncoder(
fields={'file': ('depart_add.xlsx', open(datas_dir + r'/depart_add.xlsx', 'rb'), 'text/plain'),
'name': 'depart_add.xlsx', 'description': 'depart_add.xlsx'})
headers = frame_info_dict["headers"]
headers['Content-Type'] = m.content_type
resp = requests.post(url=url, data=m, headers=headers)
headers['Content-Type'] = 'application/json'
setattr(EnvData, "attachmentId", resp.json()['data'])
assert resp.json()["success"]
return resp
运行截图: