如何使用Apache JMeter发布GZip请求

时间:2015-11-15 10:02:03

标签: jmeter httprequest gzip

我有使用Apach JMeter的问题。

我们的项目,Android应用发布json数据" Gzip压缩"到API服务器。 使用" Apache HttpClient"的Android应用程序并且它是" GzipCompressingEntity"类。

对于API服务器的性能测试,我尝试通过JMeter的代理(=" HTTP(S)测试脚本记录器")记录请求。 但记录的请求正文是空的。

我想要做的是发送" Gziped HTTP 请求数据"从Apache JMeter到服务器。 有没有办法呢?

以下是我们Android应用的请求标题示例。

POST /api/test HTTP/1.1
Content-Type: application/json
Transfer-Encoding: chunked
Content-Encoding: gzip
Host: 192.168.11.11:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.5)
Accept-Encoding: gzip,deflate

RequestBody是Gziped二进制数据。

我所做的是

  1. 运行" HTTP(S)测试脚本记录器(代理服务器)"在JMeter上。
  2. 设置Android的http代理以使用该代理服务器。
  3. 执行HTTP Client的Android测试代码(帖子数据由Gzip压缩)。
  4. 然后,该测试代码以失败告终。 (服务器无响应)

    如果直接访问(没有JMeter的代理服务器),该测试成功。 我可以像这样从JMeter发送压缩的请求数据吗?

2 个答案:

答案 0 :(得分:4)

  1. HTTP Header Manager添加到您的测试计划中,并至少添加以下标题:

    • Content-Type:application / json
    • 内容编码:gzip
  2. 添加Beanshell PreProcessor作为您需要编码的请求的子代,并将以下代码添加到其“脚本”区域:

    import org.apache.commons.io.IOUtils;
    import java.util.zip.GZIPOutputStream;
    
    
    String bodyString = sampler.getArguments().getArgument(0).getValue();
    byte [] requestBody = bodyString.getBytes();
    
    ByteArrayOutputStream out = new ByteArrayOutputStream(requestBody.length);
    GZIPOutputStream gzip = new GZIPOutputStream(out);
    gzip.write(requestBody);
    gzip.close();
    
    sampler.getArguments().getArgument(0).setValue(out.toString(0));
    

    它将获取您的请求正文,压缩它并在运行时替换,因此请求将被gzip压缩。

答案 1 :(得分:0)

编码错误,您需要将其保存在正文中

sampler.getArguments().getArgument(0).setValue(new String(compressedBody, 0));