HTTP post请求中,Header中的content-type有三种格式,分别为
- 支持key-value数据格式的application/x-www-form-urlencoded
- 支持json数据格式的application/json
- 支持各种混合数据格式,以表单形式提交的multipart/form-data
前两种比较简单,下一篇补。最近遇到一个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中如何指定content-type=multipart/form-data?
当Header中的content-type为application/x-www-form-urlencoded或application/json时,我们都直接在Header Manager中写明content-type即可。但是,如果是multipart/form-data类型,Header中不可以写这个参数(使用Jmeter录制脚本的话,这个值就自动拿掉了,手工写脚本的同学需要关注这一点)
那么,如何指定content-type=multipart/form-data呢?勾选下图中的Use multipart/form-data复选框:
至此,一个常见的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中逐一指定参数名称及其值即可。
本文暂时没有评论,来添加一个吧(●'◡'●)