jmeter、postman、python实现multipart/form-data类型请求

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格式参数还是文件对象):

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181207G1LURE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券