Ответ
Идемпотентные HTTP-методы — это методы, многократное выполнение которых с одними и теми же параметрами приводит к одному и тому же состоянию сервера, как и после первого вызова. Это критично для надежности распределенных систем и API, так как позволяет безопасно повторять запросы при сетевых ошибках или таймаутах.
Основные идемпотентные методы:
- GET — Используется для получения данных. Не изменяет состояние сервера.
- HEAD — Аналогичен GET, но возвращает только заголовки ответа, без тела. Не изменяет состояние сервера.
- PUT — Используется для создания или полного обновления ресурса по указанному URI. Повторные запросы с одним и тем же телом запроса приведут к одному и тому же конечному состоянию ресурса.
- DELETE — Используется для удаления ресурса. Повторные запросы к уже удаленному ресурсу не изменяют его состояние (он остается удаленным).
- 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}")