В чём разница между 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-методов.