В чем разница между HTTP-запросами GET и POST?

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

Ответ

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: Регистрация пользователя, отправка формы заказа, загрузка файла, создание нового комментария