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();