0Pricing
Java Academy · Урок

Обработка ответов

BodyHandlers и коды состояния

«Обработка ответов» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Обработка ответов

Каждый вызов HTTP-клиента возвращает HttpResponse<T>. Обобщённый тип T определяется переданным вами BodyHandler. В этом уроке рассматриваются доступные обработчики и способы интерпретации кодов состояния.

Интерфейс HttpResponse

Основные методы HttpResponse:

  • statusCode() — целочисленный код состояния.
  • body() — декодированное тело типа T.
  • headers() — заголовки ответа.
  • uri() — конечный URI после перенаправлений.
  • version() — HTTP/1.1 или HTTP/2.

BodyHandlers.ofString

Самый распространённый обработчик декодирует тело в String, используя кодировку из ответа и выбирая UTF-8 по умолчанию. Тип ответа — HttpResponse<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 req = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com")).build();
        HttpResponse<String> res =
            client.send(req, HttpResponse.BodyHandlers.ofString());
        System.out.println(res.body().length());
    }
}

BodyHandlers.ofByteArray

Для двоичного содержимого, например изображений, используйте ofByteArray(). Тип тела становится равен byte[]; его можно записать на диск или самостоятельно декодировать.

public class Main {
    public static void main(String[] args) {
        // ofByteArray() yields HttpResponse<byte[]>
        byte[] simulated = { 1, 2, 3, 4 };
        System.out.println("Bytes received: " + simulated.length);
    }
}

BodyHandlers.ofFile

ofFile(path) потоково записывает ответ непосредственно на диск и возвращает HttpResponse<Path>. Это позволяет не буферизовать большую загрузку в памяти.

import java.net.URI;
import java.net.http.*;
import java.nio.file.Path;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/file.zip")).build();
        HttpResponse<Path> res = client.send(req,
            HttpResponse.BodyHandlers.ofFile(Path.of("out.zip")));
        System.out.println("Saved to: " + res.body());
    }
}

BodyHandlers.discarding

Если вас интересуют только код состояния и заголовки, discarding() отбрасывает тело и создаёт HttpResponse<Void>. Это позволяет избежать затрат на буферизацию.

Проверка успешного выполнения

Распространённый вспомогательный метод проверяет, находится ли код состояния в диапазоне 2xx, прежде чем использовать тело.

public class Main {
    static boolean isSuccess(int code) {
        return code >= 200 && code < 300;
    }
    public static void main(String[] args) {
        System.out.println(isSuccess(204));
        System.out.println(isSuccess(404));
    }
}

Реакция на категории кодов состояния

Проверяйте первую цифру кода состояния, чтобы выбрать ветвь логики для успешных ответов, перенаправлений и ошибок.

public class Main {
    static String classify(int code) {
        return switch (code / 100) {
            case 2 -> "Success";
            case 3 -> "Redirect";
            case 4 -> "Client error";
            case 5 -> "Server error";
            default -> "Unknown";
        };
    }
    public static void main(String[] args) {
        System.out.println(classify(503));
        System.out.println(classify(200));
    }
}

Преобразование тел с помощью mapping

BodyHandlers.mapping(upstream, fn) оборачивает другой обработчик и преобразует его результат. Например, прямо внутри обработчика можно преобразовать строковое тело в целое число, обозначающее длину.

Чтение определённого заголовка

Чтобы прочитать значение заголовка ответа, используйте headers().firstValue(name), который возвращает Optional<String>. Чтобы получить все значения повторяющегося заголовка, используйте allValues(name).

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> len = Optional.of("1024");
        int contentLength = len.map(Integer::parseInt).orElse(0);
        System.out.println("Content-Length: " + contentLength);
    }
}

Выбор обработчика

  • ofString — текстовые API и API JSON.
  • ofByteArray — небольшие двоичные данные, хранящиеся в памяти.
  • ofFile — большие загрузки, потоково записываемые на диск.
  • ofInputStream — обработка тела как потока.
  • discarding — запросы, для которых нужен только код состояния.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете обработку ответов.

Итоги

Вы научились интерпретировать HTTP-ответы:

  • HttpResponse предоставляет statusCode(), body() и headers().
  • BodyHandler определяет тип тела: String, массив байтов, путь, пустое значение или поток.
  • Используйте ofFile для больших загрузок, чтобы снизить нагрузку на память.
  • Классифицируйте коды состояния по первой цифре и проверяйте диапазон 2xx на успешное выполнение.
  • Читайте заголовки с помощью firstValue / allValues.

Часто задаваемые вопросы

Урок «Обработка ответов» бесплатный?

Да — полный текст урока «Обработка ответов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработка ответов»?

BodyHandlers и коды состояния Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Обработка ответов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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