Какова разница между HTTP-методами POST, PUT и PATCH?

Ответ

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

1. POST (Создание ресурса)

  • Назначение: Используется для отправки данных на сервер с целью создания нового ресурса.
  • Семантика: Сервер сам определяет URI нового ресурса. Тело запроса содержит данные для создания.
  • Идемпотентность: Не идемпотентен. Повторные запросы POST с одинаковыми данными могут привести к созданию нескольких идентичных ресурсов.
  • Пример: Добавление новой статьи в блог или отправка формы регистрации.

    import requests
    # Создание новой статьи
    response = requests.post('https://api.example.com/articles', json={'title': 'Новая статья', 'content': 'Текст статьи'})
    print(response.json()) # Пример ответа: { "id": 123, "title": "Новая статья", ... }

2. PUT (Полная замена ресурса)

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

    import requests
    # Полное обновление статьи с ID 123
    response = requests.put('https://api.example.com/articles/123', json={'title': 'Обновленная статья', 'content': 'Новый текст статьи', 'author': 'Jane Doe'})
    print(response.json()) # Пример ответа: { "id": 123, "title": "Обновленная статья", ... }

3. PATCH (Частичное обновление ресурса)

  • Назначение: Используется для частичного обновления существующего ресурса.
  • Семантика: Клиент отправляет только те поля, которые необходимо изменить. Сервер применяет эти изменения к существующему ресурсу.
  • Идемпотентность: Не гарантируется. Идемпотентность PATCH зависит от конкретной реализации сервера и формата патча. Например, патч "увеличить счетчик на 1" не будет идемпотентным, тогда как "установить заголовок в 'X'" будет.
  • Пример: Изменение только заголовка статьи.

    import requests
    # Частичное обновление: изменение только заголовка статьи с ID 123
    response = requests.patch('https://api.example.com/articles/123', json={'title': 'Измененный заголовок'})
    print(response.json()) # Пример ответа: { "id": 123, "title": "Измененный заголовок", ... }

Ключевые отличия:

  • POST: Создание нового ресурса, сервер генерирует URI. Не идемпотентен.
  • PUT: Полная замена ресурса по заданному URI. Идемпотентен.
  • PATCH: Частичное обновление ресурса по заданному URI. Идемпотентность зависит от реализации.