http请求常见的content-type分为3种:application/json、x-www-form-urlencoded、multipart/form-data,前两种在发送请求时一般不会遇到什么大坑,这里重点说下multipart/form-data。
multipart/form-data主要用于post请求体中需要上传文件的场景,网上很多帖子告诉大家怎么传文件,却忽略了当post请求体中既需要上传文件,又需要传一般的json格式参数这种场景,下面就以常用的三种接口测试方法介绍multipart/form-data格式请求的发送,希望可以减少大家将会踩到的坑(工具里的一些设置原理没有搞得太清楚,但是以下的实现方式亲测有效):
a、jmeter
1、填写protocal、host、port、method、url、encoding等;
2、勾选Use multipart/form-data for POST;
3、parameter中填写请求中除文件外的普通json格式参数;
4、在Files Upload中填写需要上传的文件路径、参数名、MIME Type(multipart/form-data);如果这里没有需要上传的文件,也可以不填,只发送parameters中的参数,前提是后端接口认为这个参数不是必传参数;
5、http头信息中输入cookie等信息,这里千万不要输入content-type为multipart/form-data,在请求那里已经勾选了Use multipart/form-data for POST(注:如果头信息这里输入了content-type为multipart/form-data,那么所有的参数都会被当成文件以二进制形式传输,我们parameter里的文本格式参数就不会被识别,接口会提示那些参数为空,这点绝对是万年坑);
6、接下来我们观察下我们发送出的请求具体内容:
第1处:有些同学会有疑问说那文件格式的上传是以二进制形式的,multipart/form-data格式的参数的分隔符boundary呢,jmeter会自动生成;
第2处:可以看到tmp.py这个文件名和前面的name是这个文件在当前接口中的参数名;
第3处:说明该文件content-type为multipart/form-data;
第4处:实际的文件内容在这里不会展示;
可以看到我们在parameter中输入的非文件类型参数的content-type为text/plain;
7、请求结果;
b、postman
postman方式还是比较顺利的:
1、输入接口服务器ip、端口、url;
2、选择请求method;
3、勾选form-data;
4、key-value形式输入参数,在输入参数名时可以选text和file两种类型以满足用户需求;
c、python
python这里主要是是用了MultipartEncoder模块(安装:pip install requests-toolbelt,导入:from requests_toolbelt import MultipartEncoder;可以方便的拼multipart/form-data类型post的表单请求参数):
1、封装multipart_encoder:
第1处:这一步并非必须,如果要传入的参数key-value中value是字典格式,如:'test':{'haha':'lala'},需要将{'haha':'lala'}转成json格式再传;
第2处:将要传入的参数写成字典格式组成multipart_encoder的fields,在用随机值拼一下赋给boundary,就组成了可以用的multipart_encoder;
(注:这里是不传文件的格式,如果需要传文件,在fields中添加就好了,如:multipart_encoder.fields['参数名']=('tmp.py', open('/Users/**/projects/myself/my_test/tmp.py', 'rb'), 'text/plain'))
2、发送请求时将封装的multipart_encoder传过来,用于post方法的data参数,而header中的content-type用multipart_encoder.content_type,我们刚有拼它的boundary;
可以看下request包中session.py的post方法data、json两个参数的定义与区别(请求体是普通的json格式参数还是文件对象):
- 发表于:
- 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据 《腾讯内容开放平台服务协议》 转载发布内容。
- 如有侵权,请联系 cloudcommunity@tencent.com 删除。