JMeter中用JSR223 PreProcessor Groovy构造multipart/form-data报错求解
解决JMeter中JSR223 PreProcessor构造multipart/form-data请求体的报错问题
报错原因
你遇到的错误是因为vars.put()仅支持存储字符串类型数据,而你试图存入的formData是MultipartFormEntity对象,类型不匹配导致调用失败。
方案一:直接用JMeter HTTP Request组件配置(推荐)
JMeter原生支持构造multipart/form-data请求,无需手写Groovy脚本,步骤如下:
- 添加HTTP Request组件
- 在「Parameters」标签页添加普通参数:
- Name:
payload,Value:some payload
- Name:
- 在「Files Upload」标签页添加文件:
- File Path:
path/to/file(你的文件实际路径) - Parameter Name:
file - MIME Type:
application/octet-stream
- File Path:
- 确认HTTP Request的「Implementation」选项为
HttpClient4(默认配置)
配置完成后,JMeter会自动生成符合要求的multipart/form-data请求体。
方案二:Groovy脚本构造并转换为字符串存储(复杂场景适用)
如果必须通过JSR223 PreProcessor构造,需将MultipartFormEntity转换为可存储的字符串格式,修改后的脚本如下:
import org.apache.http.entity.ContentType import org.apache.http.entity.mime.MultipartEntityBuilder import org.apache.http.entity.mime.content.FileBody import org.apache.http.entity.mime.content.StringBody import org.apache.http.util.EntityUtils import java.util.Base64 def filePath = "path/to/file" def file = new File(filePath) def payload = "some payload" def builder = MultipartEntityBuilder.create().setCharset(java.nio.charset.StandardCharsets.UTF_8) builder.addPart("payload", new StringBody(payload, ContentType.TEXT_PLAIN)) builder.addPart("file", new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.name)) def formData = builder.build() // 将实体转换为字节数组后编码为Base64字符串存储 def formDataBytes = EntityUtils.toByteArray(formData) def formDataBase64 = Base64.getEncoder().encodeToString(formDataBytes) vars.put("formDataBase64", formDataBase64) // 提取包含boundary的Content-Type头并存储 def contentType = formData.getContentType().getValue() vars.put("contentType", contentType)
配套HTTP Request配置:
- 「Method」选择
POST - 「Body Data」中填写:
${__base64Decode(${formDataBase64},)} - 添加HTTP Header Manager,新增
Content-Type头,值为${contentType}
这样就能正确构造并发送multipart/form-data请求。
内容的提问来源于stack exchange,提问作者Chakkapong Max
相关产品推荐
相关产品推荐

