Каковы различия между HTTP-методами POST и PUT?

Ответ

HTTP-методы POST и PUT используются для отправки данных на сервер, но имеют принципиально разную семантику и предназначение в RESTful API.

POST (Создание ресурса или отправка данных)

Назначение: Метод POST используется для отправки данных на сервер, которые будут обработаны сервером. Чаще всего это приводит к созданию нового ресурса, но также может использоваться для отправки данных для обработки, выполнения операций или добавления элемента в коллекцию.

Ключевые особенности:

  • Неидемпотентность: Повторные идентичные POST-запросы могут приводить к созданию нескольких одинаковых ресурсов или выполнению одной и той же операции несколько раз, изменяя состояние сервера каждый раз. Это означает, что результат выполнения запроса зависит от количества его повторений.
  • Сервер определяет URI: При создании нового ресурса сервер обычно сам генерирует его уникальный идентификатор (URI).
  • Пример ответа: В случае успешного создания ресурса, сервер обычно возвращает статус 201 Created и заголовок Location, указывающий на URI нового ресурса.

Пример:

import requests

# Создание нового пользователя
user_data = {'name': 'Alice', 'email': 'alice@example.com'}
response = requests.post('https://api.example.com/users', json=user_data)

print(f"Status: {response.status_code}") # Ожидаем 201 Created
print(f"Location: {response.headers.get('Location')}") # URI нового пользователя

PUT (Обновление или создание ресурса с известным URI)

Назначение: Метод PUT используется для обновления существующего ресурса или создания нового ресурса, если его URI уже известен клиенту. PUT означает, что клиент отправляет полное представление ресурса по указанному URI, и сервер должен заменить существующий ресурс этим представлением или создать его, если он не существует.

Ключевые особенности:

  • Идемпотентность: Повторные идентичные PUT-запросы к одному и тому же URI гарантированно приведут к одному и тому же состоянию ресурса на сервере. Многократное выполнение PUT-запроса не должно иметь дополнительных побочных эффектов после первого успешного выполнения.
  • Клиент определяет URI: Клиент указывает полный URI ресурса, который должен быть обновлен или создан.
  • Полное представление: PUT обычно требует отправки полного представления ресурса. Если отправляется частичное представление, это может привести к удалению отсутствующих полей, так как PUT подразумевает полную замену ресурса.

Пример:

import requests

# Обновление существующего пользователя с ID 123
updated_user_data = {'name': 'Bob', 'email': 'bob@example.com', 'status': 'active'}
response = requests.put('https://api.example.com/users/123', json=updated_user_data)

print(f"Status: {response.status_code}") # Ожидаем 200 OK или 204 No Content

# Создание пользователя с ID 456, если он не существует
new_user_data = {'name': 'Charlie', 'email': 'charlie@example.com'}
response = requests.put('https://api.example.com/users/456', json=new_user_data)

print(f"Status: {response.status_code}") # Ожидаем 201 Created или 200 OK

Сводная таблица различий

Характеристика POST PUT
Назначение Создание нового ресурса, отправка данных Обновление существующего, создание с известным URI
Идемпотентность Нет (повторные запросы могут создавать дубликаты) Да (повторные запросы не меняют результат)
URI ресурса Определяется сервером Определяется клиентом
Представление Может быть частичным (для создания) Обычно полное (для замены)
Типичный ответ 201 CreatedLocation заголовком) 200 OK или 204 No Content (для обновления), 201 Created (для создания)

Примечание: Для частичного обновления ресурса в RESTful API рекомендуется использовать метод PATCH.