Обработка ответов
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 — локальная установка не требуется.
Все уроки этого курса
- java.net.http.HttpClient
- Асинхронные запросы
- Тела запросов и заголовки
- Обработка ответов