Ответ
Основные HTTP-методы, которые я использую при работе с RESTful API в Flutter-приложениях:
| Метод | Назначение (Семантика) | Идемпотентность* | Безопасность** |
|---|---|---|---|
GET |
Получение данных с сервера. Не должен изменять состояние. | Да | Да |
POST |
Создание нового ресурса. Часто используется для отправки данных (форм, JSON). | Нет | Нет |
PUT |
Полное обновление (замену) ресурса по указанному URI. Если ресурса нет — может создавать. | Да | Нет |
PATCH |
Частичное обновление ресурса. | Нет | Нет |
DELETE |
Удаление ресурса по указанному URI. | Да | Нет |
Идемпотентность: Повторный идентичный запрос дает тот же результат, что и первый. *Безопасность: Метод не изменяет состояние сервера.
Примеры на Dart с package:http:
import 'package:http/http.dart' as http;
// GET запрос
var getResponse = await http.get(Uri.https('api.example.com', '/users/1'));
// POST запрос с телом в формате JSON
var postResponse = await http.post(
Uri.https('api.example.com', '/users'),
headers: {'Content-Type': 'application/json'},
body: '{"name": "John", "job": "Developer"}',
);
// PUT запрос
var putResponse = await http.put(
Uri.https('api.example.com', '/users/1'),
body: {'name': 'Jane'},
);
// DELETE запрос
var deleteResponse = await http.delete(Uri.https('api.example.com', '/users/1'));
Понимание семантики методов важно для корректного проектирования взаимодействия с бэкендом и предсказуемого поведения приложения (например, кэширование для GET).
Ответ 18+ 🔞
Э, слушай, давай разберём эту табличку, а то некоторые думают, что POST и PUT — это одно и то же, ёпта. Ну, типа, отправляют и ладно. А потом у них данные на сервере хуй с горы летят, и они орут: «Бэкендеры — пидарасы шерстяные!». А сами виноваты, блядь.
Смотри, вот тебе святая четвёрка, плюс один запасной игрок.
GET — это как прийти в гости и сожрать всё, что на столе лежит, но при этом ни крошки не уронить и тарелки не разбить. Только читает, ничего не меняет. Идемпотентный и безопасный, то есть хоть сто раз обнови страницу — результат тот же. Идеально для кэширования, блядь.
POST — это уже активные действия, чувак. Пришёл, создал новый ресурс, оставил свои данные. Например, новый юзер в базе. Не идемпотентный: нажмёшь два раза «отправить» — получишь двух одинаковых юзеров, и потом будешь ебаться, удаляя дубли. Внимание на это, распиздяи!
PUT — полная замена, жёсткая. «Вот тебе новый объект, старый — нахуй». Если по такому адресу ничего не было — создаст. Если был — перезатрёт. Идемпотентный: десять раз шлёшь одно и то же — в итоге останется одна последняя версия. Просто и понятно.
PATCH — хитрая жопа. Не хочешь слать весь объект обратно, чтобы поменять один поле? Вот он, красавец. «Браток, обнови только имя, остальное не трогай». Не идемпотентный, потому что если слать десять раз «увеличить счётчик на 1», он каждый раз увеличит. С ним осторожнее, вы ходите по охуенно тонкому льду.
DELETE — тут всё ясно, как божий день. Удалил ресурс — иди нахуй. Идемпотентный: после первого удаления ресурса нет, и все последующие запросы тоже получат «404 — не найдено», то есть результат тот же.
А вот тебе код, как это в Dart выглядит, чтоб не быть теоретиком, блядь:
import 'package:http/http.dart' as http;
// GET запрос — просто забрать
var getResponse = await http.get(Uri.https('api.example.com', '/users/1'));
// POST запрос — создать нового юзера
var postResponse = await http.post(
Uri.https('api.example.com', '/users'),
headers: {'Content-Type': 'application/json'},
body: '{"name": "John", "job": "Developer"}',
);
// PUT запрос — полностью Джона на Джейн поменять
var putResponse = await http.put(
Uri.https('api.example.com', '/users/1'),
body: {'name': 'Jane'},
);
// DELETE запрос — отправить юзера в небытие
var deleteResponse = await http.delete(Uri.https('api.example.com', '/users/1'));
Запомни главное: если используешь методы не по назначению, бэкендер тебе впендюрит так, что мало не покажется. Сервер — не помойка, чтобы в GET данные для изменения слать. Уважай семантику, и будет тебе счастье, а не хиросима в логах.