在JMeter中发送HTTP POST时,正文中的二进制数据已损坏
我有一个带有HTTP POST端点的本地web应用程序。 此端点接收从SendGrid发送的电子邮件 我已将上一封电子邮件的正文和我知道有效的附件保存为requestBody.bin 我正在尝试使用JMeter复制此HTTP POST请求 我有一个Beanshell预处理器脚本:在JMeter中发送HTTP POST时,正文中的二进制数据已损坏,http,encoding,jmeter,beanshell,jmeter-5.0,Http,Encoding,Jmeter,Beanshell,Jmeter 5.0,我有一个带有HTTP POST端点的本地web应用程序。 此端点接收从SendGrid发送的电子邮件 我已将上一封电子邮件的正文和我知道有效的附件保存为requestBody.bin 我正在尝试使用JMeter复制此HTTP POST请求 我有一个Beanshell预处理器脚本: FileInputStream in = new FileInputStream("C:\\Projects\\centaurjmeter\\src\\InboundEmails\\requestBody.b
FileInputStream in = new FileInputStream("C:\\Projects\\centaurjmeter\\src\\InboundEmails\\requestBody.bin");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[999024]; //Value of Content-Length from when I sent the actual email. So this should be more than enough just for the HTTP POST body.
for (int i; (i = in.read(buffer)) != -1; ) {
bos.write(buffer, 0, i);
}
in.close();
byte[] requestBody = bos.toByteArray();
bos.close();
vars.put("requestBody", new String(requestBody, "ISO-8859-1"));
我在HTTP POST请求的主体中使用了${requestBody}
:
这就是我的JMeter测试的样子:
在我的HTTP POST操作方法中,我将电子邮件的附件保存到文件中
PDF似乎有点损坏,每页上只显示部分文本。
.png文件甚至不会打开
我试过使用:
vars.put("requestBody", new String(requestBody));
vars.put("requestBody", new String(requestBody, "Windows-1252")); //ANSI
vars.put("requestBody", new String(requestBody, "ISO-8859-1")); //default encoding
但它们都不起作用。“ISO-8859-1”导致的损坏最少,因为PDF中至少出现了一些文本(但.png文件根本不起作用)
我不能使用HTTP原始请求采样器,因为它不适用于https
如何从requestBody.bin获取字节并将它们正确地发送到HTTP POST正文中
更新
我在“文件上载”选项卡中读取并尝试将requestBody.bin作为请求文件发送,但得到的结果与使用Beanshell预处理器脚本相同
更新
上面的链接确实帮助我解决了这个问题。
我只需要添加这个额外的TE
标题:
您需要确保在任何地方都应用相同的编码,我建议您坚持使用
${__groovy(new File('C:\\Projects\\centaurjmeter\\src\\InboundEmails\\requestBody.bin').getText('UTF-8'),)}
有关JMeter中Groovy脚本的更多信息:
嗨,德米特里,谢谢你的回答。使用UTF-8解析文件是什么意思?bin包含具有多部分/表单数据内容类型的HTTP POST正文。然后,当web应用程序接收到附件并使用以下命令将其保存到blob存储:var emailDataProvider=new InboundEmailMultipartStreamProvider(_storageConfig,hasvalidSize);wait Request.Content.ReadAsMultipartAsync(emailDataProvider);你是说我需要在保存附件时指定UTF-8吗?我得到了一个错误:
是由以下原因引起的:org.codehaus.groovy.control.multiplecompiletonErrorSeception:启动失败:Script4.groovy:1:Missing')@第1行,第10列。新文件('C:\Projects\centaurjmeter\src\InboundEmails\requestBody.bin')。getText('UTF-8')
我已经确保我完全按照原样使用了您的代码行。奇怪的是,将它改为${{u groovy(新文件('C:/Projects/centaurjmeter/src/InboundEmails/requestBody.bin')。getText('UTF-8'),)}
修复了它。UTF-8不起作用。我尝试了Windows-1252(ANSI),因为当我查看requestBody.bin文件时,记事本显示ANSI,但它也不起作用(两者都只显示空白PDF)。然后我尝试了ISO-8859-1,这显然是HTTP中的默认编码,它创建了一个带有一些可见文本的pdf,但.png文件已损坏。我认为UTF-8不起作用,因为它是二进制数据。原因是UTF-8需要特定的位组合。例如,第二、第三和第四字节的前两位必须是“10”,因此“01”等将是无效的UTF-8。