Gymterview
middle

В чём разница между GET и POST при отправке формы

GET и POST — это HTTP-методы отправки данных формы. GET передаёт данные в URL как query-параметры и предназначен для получения данных, POST передаёт данные в теле запроса и предназначен для изменения данных на сервере.

Сравнение

Критерий GET POST
Данные в URL Да (/search?q=java) Нет (в теле запроса)
Идемпотентность Да Нет
Кэширование Да Нет
Закладки Можно сохранить Нельзя с данными
Ограничение объёма URL: 2048-8192 символов Нет практического ограничения
Видимость данных В адресной строке, логах, истории Только в теле запроса
Загрузка файлов Нет Да
Безопасность данных Низкая (данные в URL) Выше (данные в теле)

Когда использовать

Сценарий Метод Причина
Поиск GET Результат можно сохранить в закладки, кэшировать
Фильтрация / пагинация GET URL отражает состояние
Создание записи POST Изменение данных на сервере
Авторизация POST Пароль не должен попадать в URL
Загрузка файла POST Файл передаётся в теле
Удаление POST (или DELETE) Изменение состояния

Примеры

GET-форма (поиск):

Пример
<form action="/search" method="GET">
    <input type="text" name="q" placeholder="Поиск...">
    <button type="submit">Найти</button>
</form>
<!-- Результат: GET /search?q=java -->

POST-форма (создание):

Пример
<form action="/api/articles" method="POST">
    <input type="text" name="title" required>
    <textarea name="content"></textarea>
    <input type="hidden" name="_csrf" value="abc123">
    <button type="submit">Создать</button>
</form>

Обработка в Spring MVC

Пример
// GET — получение данных
@GetMapping("/search")
public String search(@RequestParam String q, Model model) {
    model.addAttribute("results", searchService.find(q));
    return "search-results";
}

// POST — изменение данных
@PostMapping("/api/articles")
public String create(@ModelAttribute ArticleForm form) {
    articleService.create(form);
    return "redirect:/articles"; // PRG-паттерн
}

Паттерн PRG (Post/Redirect/Get)

После успешной обработки POST-запроса сервер возвращает редирект (HTTP 302/303) на GET-страницу. Это предотвращает повторную отправку формы при обновлении страницы.

Пример
1. POST /api/articles  →  сервер создаёт статью
2. 302 Redirect → /articles
3. GET /articles  →  сервер отдаёт список статей

Частые ошибки

  • Используют GET для операций, изменяющих данные — поисковые роботы могут случайно выполнить такой запрос при индексации
  • Передают пароли через GET — они сохраняются в истории браузера, логах и Referer-заголовке
  • Не реализуют PRG-паттерн — пользователь при обновлении страницы повторно отправляет POST, дублируя данные

Как используется в 2026

Spring Security требует POST для действий, изменяющих состояние, и автоматически добавляет CSRF-токен. REST API придерживается семантики HTTP-методов: GET для чтения, POST для создания, PUT для обновления, DELETE для удаления.

На собеседовании: GET — данные в URL, идемпотентный, кэшируемый, для получения данных. POST — данные в теле, не идемпотентный, для изменения данных. Обязательно упомяните PRG-паттерн и то, что GET нельзя использовать для конфиденциальных данных. Бонус — связать с REST-семантикой HTTP-методов.