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

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

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

Начать курс

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

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

1. Java HttpClient (встроенный, Java 11+)

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

Особенности:

  • Не требует дополнительных зависимостей — входит в JDK.
  • Поддержка синхронных (send) и асинхронных (sendAsync) вызовов.
  • Работа с HTTP/2 и автоматическое понижение до HTTP/1.1.
  • Встроенная поддержка WebSocket.
  • Удобная работа с телом запроса через BodyPublishers и ответа через BodyHandlers.

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

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

public class JavaHttpClientExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.github.com/users/octocat"))
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Статус: " + response.statusCode());
        System.out.println("Тело: " + response.body());
    }
}

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

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
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(HttpRequest.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("Статус: " + response.statusCode());
            System.out.println("Ответ: " + response.body());
        }).join();
    }
}

2. OkHttp (Square)

OkHttp — одна из самых популярных библиотек для Android и Java. Она славится высокой производительностью, автоматическим управлением соединениями и поддержкой HTTP/2 и SPDY. OkHttp используется внутри Retrofit и Picasso.

Особенности:

  • Поддержка HTTP/2 и автоматическое мультиплексирование запросов.
  • Встроенный пул соединений и повторное использование сокетов.
  • Прозрачная обработка GZip-сжатия.
  • Поддержка перехватчиков (interceptors) для логирования, аутентификации и ретраев.
  • Простые и fluent-подобные строители запросов.

Подключение (Maven):

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>

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

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

public class OkHttpExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://api.github.com/users/octocat")
                .get()
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("Статус: " + response.code());
            System.out.println("Тело: " + response.body().string());
        }
    }
}

Пример: POST с JSON и перехватчиком

import okhttp3.*;

public class OkHttpPostExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request().newBuilder()
                                .addHeader("Authorization", "Bearer token123")
                                .build();                    

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