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.
- Легковесная и быстрая.
- Удобные перехватчики