Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Тело запроса и 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 в ответе подсказывает, какой тип ждёт сервер.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.