Ответ
GET и POST — это методы HTTP протокола с различной семантикой, которые используются при работе с REST API во Flutter-приложениях.
GET-запрос используется для получения (чтения) данных с сервера. Он должен быть идемпотентным (повторные идентичные запросы дают тот же результат) и безопасным (не изменяет состояние сервера).
import 'package:http/http.dart' as http;
Future<void> fetchUserData(int userId) async {
// Параметры передаются в URL (query parameters)
final uri = Uri.parse('https://api.example.com/users')
.replace(queryParameters: {'id': userId.toString()});
final response = await http.get(uri);
if (response.statusCode == 200) {
final userData = jsonDecode(response.body);
print('User: $userData');
} else {
throw Exception('Failed to load user');
}
}
Характеристики GET:
- Параметры передаются в URL (видимы в истории браузера, логах)
- Имеет ограничения на длину URL (зависит от браузера/сервера)
- Может кэшироваться браузерами и промежуточными прокси
- Не должен использоваться для операций, изменяющих данные
POST-запрос используется для отправки (создания/изменения) данных на сервер. Он не идемпотентен (повторный запрос может создать дубликат) и изменяет состояние сервера.
Future<void> createNewPost(String title, String content) async {
final uri = Uri.parse('https://api.example.com/posts');
// Данные передаются в теле запроса (request body)
final body = jsonEncode({
'title': title,
'content': content,
'createdAt': DateTime.now().toIso8601String(),
});
final headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
};
final response = await http.post(uri, body: body, headers: headers);
if (response.statusCode == 201) { // 201 Created
final newPost = jsonDecode(response.body);
print('Created post with ID: ${newPost['id']}');
} else {
throw Exception('Failed to create post');
}
}
Характеристики POST:
- Данные передаются в теле запроса (не видны в URL)
- Нет практических ограничений на размер данных
- Не кэшируется по умолчанию
- Подходит для конфиденциальных данных (с HTTPS)
Когда что использовать во Flutter-приложении:
- GET: Загрузка списка товаров, получение профиля пользователя, поиск с фильтрами
- POST: Регистрация пользователя, отправка формы заказа, загрузка файла, создание нового комментария
Ответ 18+ 🔞
А, ну это же про те самые запросы, которые у всех в мобилках торчат, как шишки на лбу! Слушай, сейчас разжую, чтобы даже мартышлюшка поняла.
В общем, есть два главных способа общаться с сервером — GET и POST. Разница между ними, блядь, как между посмотреть на пирог и этот пирог сожрать. Овердохуища важная.
GET-запрос — это когда ты просишь данные, как будто в холодильник заглядываешь. «Дай-ка мне список друзей, а?» Идемпотентный он, безопасный — сколько раз ни спрашивай «что в холодильнике?», колбаса на месте, состояние сервера не меняется. Вот как это в коде выглядит, ёпта:
import 'package:http/http.dart' as http;
Future<void> fetchUserData(int userId) async {
// Параметры лепятся прямо в URL, всё на виду
final uri = Uri.parse('https://api.example.com/users')
.replace(queryParameters: {'id': userId.toString()});
final response = await http.get(uri);
if (response.statusCode == 200) {
final userData = jsonDecode(response.body);
print('User: $userData');
} else {
throw Exception('Failed to load user');
}
}
Особенности GET, которые надо запомнить:
- Параметры торчат в адресной строке — всё видно в истории, в логах. Не для паролей, ясень пень.
- Длина URL ограничена, так что если ты собрался туда целую книгу «Война и мир» впихнуть — хуй с горы, не выйдет.
- Его браузеры и прокси могут кэшировать, чтобы быстрее отдавать.
- НИКОГДА не используй его, чтобы что-то удалить или изменить. Это как попросить официанта «показать меню», а он вместо этого весь ресторан поджёг. Доверия к такому коду — ноль ебать.
POST-запрос — это уже действие. Ты не смотришь, ты делаешь. «Сервер, ёб твою мать, создай мне новый пост!» Он не идемпотентный — если два раза нажать «отправить заказ», есть шанс получить две пиццы вместо одной. Серверное состояние меняется — вот тебе и хиросима.
Future<void> createNewPost(String title, String content) async {
final uri = Uri.parse('https://api.example.com/posts');
// А вот тут данные уже в теле запроса прячутся, не в URL
final body = jsonEncode({
'title': title,
'content': content,
'createdAt': DateTime.now().toIso8601String(),
});
final headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
};
final response = await http.post(uri, body: body, headers: headers);
if (response.statusCode == 201) { // 201 Created — статус «сделано, чёрт возьми!»
final newPost = jsonDecode(response.body);
print('Created post with ID: ${newPost['id']}');
} else {
throw Exception('Failed to create post');
}
}
Фишки POST:
- Данные в теле, их в URL не видно. Для паролей, карточек и прочей конфиденциальщины — то, что надо (если, конечно, HTTPS есть, а иначе ты просто полупидор).
- Размер данных? Да похуй, овердохуища большие можно отправить, хоть гигабайтный файл.
- Кэшироваться по умолчанию не будет.
- Это твой инструмент для всего, что меняет мир: регистрация, отправка коммента, загрузка авы.
Короче, запомни как «Отче наш»:
- GET — это когда читаешь. Загружаешь ленту, открываешь профиль, ищешь котят.
- POST — это когда пишешь/создаёшь. Регистрируешься, лайкаешь, комментируешь, заказываешь дошик.
Вот и вся магия, ебушки-воробушки. Главное — не перепутай, а то получится пиздопроебибна архитектура, и тебе потом весь код впендюрят обратно в лицо на код-ревью.