0Pricing
Java Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. java.net.http.HttpClient
  2. Асинхронные запросы
  3. Тела запросов и заголовки
  4. Обработка ответов
← Назад к Java Academy