Какие HTTP-методы являются идемпотентными?

Ответ

Идемпотентные HTTP-методы — это методы, многократное выполнение которых с одними и теми же параметрами приводит к одному и тому же состоянию сервера, как и после первого вызова. Это критично для надежности распределенных систем и API, так как позволяет безопасно повторять запросы при сетевых ошибках или таймаутах.

Основные идемпотентные методы:

  1. GET — Используется для получения данных. Не изменяет состояние сервера.
  2. HEAD — Аналогичен GET, но возвращает только заголовки ответа, без тела. Не изменяет состояние сервера.
  3. PUT — Используется для создания или полного обновления ресурса по указанному URI. Повторные запросы с одним и тем же телом запроса приведут к одному и тому же конечному состоянию ресурса.
  4. DELETE — Используется для удаления ресурса. Повторные запросы к уже удаленному ресурсу не изменяют его состояние (он остается удаленным).
  5. OPTIONS — Возвращает поддерживаемые методы для ресурса. Не изменяет состояние сервера.

Неидемпотентные методы:

  • POST — Используется для создания нового ресурса или отправки данных для обработки. Каждый повторный запрос может создавать новый ресурс или вызывать новые побочные эффекты.
  • PATCH — Используется для частичного обновления ресурса. Повторные запросы могут приводить к разным результатам, если ресурс изменяется между запросами.

Пример с PUT (идемпотентность):

import requests

base_url = 'https://api.example.com/users/1'
user_data = {'name': 'Alice', 'email': 'alice@example.com'}

# Первый PUT-запрос: создает или обновляет пользователя с ID 1
response_1 = requests.put(base_url, json=user_data)
print(f"Первый PUT: Статус {response_1.status_code}")

# Второй PUT-запрос (идентичный): не изменит состояние сервера, если пользователь
# уже существует с этими данными. Если пользователь не существовал, он будет создан.
# Оба запроса приводят к одному и тому же конечному состоянию ресурса.
response_2 = requests.put(base_url, json=user_data)
print(f"Второй PUT: Статус {response_2.status_code}")