0Pricing
Java Academy · Урок

Тела запросов и заголовки

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

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

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