Какие есть способы передачи изображения через REST API?

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

Ответ

Передача бинарных данных, таких как изображения, в REST API обычно реализуется одним из двух способов, каждый со своими сценариями использования.

1. Multipart/Form-Data (Наиболее распространенный и правильный для файлов)

Используется для загрузки файлов через HTML-формы. Тело запроса разделяется на части (parts), каждая со своими заголовками.

Преимущества:

  • Не требует кодирования/декодирования, эффективен для больших файлов.
  • Позволяет передавать несколько файлов и дополнительных полей формы в одном запросе.

Пример HTTP-запроса (упрощенно):

POST /api/upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="image"; filename="avatar.png"
Content-Type: image/png

<Бинарные данные изображения>
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="userId"

12345
----WebKitFormBoundary7MA4YWxkTrZu0gW--

Пример на Python (requests):

import requests

url = 'https://api.example.com/upload'
files = {'image': ('avatar.png', open('avatar.png', 'rb'), 'image/png')}
data = {'userId': '12345'}

response = requests.post(url, files=files, data=data)

2. Base64-кодирование в теле JSON

Изображение преобразуется в строку в формате Base64 и передается как обычное поле JSON.

Преимущества:

  • Удобно, если API строго работает только с JSON.
  • Подходит для небольших файлов (например, иконок, миниатюр).

Недостатки:

  • Увеличивает размер данных примерно на 33%.
  • Требует дополнительных операций кодирования на стороне клиента и декодирования на стороне сервера.

Пример JSON-тела запроса:

{
  "userId": "12345",
  "imageData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="
}

Рекомендация: Для загрузки файлов, особенно больших, всегда предпочитайте multipart/form-data. Base64 используйте только в специфичных случаях, когда передача файла — второстепенная задача в основном JSON-интерфейсе.