Добрый день!
Имеется набор из нескольких сервисов, скажем A, B, C, каждый из которых сам по себе не использует картинки в своей бизнес логике, однако для иллюстративных целей они там используются. Яркий тому пример - аватарка пользователя в сервисе, отвечающим за пользовательский профиль. У всех трёх сервисов предполагается API для работы с ними. Кроме того, каждый сервис накладывает свои ограничения на требуемые размеры изображений.
С точки зрения клиента этих сервисов, самый удобный способ загрузки картинки был бы вроде
POST /resourceA(B,C)/id/images
Content-Type: image/jpeg
...
Однако это означает для каждого сервиса добавить логику работы с изображениями. Если число таких сервисов будет расти, решение видится не очень.
Вместо этого есть вариант сделать некий локальный "фотохостинг" сервис D, который будет заниматься обработкой картинок. Доступ так же через API. Однако встаёт вопрос, как организовать flow загрузки в таком случае. Если в первом варианте, валидация картинок происходила по месту загрузки, то теперь в сервис D надо передать информацию о валидных форматах + данные о создании производных изображений.
У Vimeo я подсмотрел такой вариант:
1) Клиент шлёт POST /resourceA/id/images
2) Сервис A в свою очередь шлёт POST запрос сервису D с требованиями сгенерировать ссылку для загрузки картинки нужного формата и дополнительные данные для генерации других картинок.
3) Сервис D возвращает сервису A ответ с JWT токеном и ссылкой для закачки картинки.
4) Сервис A возвращает то же самое клиенту.
5) Клиент делает PUT запрос с картинкой на возвращённую ссылку.
Далее вариантов два
1) После завершения загрузки сервис D бросает событие "загружено то-то" и сервис A извлекает данные из этого события.
2) Клиент делает ещё один запрос PUT в созданный ресурс /resourceA/id/images/image_id с данными, полученными от D.
В принципе, похожую схему я увидел в API вконтакте и ютуба.
Вопрос возникает больше вот по какому поводу. Что делать, если ресурс для изображения предполагается только один.
Например, в сервисе B есть ресурс /resourceB/id/
image. Как построить flow загрузки этого единственного изображения через сервис D? Как получить от него сгенерированную ссылку для загрузки? Вроде делать POST запрос на этот ресурс неверно, если он уже существует.
У того же Vimeo это решено таким образом, что ресурсов всё же много (POST /users/123/pictures), просто после загрузки выбирается единственный "активный" отдельным запросом (PUT /users/123/pictures/123 {"active": true}).