OkHttp:与http://example.com/的连接泄露了。你忘记关闭一个响应机构了吗?

问题描述 投票:1回答:1

OkHttp v3.4.1的这个错误信息已经讨论了几次,每次我读到它时,人们都没有关闭响应主体:

  WARNING: A connection to http://www.example.com/ was leaked. Did you forget to close a response body?

但我的代码如下:

  private String executeRequest(Request request) throws IOException {
    Response response = httpClient.newCall(request).execute();

    try (ResponseBody responseBody = response.body()) {
      String string = responseBody.string();
      logger.debug("Result: {}", string);
      return string;
    }
  }

所以responseBody.close()总是被称为。为什么我得到上述错误?我配置了一个自定义JWT拦截器,但我不知道它是如何导致问题的:

public class JwtInterceptor implements Interceptor {

  private String jwt;

  @Override
  public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    if (jwt != null) {
      request = request.newBuilder()
          .addHeader("Authorization", "Bearer " + jwt)
          .build();
    }

    Response response = chain.proceed(request);
    String jwt = response.header("jwt");
    if (jwt != null) {
      this.jwt = jwt;
    }

    return chain.proceed(request);
  }
}
java okhttp3
1个回答
2
投票

结果我的拦截器被窃听:

return chain.proceed(request);

应该:

return response;
© www.soinside.com 2019 - 2024. All rights reserved.