Какой HTTP метод является идемпотентным: GET или POST?

«Какой HTTP метод является идемпотентным: GET или POST?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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-запросов (например, двойной клик по кнопке "Отправить").