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) для логирования, аутентификации и повторных попыток.
- Простой и выразительный построитель запросов.
Зависимость (Maven):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.