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

Ответ

PUT используется для полной замены ресурса. Клиент должен отправить полное представление ресурса. Если какие-то поля не указаны, сервер интерпретирует это как их удаление.

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

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

  • Идемпотентность: PUT — идемпотентен (многократный одинаковый запрос дает тот же результат). PATCH — не всегда идемпотентен.
  • Семантика: PUT — «заменить». PATCH — «модифицировать».

Пример на Dart (пакет http):

import 'package:http/http.dart' as http;
import 'dart:convert';

// PUT: Полное обновление пользователя с id=1
Future<void> updateUserPut() async {
  final response = await http.put(
    Uri.parse('https://api.example.com/users/1'),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({
      'name': 'Alice',
      'email': 'alice@example.com', // Все поля обязательны
    }),
  );
}

// PATCH: Частичное обновление только email
Future<void> updateUserPatch() async {
  final response = await http.patch(
    Uri.parse('https://api.example.com/users/1'),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({
      'email': 'new.alice@example.com', // Обновляем только email
    }),
  );
}

Выбор метода зависит от дизайна API. Для операций, похожих на «сохранить как», используйте PUT. Для исправления отдельных атрибутов — PATCH.

Ответ 18+ 🔞

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

PUT — это когда ты выносишь из комнаты всё дохуя и заносишь новую мебель. Клиент должен отправить полный комплект данных ресурса. Если ты забыл указать, например, поле age, сервер подумает: «Ага, значит, возраст теперь null» и удалит его. Это как переписать файл целиком. Метод идемпотентный — сколько раз ни отправляй один и тот же запрос, результат будет одинаковый.

PATCH — это когда ты заходишь в ту же комнату и говоришь: «Знаешь, а этот зелёный диван — говно, давай вместо него красный». Ты отправляешь только инструкции по изменению: «замени поле sofaColor на red». Остальное остаётся как есть. Он не всегда идемпотентный, потому что если ты десять раз отправишь «увеличь счётчик на 1», он каждый раз будет расти.

Короче, семантика:

  • PUT — «заменить всё вот этим».
  • PATCH — «подрихтовать вот эти штуки».

Пример на Dart, чтобы вообще ни у кого вопросов не осталось:

import 'package:http/http.dart' as http;
import 'dart:convert';

// PUT: Полное обновление пользователя. Всё, что не указал — считается удалённым.
Future<void> updateUserPut() async {
  final response = await http.put(
    Uri.parse('https://api.example.com/users/1'),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({
      'name': 'Alice',
      'email': 'alice@example.com', // Если тут не указать 'age', то с твоего аккаунта возраст накроется медным тазом.
    }),
  );
}

// PATCH: Частичное обновление. Меняем только то, что надо.
Future<void> updateUserPatch() async {
  final response = await http.patch(
    Uri.parse('https://api.example.com/users/1'),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({
      'email': 'new.alice@example.com', // Только почту сменили. Имя и возраст на месте.
    }),
  );
}

Что выбрать? Всё от дизайна API, ядрёна вошь.

  • Если операция похожа на «сохранить как» или полную перезапись — твой путь PUT.
  • Если нужно точечно поправить один-два поля, не трогая остальное — это PATCH, чувак.

Главное — не выдумывай велосипед и смотри документацию к конкретному API, а то доверия ебать ноль к тем, кто это писал.