Тело запроса и DTO
Чтобы создать статью, клиент отправляет POST-запрос с JSON в теле запроса. Spring умеет превратить этот JSON в объект Java. Для входных данных принято заводить отдельный класс — DTO (data transfer object, «объект для передачи данных»). В нём только те поля, которые клиенту разрешено присылать.
Запись для входных данных
// src/main/java/com/example/blog/NewPostRequest.java
package com.example.blog;
public record NewPostRequest(String title, String body, String author) {
}Номера и даты создания здесь нет: их назначает сервер, а не клиент. Если бы мы принимали сразу Post, клиент мог бы прислать свой id и перезаписать чужую статью.
Метод контроллера
// src/main/java/com/example/blog/PostController.java
@PostMapping
public Post create(@RequestBody NewPostRequest request) {
return postService.create(request);
}@RequestBody говорит Spring: прочитай тело запроса как JSON и собери из него NewPostRequest. Имена полей JSON должны совпадать с именами компонентов записи.
Метод сервиса
// src/main/java/com/example/blog/PostService.java
public Post create(NewPostRequest request) {
Post post = new Post(null, request.title(), request.body(), request.author(), Instant.now(clock));
return repository.save(post);
}Сервис добавляет то, чего нет в запросе: время создания. Номер назначит хранилище при сохранении.
Отправка запроса
curl -X POST http://localhost:8080/api/posts \
-H "Content-Type: application/json" \
-d '{"title":"Привет, Spring","body":"Первая статья","author":"anna"}'{"id":1,"title":"Привет, Spring","body":"Первая статья","author":"anna","createdAt":"2026-10-04T08:50:07.494425300Z"}-X POST задаёт метод, -H — заголовок, -d — тело запроса. В ответ пришла сохранённая статья уже с номером и датой. Теперь curl http://localhost:8080/api/posts покажет её в списке.
Примеры с curl в курсе написаны для bash. В Windows запускайте их в Git Bash или WSL: в cmd и PowerShell одинарные кавычки вокруг JSON работают иначе. Кроме того, в Windows русские буквы в аргументах curl могут уйти в кодировке Windows-1251, и сервер ответит 400 с ошибкой Invalid UTF-8 middle byte в журнале. Тогда сохраните JSON в файл в кодировке UTF-8 и отправьте его так: curl ... -d @post.json.
Лишние и пропущенные поля
| Ситуация | Что сделает Spring |
|---|---|
| В JSON есть поле, которого нет в записи | Пропустит его |
| В JSON нет поля из записи | Поставит null |
| JSON сломан, например нет закрывающей скобки | Ответит 400 Bad Request |
Чтобы null не попадали в базу, данные нужно проверять — этому посвящён урок о валидации.
Частая ошибка
Если забыть заголовок Content-Type: application/json, curl отправит данные как форму, и Spring откажется их читать:
HTTP/1.1 415
Accept: application/json, application/*+json
{"timestamp":"2026-10-04T08:50:07.998Z","status":415,"error":"Unsupported Media Type","path":"/api/posts"}Код 415 значит «неподдерживаемый тип данных». Заголовок Accept в ответе подсказывает, какой тип ждёт сервер.