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

«В чем разница между HTTP-методами PUT и PATCH?» — вопрос из категории Сети, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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.