我正在使用JMeter 3.2。 我的要求是从磁盘读取XML文件,用动态值替换一些标签,以确保每个线程都发送唯一的xml文件上传(NOT SOAP Request)。当我尝试使用带有$ {newfilename}文件text / xml的http采样器通过POST通过POST上传新文件时,JSR223采样器中的以下代码可以很好地工作。
import org.apache.commons.io.FileUtils;
try {
String content = FileUtils.readFileToString(new File("E:/test.xml"));
content = content.replaceAll("SUB_ID", "${__UUID}");
content = content.replaceAll("ABN_ID", "${empabn}");
content = content.replaceAll("EMPNAME", "${empname}");
vars.put("content", content);
FileUtils.writeStringToFile(new File("E:/testnew${empname}.xml"), content);
}
catch (Throwable ex) {
log.info("What happened?", ex);
throw ex;
}
如何将字符串'content'的内容作为请求正文的一部分发送,而不是再次写入磁盘并再次上传?我看过很多关于输入输出流的文章,但它们令人困惑。当我尝试仅在正文中发送$ {content}时,应用程序将引发以下错误:
HTTP Status 500 - Could not write JSON: Name is null (through reference chain: com.xxx.xxx.datafile.rest.DataFileResponse["validationStatus"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Name is null (through reference chain:
感谢您的帮助。
答案 0 :(得分:0)
Multipart POST requests与普通的POST请求不同,因此不可能用生成的内存字符串简单地替换文件。
您需要完全复制JMeter或真实浏览器发送的请求,并手动填充每个部分,从使用boundary
定义HTTP Header Manager到创建{{1 }},然后在此处指定文件内容。
一个小提示:您不需要为每个调用生成/替换值,一次替换就足够了,并且只要您使用__eval()和__FileToString(),JMeter就会自己替换它们功能组合。
您可以查看Testing REST API File Uploads in JMeter来获取创建相对复杂的文件上传请求的示例,这种情况比较简单,但仍然很棘手。