Когда использовать HTTP методы PUT и POST в REST API?

Ответ

HTTP методы PUT и POST используются для взаимодействия с ресурсами в REST API, но имеют разные семантики и предназначение:

  • PUT (Полное обновление или создание с известным URI)

    • Используется для полного обновления существующего ресурса или создания нового, если клиент заранее знает его полный URI.
    • Идемпотентен: Многократное выполнение одного и того же PUT-запроса приводит к одному и тому же состоянию на сервере. Это обеспечивает безопасность при повторных попытках запроса (например, при сетевых ошибках).
    • Пример: Обновление данных пользователя с ID 123.

      PUT /users/123
      Content-Type: application/json
      
      {
          "name": "John Doe",
          "email": "john.doe@example.com"
      }

      Если ресурс /users/123 не существует, PUT может его создать (если сервер поддерживает такую логику).

  • POST (Создание нового ресурса или выполнение операции)

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

      POST /users
      Content-Type: application/json
      
      {
          "name": "Alice Smith",
          "email": "alice.smith@example.com"
      }

      Сервер ответит статусом 201 Created и заголовком Location, указывающим на URI нового ресурса (например, /users/456).

Ключевые различия:

  • Идемпотентность: PUT идемпотентен, POST — нет.
  • URI ресурса: PUT требует, чтобы клиент знал полный URI ресурса. POST обычно отправляется на URI коллекции, и сервер генерирует URI нового ресурса.
  • Назначение: PUT — для замены/обновления ресурса целиком. POST — для создания нового ресурса или выполнения операций, не подходящих под другие глаголы.
  • Возвращаемый статус: PUT часто возвращает 200 OK или 204 No Content. POST обычно возвращает 201 Created с заголовком Location.
  • Частичное обновление: Для частичного обновления ресурса рекомендуется использовать метод PATCH. PUT подразумевает отправку полного представления ресурса.

Ответ 18+ 🔞

Так, слушай, вот тебе про PUT и POST, а то некоторые их как сиамских близнецов используют, нихуя не понимая, в чём разница. Это ж как молоток и отвёртка — общее назначение похожее, а сука, приложение разное.

Вот смотри, PUT — это такой максималист, блядь. Он приходит и говорит: «На месте ресурса по адресу /users/123 должно быть ТОЛЬКО ТО, что я тебе сейчас передам. Всё старое — нахуй в помойку». Он идемпотентный, ёпта. Это значит, что если ты его десять раз подряд отправишь с одним и тем же телом — на сервере хуйня не случится, состояние будет одно и то же. Как гвоздь забивать — десятый раз уже ничего не изменится. Идеально для повторов, если сеть глючит.

PUT /users/123
Content-Type: application/json

{
    "name": "Иван Петров",
    "email": "ivan@example.com"
}

Тут логика такая: «Эй, сервер, по адресу /users/123 должен лежать ровно этот чувак. Если его нет — создай, если есть — полностью перепиши, сука». Всё просто, как три копейки.

А теперь POST — это уже другой коленкор, блядь. Это не идемпотентный засранец. Он как раз для того, чтобы создать что-то новое, чей адрес заранее не известен. Ты шлёшь его обычно в коллекцию, типа /users, и говоришь: «Слушай, прими этого нового персонажа, определи ему ID сам и скажи, где он теперь живёт».

POST /users
Content-Type: application/json

{
    "name": "Анна Сидорова",
    "email": "anna@example.com"
}

Сервер тут: «Ага, понял. Создал. Вот его новый пропуск — /users/789. Забирай». И вернёт тебе статус 201 Created с заголовком Location. А если ты этот POST случайно ещё раз отправишь — он создаст второго такого же Анну, и будет у тебя клон, пиздец. Не идемпотентно, вот в чём соль.

Короче, резюмирую, чтобы в голове осело:

  • PUT — «Вот адрес, вот данные. Сделай так, чтобы по этому адресу было именно это. Всё остальное — нахуй». Идемпотентный, безопасный для повторов.
  • POST — «Вот данные, придумай им место и дай пропуск». Не идемпотентный, каждый новый запрос — потенциально новый ресурс или действие.

И да, запомни ещё одну важную хуйню: если тебе нужно частично обновить ресурс (только email поменять, например), то PUT не катит — он требует всю сущность целиком. Для этого есть PATCH, но это уже другая история, про которую можно отдельно охуеть.