JMeter DSL中构造含前置请求参数的Form-data请求体方法咨询
JMeter DSL中构造含前置请求参数的Form-data请求体方法咨询
嘿,这个问题我刚好有实操经验,给你一步步捋清楚怎么搞定哈!
首先得明确:multipart/form-data类型的请求体不能像普通表单那样直接写键值对字符串,得严格遵循它的格式规范;而且因为要用到第一个请求存在vars里的paramKey,最好用body(Function<PreProcessorVars, String> bodySupplier)这个重载方法,这样能直接拿到vars对象获取参数值,比用占位符替换更稳妥,还能避免特殊字符解析问题。
下面是修改后的第二个httpSampler完整代码,我加了详细注释方便你理解:
httpSampler(secondRequestUrl) .method(POST) // 必须指定multipart/form-data的boundary,要和请求体里的完全一致 .contentType("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW") // 用lambda表达式动态构造请求体,同时直接获取vars中的参数 .body(vars -> { // 取出第一个请求保存的paramKey值 String paramKey = vars.get("paramKey"); // 定义boundary,和上面contentType里的保持一致就行,选个不会在参数值里出现的字符串 String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; StringBuilder formBody = new StringBuilder(); // 逐个添加表单参数,每个参数都要遵循multipart格式要求 // param1:使用从vars中获取的动态值 formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param1\"\r\n\r\n"); formBody.append(paramKey).append("\r\n"); // param2:数值10.01,直接转成字符串传递 formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param2\"\r\n\r\n"); formBody.append("10.01").append("\r\n"); // param3:固定文本SomeText1 formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param3\"\r\n\r\n"); formBody.append("SomeText1").append("\r\n"); // param4:布尔值false,表单中以字符串"false"传递 formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param4\"\r\n\r\n"); formBody.append("false").append("\r\n"); // param5的三个子参数,按照你要求的param5.key1格式作为表单键名 formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param5.key1\"\r\n\r\n"); formBody.append("11111").append("\r\n"); formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param5.key2\"\r\n\r\n"); formBody.append("SomeText2").append("\r\n"); formBody.append("--").append(boundary).append("\r\n"); formBody.append("Content-Disposition: form-data; name=\"param5.key3\"\r\n\r\n"); formBody.append("22222").append("\r\n"); // 最后必须添加结束标记的boundary formBody.append("--").append(boundary).append("--\r\n"); return formBody.toString(); }) .children(new DslJsr223PostProcessor("Get response status code", "int statusCode = prev.getResponseCode();\n" + "vars.put('responseStatusCode', String.valueOf(statusCode));" ))
再给你划几个关键注意点:
- boundary一致性:
contentType里指定的boundary必须和请求体里的完全匹配,不然服务器会解析失败 - 动态参数获取:用
vars -> {}的lambda形式能直接拿到JMeter的变量上下文,比占位符更可靠,尤其是参数值包含特殊字符时 - 格式规范性:每个参数都要以
--boundary开头,接着是Content-Disposition头,空一行后写参数值,最后用--boundary--结束整个请求体
如果你的JMeter DSL版本比较新,也可以看看有没有官方提供的Multipart构造工具类,但上面这种手动构造的方式兼容性最好,不管哪个版本都能正常使用。
备注:内容来源于stack exchange,提问作者Ker Laeda
相关产品推荐
相关产品推荐

