HTTP-клиент для Java: обзор топ библиотек (Java 11, Apache, OkHttp, Retrofit)

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

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

Начать курс

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

В современной Java-разработке практически ни одно приложение не обходится без взаимодействия по протоколу HTTP. Отправка запросов к REST API, загрузка файлов, работа с микросервисами — всё это требует надежного и удобного HTTP-клиента. В этой статье мы рассмотрим четыре наиболее популярные библиотеки для работы с HTTP в Java: стандартный HttpClient (Java 11+), Apache HttpClient, OkHttp и Retrofit. Вы узнаете их особенности, сильные стороны и получите практические примеры кода.

1. Java 11 HttpClient (java.net.http)

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

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

  • Не требует дополнительных зависимостей — встроен в JDK.
  • Поддержка HTTP/2 и автоматическое обновление протокола.
  • Удобный API с синхронными и асинхронными вызовами.
  • Встроенная поддержка обработки cookie, редиректов и аутентификации.

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

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

public class Java11HttpClientExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Status code: " + response.statusCode());
        System.out.println("Body: " + response.body());
    }
}

Пример асинхронного POST-запроса:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.util.concurrent.CompletableFuture;

public class AsyncPostExample {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
                .header("Content-Type", "application/json")
                .POST(BodyPublishers.ofString("{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}"))
                .build();

        CompletableFuture<HttpResponse<String>> future =
                client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
        future.thenAccept(response -> {
            System.out.println("Status: " + response.statusCode());
            System.out.println("Body: " + response.body());
        }).join();
    }
}

2. Apache HttpClient

Классическая библиотека от Apache, которая долгое время была стандартом де-факто. Последняя версия (5.x) получила значительные улучшения: поддержка HTTP/2, улучшенная обработка пула соединений и более гибкая конфигурация.

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

  • Максимальная гибкость и тонкая настройка (таймауты, перехватчики, кэширование).
  • Проверенная временем стабильность.
  • Поддержка различных схем аутентификации (Basic, Digest, NTLM).
  • Хорошая интеграция с прокси и SSL.

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

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.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;

public class ApacheHttpClientExample {
    public static void main(String[] args) throws Exception {
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
            try (CloseableHttpResponse response = client.execute(request)) {
                System.out.println("Status: " + response.getCode());
                String body = EntityUtils.toString(response.getEntity());
                System.out.println("Body: " + body);
            }
        }
    }
}

3. OkHttp

OkHttp — это современная, высокопроизводительная библиотека от Square, которая активно используется в Android-разработке, но отлично подходит и для серверных Java-приложений. Она известна своей эффективностью и простотой.

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

  • Автоматическое управление пулом соединений и повторное использование.
  • Встроенная поддержка HTTP/2, SPDY и WebSocket.
  • Прозрачное сжатие GZIP.
  • Легковесная и быстрая.
  • Удобные перехватчики

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