使用JMeter发送带有二进制体的HTTP请求

使用JMeter发送带有二进制体的HTTP请求,jmeter,Jmeter,我正在尝试使用JMeter发送包含二进制内容的HTTP请求。 在文档中,我发现我可以发送包含二进制内容的文件。我认为这不是一个很好的解决方案,因为每个请求都有自己的二进制内容 下面是我用Perl编写的一个客户机示例,演示了我试图实现的目标: $date_time = sprintf "%08X", time(); $BODY_TEMPLATE = "00${date_time}0015"; $body_len = (length (sprintf($BODY_TEMPLATE,0,0))) /

我正在尝试使用JMeter发送包含二进制内容的HTTP请求。 在文档中,我发现我可以发送包含二进制内容的文件。我认为这不是一个很好的解决方案,因为每个请求都有自己的二进制内容

下面是我用Perl编写的一个客户机示例,演示了我试图实现的目标:

$date_time = sprintf "%08X", time();
$BODY_TEMPLATE = "00${date_time}0015";
$body_len = (length (sprintf($BODY_TEMPLATE,0,0))) / 2;
# Here I set $TARGET & $HOST
$MSG_HEADER = "POST \/unil?URL=${TARGET} HTTP\/1.1\r\nHost: ${HOST}\r\ncontent-type:application/binary\r\ncontent-length: ${body_len}\r\n\r\n";
$body = pack ("H*", $BODY_TEMPLATE);
$message_to_send = $MSG_HEADER . $body;
# at this point I sent the entire message over a TCP socket I previously opened.
有什么想法吗? 谢谢
Yuval

使用JMeter是可能的。我建议使用

  • 构造请求主体并将其存储到JMeter变量(您不需要计算内容长度,因为JMeter足够聪明,可以为您计算内容长度)
  • 使用Beanshell预处理器中生成的“Body数据”设置HTTP采样器(在Body生成代码结束时,您需要执行类似于
    vars.put(“mybody”,generatedbodystring”);
    。在HTTP采样器中,您可以将
    mybody
    变量引用为
    ${mybody}
    ${{uu V(mybody)}
  • 添加以将内容类型设置为“应用程序/二进制”
  • HTTP头管理器和BeanShell预处理器必须是HTTP请求的子级

    您可以使用调试采样器和查看结果树侦听器来检查请求/响应详细信息和发送的数据


    希望这有帮助。

    谢谢Dmitri。我对Beanhell(和Java)是新手。我发现通过使用:javax.xml.bind.DatatypeConverter.parseHexBinary(十六进制字符串),我可以将二进制数据转换为在代码中使用。一旦我将所有内容组合在一起,我希望它能工作。Dmitri,你为什么建议使用“generatedbodystring”当作者请求二进制数据时?我现在也有同样的问题-无法发送二进制POST请求,即使我在BeanShell中执行“vars.putObject(“mybody”,byteArray)”。然后在HTTP请求的正文数据中,Jemeter在发送前隐式执行该数组的“toString()”,我不知道为什么以及如何修复它:(我在中尝试了代码,但二进制数据在转换为字符串时被破坏。我会使用HTTP原始请求采样器,但它不能与https一起工作。通过使用vars.put(“requestBody”,new string(requestBody,“ISO-8859-1”);我至少能够获得要发送以正确显示的部分pdf。