今天在接口测试的过程中,遇到了一个二进制数据流的传参问题,也就是form_data传递file的问题.

需求背景

我有一个图片上传的接口, 用postman 可以调用成功, 但是用 python 脚本不可以.

问题表现

浏览器上的接口图片
使用的form data , 传递的是file
postman接口调用
用 postman 可以发送接口成功.

但是在 python 的脚本中, 却遇到了问题, 一直都是 400, 操作失败.
python代码1
python代码2
python代码3

问题的原因是请求头的multipart/form-data

multipart/form-data这个东西在网页表单上传用的,非页面的话指定为空.data 和 files 同时存在,上面的multipart/form-data就直接挂掉.这个就 涉及到requests的优先级处理了.
解决方法是将这个注释了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@login_get_token
def test_edit_user_info_head_img(self, info):
headers = {'authorization': 'Bearer %s' % self.token,
# 'content-Type': 'application/x-www-form-urlencoded',
"accept-Encoding": "gzip, deflate, br"
}
file_path = init_config.InitConfig.get_file_path() + "/Img/picture.jpeg"
# 如果加上 .read() 就不行, 必须是数据流对象
# fp = open(file_path, "rb").read()
filename = "picture.jpeg"
# file = {'file': fp}
file = {'file': open(file_path, 'rb')}
response = self.login.get_post_user_head_img_url_response(self.session, headers, file)
print(response.json())



@allure.step("调用上传用户头像的接口")
def get_post_user_head_img_url_response(self, session, headers, file):
return session.post(self.post_user_head_img_url_post, headers=headers, files=file)
# 如果是传递文件数据流就是用files 这个参数, 否则就是data 去传递一般的表单数据
# return session.post(self.post_user_head_img_url_post, headers=headers, data=data)

感谢友链里的那个全能爬虫大佬的讲解, 受益良多.