如何使用OKHTTP发出并发网络请求



我正在寻找使用 OKHTTP 库发出并发网络请求的最佳实践。

基本上这就是我想做的:

我想编写一个方法,向不同的 URL 发出 N 个并发网络请求,并且仅在所有 N 个请求都返回时才返回。

我想过手动编写线程和 Runnable 等来创建一组请求池,但想知道是否有某种更简单的方法可以做到这一点。所以我的问题是:

  1. OKHTTP 是否以某种方式原生支持并发请求 API?
  2. 如果没有,实现这一点的最佳方法是什么?

OkHttp 原生有效地支持异步请求,例如共享最佳连接数。

见 https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java

对于问题的第二部分,您可以使用CountdownLatch,或者您可以桥接到java Futures,如下所示。

public class OkHttpResponseFuture implements Callback {
  public final CompletableFuture<Response> future = new CompletableFuture<>();
  public OkHttpResponseFuture() {
  }
  @Override public void onFailure(Call call, IOException e) {
    future.completeExceptionally(e);
  }
  @Override public void onResponse(Call call, Response response) throws IOException {
    future.complete(response);
  }
}

并打电话

  private Future<Response> makeRequest(OkHttpClient client, Request request) {
    Call call = client.newCall(request);
    OkHttpResponseFuture result = new OkHttpResponseFuture();
    call.enqueue(result);
    return result.future;
  }

此时,您可以使用CompletableFuture.allOf等方法。

注意:如果使用期货包装,则当一个对象失败时,很容易不关闭响应对象。

最新更新