#rest #http #mime-types
Вопрос:
Моему веб — приложению требуется конечная точка REST GET /products
, семантика которой заключается в извлечении набора продуктов из каталога продуктов. Каждый продукт имеет набор атрибутов, включая изображение в формате PNG:
[
{
productId: 123,
name: "boat",
image: "\x89504e470d0a1a0..." <-- PNG retrieved from PostgreSQL bytea
},
{
productId: 456,
name: "helicopter",
image: ...
}
... and many more
]
Я считаю, что этот подход не соответствует требованиям REST, потому что тип Mime изображения явно не упоминается.
Подход, который ближе к духу REST, состоял бы в том, чтобы включить вместо двоичных данных гиперссылку на ресурс изображений
[
{
productId: 123,
name: "boat",
image: {
href: "/product/123/image <-- GET response to this resource has Mime-Type image/png
}
},
{
productId: 456,
name: "helicopter",
image: {
href: "/product/123/image <-- GET response to this resource has Mime-Type image/png
}
}
... and many more
]
Но в этом случае клиенту понадобятся GET
изображения продукта по одному, что добавляет значительные накладные расходы к сети (TCP-соединения) и базе данных (запрос изображений по одному).
Существует ли наилучшая практика для встраивания нескольких изображений в один ответ json с правильным типом Mime?
Комментарии:
1. Накладные расходы на встраивание изображений в файл JSON будут намного хуже, чем просто использование большего количества HTTP-запросов. Браузеры повторно используют TCP-соединения с HTTP/1.1, и только 1 будет использовать TCP-соединение для многих запросов с HTTP/2. Это кажется ужасной идеей.
2. У вас проблемы с производительностью или вы думаете, что это возможно? Веб-сайты используют изображения, это нормально 😛
3. @Evert спасибо за подсказку с HTTP/2. Я помню, что в 2010-х годах объединение активов было обязательным для высокопроизводительных веб-приложений. С появлением HTTP/2, похоже, происходит обратное ( speedboostr.com/concatenation-case-study ). У меня пока нет проблем с производительностью, но мне нужно разработать систему, которая может обслуживать 10 одновременных пользователей, которые загружают 100 изображений продуктов (каждое ~ 100 КБ) менее чем за 2 секунды по мобильной сети со скоростью 10 Мбит/с (=1,25 Мбит / сек). Теперь, если я буду продолжать загружать изображения по одному, база данных может стать узким местом. Но 33% трафика из-за base64 тоже не очень хорошо
4. Я бы настоятельно рекомендовал вам делать все «правильно», прежде чем думать о стратегиях оптимизации, которые могли бы выжать из этого немного больше скорости в обмен на гораздо худший API. Измеряйте, улучшайте, повторяйте.
Ответ №1:
Существует ли наилучшая практика для встраивания нескольких изображений в один ответ json с правильным типом Mime?
Похоже, что вы ищете схему URL-адреса «данные» (RFC 2397), которая позволяет указать тип носителя как часть URL-адреса.
data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ 5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7