Тела запросов и заголовки
Отправляйте данные POST и задавайте заголовки
«Тела запросов и заголовки» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Тела запросов и заголовки
Запросам GET редко требуется тело, но POST, PUT и PATCH обычно его используют. HTTP-клиент JDK применяет объекты BodyPublisher для передачи тел запросов и методы строителя для установки заголовков.
В этом уроке рассматриваются отправка данных и управление такими заголовками, как Content-Type.
BodyPublishers.ofString
Самый простой издатель отправляет строковое тело. Передайте его методу POST(...) строителя запроса.
BodyPublishers.noBody() предназначен для запросов без тела.
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"Ada\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users"))
.POST(BodyPublishers.ofString(json))
.build();
System.out.println("Method: " + request.method());
}
}Установка одного заголовка
Используйте header(name, value), чтобы добавить один заголовок. Для отправки JSON почти всегда задают Content-Type.
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users"))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString("{}"))
.build();
System.out.println("Has Content-Type: " +
request.headers().firstValue("Content-Type").isPresent());
}
}Установка нескольких заголовков
headers(name1, value1, name2, value2, ...) задаёт несколько заголовков одним вызовом. Число аргументов должно быть чётным, иначе возникает IllegalArgumentException.
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"))
.headers(
"Accept", "application/json",
"Accept-Language", "en-US")
.GET()
.build();
System.out.println(request.headers().map().keySet());
}
}Заголовки авторизации
Токены предъявителя передаются через заголовок Authorization. Сформируйте значение как строку; никогда не записывайте необработанный токен в журнал.
public class Main {
public static void main(String[] args) {
String token = "abc123";
String headerValue = "Bearer " + token;
System.out.println("Authorization: Bearer ***");
System.out.println("Length: " + headerValue.length());
}
}PUT и DELETE
У строителя есть специальные методы: PUT(publisher), DELETE() и универсальный method(name, publisher) для любых других вариантов, например PATCH.
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
public class Main {
public static void main(String[] args) {
HttpRequest patch = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/users/1"))
.method("PATCH", BodyPublishers.ofString("{\"active\":true}"))
.build();
System.out.println("Method: " + patch.method());
}
}Тела с кодированием формы
Для данных application/x-www-form-urlencoded строку тела создают вручную, кодируя каждое значение согласно правилам URL, а затем публикуют её как строку.
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
String body = "name=" + URLEncoder.encode("Ada Lovelace", StandardCharsets.UTF_8)
+ "&role=" + URLEncoder.encode("engineer", StandardCharsets.UTF_8);
System.out.println(body);
}
}Отправка тела из файла
BodyPublishers.ofFile(path) передаёт файл потоком как тело запроса, не загружая его целиком в память, — это особенно удобно для загрузок.
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/upload"))
.header("Content-Type", "application/octet-stream")
.POST(BodyPublishers.ofFile(Path.of("data.bin")))
.build();
System.out.println("Upload request built");
}
}Тела из массивов байтов
Если байты уже находятся в памяти, BodyPublishers.ofByteArray(byte[]) отправляет их напрямую. Это удобно для двоичных данных, создаваемых во время выполнения.
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
byte[] payload = "raw-bytes".getBytes(StandardCharsets.UTF_8);
// BodyPublishers.ofByteArray(payload) would wrap these bytes
System.out.println("Payload size: " + payload.length + " bytes");
}
}Ограниченные заголовки
В целях безопасности клиент запрещает устанавливать некоторые заголовки, например Host, Content-Length, Connection и Upgrade. Попытка установить их вызывает IllegalArgumentException — клиент управляет ими самостоятельно.
Собираем всё вместе
Типичный JSON-запрос POST объединяет издатель тела и заголовок типа содержимого:
.POST(BodyPublishers.ofString(json)).header("Content-Type", "application/json")- add
.header("Authorization", "Bearer ..."), если это необходимо
Быстрая проверка
Проверьте, насколько хорошо вы поняли работу с телами запросов и заголовками.
Итоги
Вы научились отправлять данные и управлять заголовками:
- BodyPublishers.ofString / ofByteArray / ofFile передают тела запросов.
- POST / PUT / DELETE / method(...) выбирают HTTP-метод.
- header(...) и headers(...) задают заголовки запросов.
- Для JSON и данных формы задавайте
Content-Type, а для токенов используйтеAuthorization. - Некоторые заголовки (
Host,Content-Length) ограничены и управляются клиентом.
Часто задаваемые вопросы
Урок «Тела запросов и заголовки» бесплатный?
Да — полный текст урока «Тела запросов и заголовки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Тела запросов и заголовки»?
Отправляйте данные POST и задавайте заголовки Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Тела запросов и заголовки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- java.net.http.HttpClient
- Асинхронные запросы
- Тела запросов и заголовки
- Обработка ответов