首页 > 解决方案 > 如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut

问题描述

我正在使用 Jetty Client 11 并希望为每个请求计算发送/接收的字节。

我正在使用高级 HttpClient 。我已阅读此文档,但没有看到有关如何执行此操作的任何信息:

我看到有一种方法可以通过以下方式获取这些信息:

        ConnectionStatistics connectionStatistics = new ConnectionStatistics();
        httpClient.addBean(connectionStatistics);

然后:

        Request request = httpClient.newRequest(uri)
                .version(HttpVersion.HTTP_2)
                .timeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
        request.send(listener);
        ConnectionStatistics connectionStatistics = httpClient.getBean(ConnectionStatistics.class);
        System.out.println(connectionStatistics.getSentBytes()+"/"+ connectionStatistics.getReceivedBytes());

而且我一定做错了什么,因为它甚至不能在全球范围内工作,它总是给出 0。

无论如何,我不知道如何让它在请求的基础上工作。

编辑:

我试过@sbordet 答案:

httpClient.newRequest(...)
  .onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
  ...
  .onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
  ...
  send(...);

它适用于响应。 但是对于请求,我想测量发送的字节,它总是给出 0(注意我只有没有内容的获取),而我希望有原始大小(原始 HTTP 请求字节,包括标头大小......)

标签: javahttpjettyhttp2jetty-9

解决方案


您可以使用以下方法计算请求字节数Request.ContentListener和使用响应字节数Response.ContentListener

httpClient.newRequest(...)
  .onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
  ...
  .onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
  ...
  send(...);

推荐阅读