HTTP-клиент для Java: топ библиотек для работы с HTTP-запросами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

HTTP-клиент для Java: топ библиотек для работы с HTTP-запросами

Современная Java-разработка немыслима без взаимодействия с внешними сервисами через HTTP. Будь то REST API, веб-хуки или загрузка файлов — качественный HTTP-клиент — основа любого сетевого приложения. В этой статье мы разберём четыре лучшие библиотеки для Java: от классического Apache HttpClient до современного Retrofit. Вы узнаете их сильные стороны, типичные сценарии использования и увидите примеры кода.

1. Apache HttpClient (Apache HttpComponents)

Это, пожалуй, самая известная и зрелая библиотека для HTTP в Java. Развивается с 2004 года, поддерживает HTTP/1.1 и HTTP/2, гибкую настройку пула соединений, прокси, аутентификацию и перехватчики запросов. Идеально подходит для серверных приложений с высокими требованиями к кастомизации.

Пример GET-запроса:

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;

try (CloseableHttpClient client = HttpClients.createDefault()) {
    HttpGet request = new HttpGet("https://api.example.com/data");
    String response = client.execute(request, classicHttpResponse -> {
        return new String(classicHttpResponse.getEntity().getContent().readAllBytes());
    });
    System.out.println(response);
}

Ключевые особенности:

  • Полная поддержка HTTP/1.1 и HTTP/2
  • Гибкое управление пулом соединений и таймаутами
  • Встроенная поддержка прокси-серверов и SSL/TLS
  • Обширная экосистема плагинов и перехватчиков
  • Совместимость с Java 8+

2. OkHttp

Современная библиотека от Square, оптимизированная для Android и Java 8+. Отличается высокой производительностью за счёт асинхронного I/O и встроенного HTTP/2 мультиплексирования. OkHttp автоматически управляет повторными попытками, кэшированием и сжатием данных. Часто используется в связке с Retrofit.

Асинхронный запрос:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
        .build();

Request request = new Request.Builder()
        .url("https://api.example.com/data")
        .build();

client.newCall(request).enqueue(new okhttp3.Callback() {
    @Override
    public void onFailure(okhttp3.Call call, IOException e) {
        System.err.println("Ошибка: " + e.getMessage());
    }

    @Override
    public void onResponse(okhttp3.Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            System.out.println(response.body().string());
        }
    }
});

Преимущества:

  • Автоматическая поддержка HTTP/2 и SPDY
  • Встроенное кэширование и сжатие (gzip)
  • Асинхронные вызовы без блокировки потоков
  • Минимальный размер JAR (~600 КБ)
  • Интеграция с Android и Kotlin

3. Java 11 HttpClient (стандартный)

Начиная с Java 11, в стандартную библиотеку JDK был добавлен современный HTTP-клиент. Он поддерживает HTTP/2, WebSocket, реактивные потоки данных и синхронные/асинхронные запросы. Идеальное решение для проектов, где не хочется подключать сторонние зависимости.

Синхронный GET с обработкой ошибок:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

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

try {
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println("Статус: " + response.statusCode());
    System.out.println("Тело: " + response.body());
} catch (IOException | InterruptedException e) {
    System.err.println("Ошибка запроса: " + e.getMessage());
}

Плюсы и минусы:

  • Не требует внешних зависимостей
  • Поддержка асинхронных вызовов через sendAsync()
  • Ограниченная кастомизация по сравнению с Apache HttpClient
  • Нет встроенного пула соединений (но можно использовать кастомный Executor)
  • Работает только с Java 11 и выше

4. Retrofit (типизированный клиент)

Retrofit — это не просто HTTP-клиент, а полноценный REST-клиент с

Рекомендаций