Что такое multipart/form-data в контексте HTTP-запросов?

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

Ответ

multipart/form-data — это тип содержимого (Content-Type) для кодирования данных HTML-форм при отправке через HTTP. Он позволяет передавать в одном запросе как текстовые поля, так и бинарные файлы (изображения, документы и т.д.).

Как это работает: Запрос разбивается на несколько «частей» (parts), разделённых уникальной строкой-границей (boundary). Каждая часть содержит свои заголовки (например, Content-Disposition с именем поля) и тело с данными.

Пример отправки файла и текста в Flutter/Dart с пакетом http:

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

Future<void> uploadImage(String imagePath, String description) async {
  var request = http.MultipartRequest(
    'POST',
    Uri.parse('https://api.example.com/upload'),
  );

  // Добавляем файл
  request.files.add(
    await http.MultipartFile.fromPath(
      'image', // Имя поля формы
      imagePath,
      contentType: MediaType('image', 'jpeg'),
    ),
  );

  // Добавляем текстовое поле
  request.fields['description'] = description;

  try {
    final response = await request.send();
    if (response.statusCode == 200) {
      print('Файл успешно загружен');
    } else {
      print('Ошибка: ${response.statusCode}');
    }
  } catch (e) {
    print('Ошибка сети: $e');
  }
}

Когда использовать:

  • Загрузка файлов на сервер.
  • Отправка форм, содержащих смешанные данные (текст + файлы).
  • Реализация API, аналогичного поведению HTML-формы с атрибутом enctype="multipart/form-data".