Ответ
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, не надейся на авось. Иначе пользователь будет охуевать, почему у него ничего не сохраняется.
Вот и вся философия. Умная экономия трафика вместо тупой перезаписи всего подряд.