Что такое PATCH-запрос и как его выполнить во Flutter?

Ответ

PATCH — это HTTP-метод для частичного обновления ресурса на сервере. В отличие от PUT, который заменяет ресурс целиком, PATCH отправляет только изменяемые поля.

Типичный сценарий во Flutter: обновление профиля пользователя, где меняется только имя или аватар.

Пример выполнения с пакетом http:

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

Future<void> updateUserProfile(int userId, String newName) async {
  final url = Uri.parse('https://api.example.com/users/$userId');
  final headers = {'Content-Type': 'application/json'};
  final body = jsonEncode({'name': newName}); // Отправляем только поле name

  final response = await http.patch(url, headers: headers, body: body);

  if (response.statusCode == 200) {
    print('Профиль успешно обновлён');
  } else {
    throw Exception('Ошибка обновления: ${response.statusCode}');
  }
}

Пример с более популярным пакетом dio:

import 'package:dio/dio.dart';

Future<void> updateUserWithDio(int userId, Map<String, dynamic> patchData) async {
  final dio = Dio();
  final response = await dio.patch(
    'https://api.example.com/users/$userId',
    data: patchData, // Например: {'email': 'new@email.com', 'settings': {'theme': 'dark'}}
  );
  print('Данные обновлены: ${response.data}');
}

Ключевые моменты:

  • Сервер должен поддерживать логику обработки частичных обновлений.
  • Успешные коды ответа: 200 (OK) с телом или 204 (No Content).
  • Всегда обрабатывайте возможные ошибки сети и статусы 4xx/5xx.

Ответ 18+ 🔞

Эй, слушай, а вот про PATCH-запросы тебе рассказывали? Ну, это такая штука, когда не надо весь мир на сервер грузить, а только кусочек поменять. В отличие от PUT, который, как слон в посудной лавке, всё целиком заменяет, PATCH — он хитрожопый, только дельту отправляет.

Представь, ты в приложении профиль меняешь. Захотел аватарку новую поставить, а имя оставить. Ну и зачем тебе весь JSON про айдишники и дату рождения гонять? Вот тут PATCH и выручает, ёпта. Отправляешь только то, что поменялось, и сервер, если не конченый, должен это принять и обновить.

Вот как это на http пакете выглядит, простенько:

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

Future<void> updateUserProfile(int userId, String newName) async {
  final url = Uri.parse('https://api.example.com/users/$userId');
  final headers = {'Content-Type': 'application/json'};
  final body = jsonEncode({'name': newName}); // Отправляем только поле name

  final response = await http.patch(url, headers: headers, body: body);

  if (response.statusCode == 200) {
    print('Профиль успешно обновлён');
  } else {
    throw Exception('Ошибка обновления: ${response.statusCode}');
  }
}

Но честно? Все нормальные пацаны на dio уже давно перешли. Там и интерцепторы, и отмена запросов, и вообще меньше писанины. Смотри, как элегантнее:

import 'package:dio/dio.dart';

Future<void> updateUserWithDio(int userId, Map<String, dynamic> patchData) async {
  final dio = Dio();
  final response = await dio.patch(
    'https://api.example.com/users/$userId',
    data: patchData, // Например: {'email': 'new@email.com', 'settings': {'theme': 'dark'}}
  );
  print('Данные обновлены: ${response.data}');
}

А теперь, блядь, самое важное, чтобы не обосраться:

  • Сервер должен это понимать. Это не магия. Если бэкендер — пидарас шерстяной и не реализовал логику частичных обновлений, то твой PATCH накроется медным тазом. Уточняй у него, поддерживает ли он эту пиздопроебибну.
  • Коды ответа. Если всё ок, будет 200 (OK) и, возможно, обновлённый объект в ответе. Или 204 (No Content) — типа, всё принял, молодец, иди отсюда. А если 4xx или 5xx — ну, тут всё ясно, пошло что-то не так. Терпения ноль ебать, но ошибки обрабатывай обязательно, не будь распиздяем.
  • Сеть — она такая. Может оборваться, таймаут может быть. Всегда оборачивай в try-catch, не надейся на авось. Иначе пользователь будет охуевать, почему у него ничего не сохраняется.

Вот и вся философия. Умная экономия трафика вместо тупой перезаписи всего подряд.