Какой стандартный способ отправки файлов через REST API?

«Какой стандартный способ отправки файлов через REST API?» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стандартным и наиболее распространенным способом отправки файлов через REST API является использование HTTP-метода POST или PUT с Content-Type: multipart/form-data.

Этот подход позволяет передавать бинарные данные (файл) вместе с метаданными (например, имя пользователя, описание файла) в одном запросе.

Ключевые моменты:

  1. HTTP-метод: Чаще всего POST для создания нового ресурса (файла).
  2. Заголовок Content-Type: Устанавливается в multipart/form-data.
  3. Тело запроса: Форматируется как набор "частей" (parts), где каждая часть имеет свои заголовки и данные. Одна часть содержит файл, другие — текстовые поля.

Пример на Python с библиотекой requests

Этот код демонстрирует отправку файла report.xlsx вместе с дополнительным полем report_type.

import requests

# URL эндпоинта на сервере для загрузки файлов
url = 'https://api.example.com/upload'

# Путь к файлу, который нужно отправить
file_path = 'reports/report.xlsx'

# Дополнительные данные для отправки
form_data = {'report_type': 'monthly'}

# Файл открывается в бинарном режиме для чтения ('rb')
with open(file_path, 'rb') as f:
    # 'file' - это имя поля, которое ожидает сервер
    files = {'file': (f.name, f, 'application/vnd.ms-excel')}

    # Отправка запроса
    response = requests.post(url, data=form_data, files=files)

print(f"Статус-код: {response.status_code}")
print(f"Ответ сервера: {response.json()}")

Альтернативы

  • Base64-кодирование: Файл кодируется в строку Base64 и вставляется в тело JSON-запроса. Это увеличивает размер данных примерно на 33% и требует декодирования на сервере.
  • Raw binary: Отправка файла как есть в теле запроса с соответствующим Content-Type (например, image/png). Этот метод не позволяет передавать метаданные вместе с файлом.