java.net.http.HttpClient
Отправляйте синхронные запросы
«java.net.http.HttpClient» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Современный HTTP-клиент
Начиная с Java 11, JDK включает современный HTTP-клиент в пакете java.net.http. Он заменяет старый HttpURLConnection понятным API с цепочками вызовов, поддерживающим HTTP/1.1 и HTTP/2.
Три основных типа:
- HttpClient — отправляет запросы и управляет настройками (временем ожидания, прокси-серверами и перенаправлениями).
- HttpRequest — неизменяемое описание того, что нужно отправить.
- HttpResponse — результат, включая код состояния, заголовки и тело ответа.
Создание HttpClient
Клиент создаётся с помощью статического метода newBuilder(). Один клиент можно повторно использовать для множества запросов, и он безопасен при работе из нескольких потоков.
Здесь мы настраиваем HTTP/2 и время ожидания подключения. Для быстрого создания экземпляра с настройками по умолчанию также доступен метод newHttpClient().
import java.net.http.HttpClient;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
System.out.println("Client version: " + client.version());
}
}Создание запроса
HttpRequest — неизменяемый объект, который создаётся с помощью строителя с цепочкой вызовов. Как минимум, необходимо указать URI; по умолчанию он выполняет GET.
Строку преобразуют в URI с помощью URI.create(...).
import java.net.URI;
import java.net.http.HttpRequest;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/data"))
.GET()
.build();
System.out.println("Method: " + request.method());
System.out.println("URI: " + request.uri());
}
}Синхронная отправка
Метод send блокирует вызывающий поток до получения ответа. Ему нужен BodyHandler, который сообщает клиенту, как интерпретировать тело ответа.
BodyHandlers.ofString() считывает тело в String.
import java.net.URI;
import java.net.http.*;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
}
}Чтение кода состояния
Ответ предоставляет statusCode() как значение типа int. Коды диапазона 2xx означают успешное выполнение, 3xx — перенаправления, 4xx — ошибки клиента, а 5xx — ошибки сервера.
Примечание: HTTP-клиент никогда не выбрасывает исключение при ответе 4xx/5xx — код необходимо проверять самостоятельно.
public class Main {
public static void main(String[] args) {
int status = 404;
String label;
if (status >= 200 && status < 300) label = "Success";
else if (status >= 300 && status < 400) label = "Redirect";
else if (status >= 400 && status < 500) label = "Client error";
else label = "Server error";
System.out.println(status + " -> " + label);
}
}Чтение тела
С помощью BodyHandlers.ofString() метод response.body() возвращает String. Существуют и другие обработчики для байтов, файлов и потоков — они рассматриваются позже.
Этот фрагмент имитирует содержимое тела, которое вы получили бы.
public class Main {
public static void main(String[] args) {
String body = "{\"message\":\"hello\"}";
System.out.println("Body length: " + body.length());
System.out.println("Body: " + body);
}
}Обработка перенаправлений
По умолчанию клиент не переходит по перенаправлениям. Это настраивается у строителя с помощью followRedirects(...).
В HttpClient.Redirect доступны варианты NEVER, ALWAYS и NORMAL — переходить по перенаправлениям, кроме перехода с HTTPS на HTTP.
import java.net.http.HttpClient;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
System.out.println("Redirect policy: " + client.followRedirects());
}
}Тайм-ауты отдельных запросов
Тайм-аут подключения задаётся у клиента. Тайм-аут запроса (время ожидания ответа) задаётся для запроса с помощью timeout(...).
Если время истекает, send выбрасывает HttpTimeoutException.
import java.net.URI;
import java.net.http.HttpRequest;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofSeconds(5))
.build();
System.out.println("Timeout set: " + request.timeout().isPresent());
}
}Просмотр заголовков ответа
Ответ содержит объект HttpHeaders, доступный через headers(). Поиск заголовков не зависит от регистра и может вернуть несколько значений, поэтому firstValue(...) возвращает Optional<String>.
import java.util.Optional;
public class Main {
public static void main(String[] args) {
// Simulating a header lookup result
Optional<String> contentType = Optional.of("application/json");
System.out.println("Content-Type: " + contentType.orElse("unknown"));
}
}Проверяемые исключения
Синхронный метод send объявляет два проверяемых исключения:
- исключение ввода-вывода — сбой сети или протокола.
- InterruptedException — заблокированный поток был прерван.
Необходимо перехватить оба исключения или объявить их. Асинхронные вызовы (в следующем уроке) избавляют от этого, возвращая результат, доступный в будущем.
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
// client.send(...) would go here
throw new IOException("connection refused");
} catch (IOException e) {
System.out.println("Network problem: " + e.getMessage());
}
}
}Повторно используемый клиент
Рекомендуется создать один HttpClient и использовать его повторно во всём приложении. Он поддерживает пул соединений и полностью безопасен при работе из нескольких потоков.
Создание нового клиента для каждого запроса расходует ресурсы и лишает вас преимуществ мультиплексирования HTTP/2.
import java.net.http.HttpClient;
public class Main {
private static final HttpClient SHARED = HttpClient.newHttpClient();
public static void main(String[] args) {
System.out.println("Shared client ready: " + (SHARED != null));
}
}Быстрая проверка
Проверьте, насколько хорошо вы поняли работу синхронного HTTP-клиента.
Итоги
Вы изучили основы HTTP-клиента JDK:
- HttpClient.newBuilder() задаёт версию, тайм-аут и перенаправления; повторно используйте один экземпляр.
- HttpRequest.newBuilder().uri(...).GET() создаёт неизменяемый запрос.
- client.send(request, BodyHandlers.ofString()) блокирует поток и возвращает
HttpResponse<String>. - Результаты считываются с помощью
statusCode(),body()иheaders(). - Коды, отличные от 2xx, не вызывают исключение — проверяйте их самостоятельно.
Часто задаваемые вопросы
Урок «java.net.http.HttpClient» бесплатный?
Да — полный текст урока «java.net.http.HttpClient» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «java.net.http.HttpClient»?
Отправляйте синхронные запросы Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «java.net.http.HttpClient»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- java.net.http.HttpClient
- Асинхронные запросы
- Тела запросов и заголовки
- Обработка ответов