В чем разница между HTTP-методами PUT и PATCH?

Ответ

Оба метода используются для обновления ресурсов, но с разной семантикой.

PUT — полная замена ресурса. Клиент отправляет полное представление ресурса. Сервер должен заменить весь ресурс предоставленными данными. Пропущенные поля могут быть установлены в null или значения по умолчанию.

// Пример запроса PUT для полного обновления пользователя
$client->put('/api/users/123', [
    'json' => [
        'name' => 'Иван Иванов',
        'email' => 'ivan@example.com',
        'age' => 30
        // Поле 'phone', если оно было, может быть удалено
    ]
]);

PATCH — частичное обновление ресурса. Клиент отправляет только те поля, которые необходимо изменить. Остальные поля остаются нетронутыми.

// Пример запроса PATCH для изменения только возраста
$client->patch('/api/users/123', [
    'json' => [
        'age' => 31
        // Поля 'name' и 'email' остаются прежними
    ]
]);

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

  • Идемпотентность: PUT — идемпотентен (многократный одинаковый запрос дает тот же результат, что и один). PATCH — не обязательно идемпотентен, хотя рекомендуется делать его таковым.
  • Семантика: PUT = "поместить это представление по данному URI". PATCH = "примени эти изменения к ресурсу по данному URI".
  • Использование: PUT подходит для сценариев, когда клиент управляет всем ресурсом (например, форма редактирования профиля). PATCH эффективен для точечных обновлений (например, изменение статуса, увеличение счетчика).

Ответ 18+ 🔞

Давай разберем эту дичь, чтобы не путаться, как манда с ушами. Тут два способа обновить что-то на сервере, и разница между ними — просто овердохуища.

PUT — это когда ты приносишь всё заново, полную замену. Представь, тебе надо переписать сочинение. Ты не исправляешь ошибки, а выкидываешь старый лист и пишешь новый, с чистого листа. Если в новом тексте чего-то нет — считай, этого и не должно быть. Сервер тупо заменяет одну хуйню на другую.

// Говорим серверу: "Забудь всё, что знал про юзера 123. Вот новый, полный набор данных"
$client->put('/api/users/123', [
    'json' => [
        'name' => 'Иван Иванов',
        'email' => 'ivan@example.com',
        'age' => 30
        // Поле 'phone' тут не упомянуто? Ну всё, считай, его у пользователя больше нет. Похуй.
    ]
]);

PATCH — это уже хитрая жопа. Точечный ремонт. Тебе не надо переписывать всё сочинение, ты просто берёшь ручку и исправляешь в старом тексте одно слово. Отправляешь только то, что меняется. Всё остальное лежит себе спокойно и не трогается.

// Говорим серверу: "Слушай, у юзера 123 день рождения был. Поменяй только возраст, а имя и почту не трогай, они норм"
$client->patch('/api/users/123', [
    'json' => [
        'age' => 31
        // 'name' и 'email' остаются как были, их даже упоминать не надо
    ]
]);

Так в чём же, блядь, соль?

  • Идемпотентность (страшное слово): PUT — идемпотентный. Это значит, если ты десять раз подряд шлёшь один и тот же запрос — результат будет как от одного. Отправил новый портрет пользователя десять раз — в базе будет тот же самый новый портрет. PATCH таким быть не обязан. Если десять раз отправить "увеличить счётчик на 1", он увеличится на 10, ёпта. Хотя хорошие ребята стараются делать и PATCH предсказуемым.
  • Смысл: PUT — это "засунь вот ЭТО целиком на это место". PATCH — это "примени вот ЭТИ заплатки к тому, что уже лежит на этом месте".
  • Когда что использовать: PUT — когда у тебя есть вся информация и ты её полностью контролируешь (та самая форма редактирования профиля, где все поля). PATCH — для мелких правок, когда лень или не нужно тащить всю простыню данных (поставил лайк, сменил статус, обновил один параметр). Удобно, быстро, трафика меньше.

Короче, если хочешь заменить весь ресурс — PUT. Если хочешь подправить пару полей — PATCH. Всё просто, как хуй с горы. Главное — не перепутай, а то вместо смены почты пользователь может превратиться в пустое место, и будет тебе хиросима.