Что такое асинхронный HTTP-запрос?

«Что такое асинхронный HTTP-запрос?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Асинхронный HTTP-запрос — это сетевой запрос, который выполняется без блокировки потока, его инициировавшего. Приложение отправляет запрос и немедленно продолжает работу, а ответ обрабатывается позже, когда он будет получен от сервера.

Как это работает (на примере Java):

  1. Инициируется запрос к удалённому серверу.
  2. Сетевой стек ОС берёт на себя ожидание ответа.
  3. Поток приложения освобождается.
  4. При поступлении ответа система (или callback) уведомляет приложение, и обработка возобновляется в том же или новом потоке.

Пример с использованием HttpClient (Java 11+):

import java.net.http.*;
import java.net.URI;
import java.util.concurrent.CompletableFuture;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/data"))
        .build();

// sendAsync возвращает CompletableFuture сразу
CompletableFuture<HttpResponse<String>> futureResponse =
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

// Цепочка асинхронной обработки ответа
futureResponse.thenApply(HttpResponse::body) // Извлекаем тело ответа
              .thenAccept(body -> System.out.println("Ответ сервера: " + body))
              .exceptionally(ex -> {
                  System.err.println("Запрос не удался: " + ex.getMessage());
                  return null;
              });

// Этот код выполнится ДО получения ответа от сервера
System.out.println("Запрос выполняется в фоне...");

Преимущества перед синхронным запросом:

  • Высокая пропускная способность: Один поток может управлять множеством одновременных соединений.
  • Отзывчивость: Критичные потоки (например, UI) не блокируются сетевыми задержками.
  • Эффективное использование ресурсов: Не требуется создавать по одному потоку на каждый запрос.