Jmeter:HTTP请求,content-type中的multipart/form-data

Header中的content-type有三种格式,分别为

  • 支持key-value数据格式的application/x-www-form-urlencoded
  • 支持json数据格式的application/json
  • 支持各种混合数据格式,以表单形式提交的multipart/form-data

前两种比较简单,请参考Jmeter:HTTP请求中的content-type(补充篇)。最近遇到一个multipart/form-data格式套装application/json的,记录一下。

Fiddler中抓到的请求数据

Header

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4FB5e6lCzhHGTwV3

表示这个请求的payload是一组表单数据,有多个部分组成,以字符串“----WebKitFormBoundary4FB5e6lCzhHGTwV3”作为各部分的边界分割。

payload


可以看到,整个payload被分隔符“----WebKitFormBoundary4FB5e6lCzhHGTwV3”分成了4部分。其中,前两组只有name,没有filename,表示这是一个普通的变量。
后面两组都指定了filename,表示这里需要上传一个文件。

请求如何转换成jmeter参数

不需要上传文件的部分

以该请求的第一部分为例,请求体中的payload为:

------WebKitFormBoundary4FB5e6lCzhHGTwV3
Content-Disposition: form-data; name="file1"

[object Object]

 这类数据,通常以key-value形式,填充在jmeter中的参数(Parameters)部分,如下:

  • 参数名称Name即请求payload中的name字段,即“file1”;
  • 参数值Value为请求payload中该部分的最后一行数据,本例中即“[object Object]”

文件上传部分

以该请求的第四部分为例,请求体中的payload为:

------WebKitFormBoundary4FB5e6lCzhHGTwV3
Content-Disposition: form-data; name="deleteFileMoel"; filename="blob"
Content-Type: application/json

{"file1":null,"file3":null,"file4":null}

 前面说到,这里需要上传文件,对应着jmeter的Fiels Upload部分。

  • File Path:表示要上传的文件全路径,即请求payload中的filename字段。文件名称不需要与请求中一样,但一定要是本地存在的有效文件,否则执行时会提示找不到所需文件。图例中,文件名我写成了deleteFileModel。这里可以写文件的绝对路径,我通常喜欢将文件与脚本放在同一目录下,所以这里只写了文件名称,表示在当前路径下的该文件。或者写成./deleteFileModel是不是更规范?
  • Parameter Name:参数名称,即请求payload中的name字段,这个要一致,否则文件上传后服务器不知道上传的文件对应哪个字段。
  • MIME Type:图片没截全,未显示出来,就是第三列,值为application/json的,所以,这里对应请求payload中的Content-Type字段,表示要上传的文件是什么格式。我见过的格式有image/png,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。第二个好长,其实就是excel文件。

以上第一个和第三个参数,决定了,要在本地指定路径下,放置指定文件名的对应格式的文件。本例中,就需要在测试脚本同目录下放置一个名为deleteFileModel的json文件。一般来说,使用手工执行步骤时的文件即可(本例的文件有点特殊,手工操作时并不需要上传文件,所以,执行过程中需要动态生成所需要的json文件,详情请见JMeter案例分享:获取响应中的json键值动态生成json文件并上传),不过在文件名的命名上,可能需要考虑业务并发逻辑。下一篇以第三部分为例说明一下。

Jmeter中如何指定content-type=multipart/form-data?

当Header中的content-type为application/x-www-form-urlencoded或application/json时,我们都直接在Header Manager中写明content-type即可。但是,如果是multipart/form-data类型,Header中不可以写这个参数,因为其中的boundary串每次都会更新,通过这里传入一个固定值,回放是会出错的。(使用Jmeter录制脚本的话,这个值就自动拿掉了,手工写脚本的同学需要关注这一点)

那么,如何指定content-type=multipart/form-data呢?勾选下图中的Use multipart/form-data复选框,在脚本执行时,它每次会自动生成一个boundary串:

至此,一个常见的multipart/form-data请求就构建完成了。

总结

总结一下:

1、Sampler中勾选Use multipart/form-data复选框来指定当前的content-type为multipart/form-data,而请求头Header Manager中,不要写content-type

2、payload中有filename的部分,需要上传文件,在jmeter中的Files Upload中逐一指定参数名称,文件路径及文件类型;

3、payload中没有filename的部分,是普通的key-value键值对,在jmeter的Parameters中逐一指定参数名称及其值即可。

补充:与开发沟通看到的数据接口(回忆版)

该接口的字段大概是:

file1:一个Object,非必填

file3:一个Object,非必填

model:application/json格式,企业信息,必填

deleteFileMoel:application/json格式,要删除的文件信息。必填,但是可以字段值可以为空,所以本例中的信息都是{"file1":null,"file3":null,"file4":null},也就是没有要删除的文件。

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值