如何使用Apache JMeter发送GZip请求

4

我有一个关于使用Apach JMeter的问题。

我们的项目是,安卓应用程序使用“Apache HttpClient”和其“GzipCompressingEntity”类将JSON数据以“Gzip压缩”的方式发送到API服务器。

为了对API服务器进行性能测试,我尝试使用JMeter的代理(="HTTP(S) Test Script Recorder")记录请求。但是记录下来的请求体为空。

我想要做的是从Apache JMeter向服务器发送“Gziped HTTP 请求数据”。是否有任何方法实现这一点?

以下是我们安卓应用程序请求头的示例。

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是压缩的二进制数据。

我的操作如下:

  1. 在JMeter上运行“HTTP(S)测试脚本记录器(代理服务器)”。
  2. 设置Android的http代理以使用该代理服务器。
  3. 执行HTTP客户端的Android测试代码(post数据通过Gzip压缩)。

然后,该测试代码以失败结束(服务器没有响应)。

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


欢迎来到Stackoverflow。在提问之前,请先使用搜索功能,因为可能已经有其他关于同一主题的问题和答案了,比如这个。如果您找到了问题但是它们的答案不足或者问题本身不匹配,请将它们添加到您的帖子中,并解释它们与您的问题无关。请还要添加详细信息,说明您已经做了哪些工作。 - try-catch-finally
感谢您的建议。很抱歉我的描述不够清晰。 我已经检查了那个问题,但我认为它与我的问题不符。 我可以接收到使用Gzip压缩的服务器响应。 然而,我无法发送Gzip压缩的“请求数据”。 我想从JMeter压缩“请求数据”。 (方向是“客户端=>服务器”) - tf-oikawa
请更新您的问题并将这些信息添加到问题描述中,而不是在评论区中。 - RaGe
你的安卓应用是否使用HTTPS? - RaGe
没有,我在记录请求数据时没有使用SSL。 - tf-oikawa
2个回答

5
  1. Add HTTP Header Manager to your test plan and add at least the following headers:

    • Content-Type: application/json
    • Content-Encoding: gzip
  2. Add Beanshell PreProcessor as a child of the request which you need to encode and add the following code to it's "Script" area:

    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));
    

    It will get your request body, compress it and substitute on the fly so the request will be gzipped.


我成功地通过Beanshell预处理器制作了Gziped请求。 非常感谢您的回答。 - tf-oikawa
请注意,如果您的HTTP请求采样器填写了“内容编码”字段,那么这将破坏压缩。您需要将该字段设置为空白。如果您有大量请求已经设置了该字段,您可以轻松地在文本编辑器中打开JMX文件并执行搜索和替换以删除它。 - Brian Reischl
为了完善@BrianReischl的评论,他所说的是HTTP请求采样器中的内容编码字段(紧挨着要调用的URL),而不是您可能在HTTP头管理器中添加的Content-Encoding头。 - Sacapuces

0

编码有误,你需要像这样将其保存在body中

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接