Ответ
GET является идемпотентным методом HTTP, а POST — нет.
Идемпотентность означает, что многократное выполнение одного и того же запроса с одинаковыми параметрами не окажет дополнительного эффекта на состояние сервера и вернет тот же результат (если данные между запросами не менялись).
| Метод | Идемпотентен? | Почему | Пример эффекта при повторном вызове |
|---|---|---|---|
| GET | Да | Только получает данные, не изменяет состояние сервера. | Получит те же данные. Ничего нового не создаст. |
| POST | Нет | Предназначен для создания ресурсов или выполнения действий. | Каждый вызов может создать новый ресурс (например, новый заказ, пользователя). |
Пример на Java (JAX-RS):
// GET - идемпотентный
// Повторные вызовы безопасны, не создадут дубликатов.
@GET
@Path("/users/{id}")
public Response getUser(@PathParam("id") Long id) {
User user = userService.findById(id);
return Response.ok(user).build();
}
// POST - не идемпотентный
// Каждый вызов создаст нового пользователя.
@POST
@Path("/users")
public Response createUser(UserDto userDto) {
User newUser = userService.create(userDto);
return Response.status(Response.Status.CREATED).entity(newUser).build();
}
Практическое следствие: Браузеры и клиенты могут безопасно повторять GET-запросы (например, при обновлении страницы), но должны предотвращать случайные повторные отправки POST-запросов (например, двойной клик по кнопке "Отправить").