Как сделать одновременные сетевые запросы с использованием OKHTTP?

Я ищу лучшие практики для одновременных сетевых запросов с использованием библиотеки OKHTTP.

Вот что я хочу сделать:

Я хочу написать метод, который делает N одновременных сетевых запросов на разные URL-адреса и возвращает ТОЛЬКО, когда ВСЕ N запросов вернулись.

Я думал о том, чтобы вручную написать Threads и Runnables и тому подобное для создания группы пулов запросов, но мне было интересно, есть ли какой-нибудь более простой способ сделать это. Итак, мой вопрос:

  1. OKHTTP как-то поддерживает API параллельных запросов?
  2. Если нет, каков наилучший способ реализовать это?

1 ответ

OkHttp изначально эффективно поддерживает асинхронные запросы, например, разделяет оптимальное количество соединений.

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

Для второй части вопроса вы используете CountdownLatch или вы можете соединиться с Java-фьючерсами, как показано ниже

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

Обратите внимание: если вы заключаете в Futures, может быть легко не закрыть объекты Response, если один из них потерпел неудачу.

Другие вопросы по тегам