Как сделать одновременные сетевые запросы с использованием OKHTTP?
Я ищу лучшие практики для одновременных сетевых запросов с использованием библиотеки OKHTTP.
Вот что я хочу сделать:
Я хочу написать метод, который делает N одновременных сетевых запросов на разные URL-адреса и возвращает ТОЛЬКО, когда ВСЕ N запросов вернулись.
Я думал о том, чтобы вручную написать Threads и Runnables и тому подобное для создания группы пулов запросов, но мне было интересно, есть ли какой-нибудь более простой способ сделать это. Итак, мой вопрос:
- OKHTTP как-то поддерживает API параллельных запросов?
- Если нет, каков наилучший способ реализовать это?
1 ответ
OkHttp изначально эффективно поддерживает асинхронные запросы, например, разделяет оптимальное количество соединений.
Для второй части вопроса вы используете 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, если один из них потерпел неудачу.