在JMeter中发送HTTP POST时,正文中的二进制数据已损坏

在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

我有一个带有HTTP POST端点的本地web应用程序。 此端点接收从SendGrid发送的电子邮件

我已将上一封电子邮件的正文和我知道有效的附件保存为requestBody.bin

我正在尝试使用JMeter复制此HTTP POST请求

我有一个Beanshell预处理器脚本:

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
标题:


您需要确保在任何地方都应用相同的编码,我建议您坚持使用

  • 运行JMeter,可以将其添加到system.properties文件(位于JMeter安装的“bin”文件夹中)

  • 对于脚本,您可以直接在HTTP请求采样器的“正文数据”选项卡中使用以下内容:

    ${__groovy(new File('C:\\Projects\\centaurjmeter\\src\\InboundEmails\\requestBody.bin').getText('UTF-8'),)}
    
    有关JMeter中Groovy脚本的更多信息:

  • 假设一切顺利,您的“本地web应用程序”应该会看到相同的文件,可以使用第三方嗅探工具(如)对其进行双重检查。确保在应用程序中也使用UTF-8解析文件


  • 嗨,德米特里,谢谢你的回答。使用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。