首页 文章

如何使用Apache JMeter发布GZip请求

提问于
浏览
2

我有一个使用Apach JMeter的问题 .

我们的项目,Android应用程序将带有“Gzip压缩”的json数据发布到API服务器 . Android应用程序使用“Apache HttpClient”和它的“GzipCompressingEntity”类 .

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

我想要做的是从Apache JMeter发送“Gziped HTTP request data ”到服务器 . 那有什么办法吗?

以下是我们的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 is Gziped binary data.

我做的是

  • 在JMeter上运行"HTTP(S) Test Script Recorder(Proxy Server)" .

  • 设置Android的http代理以使用该代理服务器 .

  • 执行HTTP Client的Android测试代码(帖子数据由Gzip压缩) .

然后,该测试代码以失败告终 . (服务器无响应)

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

2 回答

  • 4
    • HTTP Header Manager添加到您的测试计划并添加至少以下 Headers :

    • Content-Type:application / json

    • Content-Encoding:gzip

    • 添加Beanshell PreProcessor作为您需要编码的请求的子项,并将以下代码添加到"Script"区域:

    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压缩 .

  • 0

    编码是错误的,你需要像这样将它保存在体内

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

相关问题