Возврат изображений через AWS API Gateway
Я пытаюсь использовать AWS API Gateway в качестве прокси-сервера перед сервисом изображения.
Я могу получить изображение, но оно отображается в виде большого фрагмента ASCII, потому что Content-Type получает значение "application/json".
Есть ли способ сообщить шлюзу НЕ изменять исходный Content-Type вообще?
Я просто хочу, чтобы "image/jpeg", "image/png" и т.д. проходили.
Ответы
Ответ 1
Я пытался отформатировать строку, которая будет возвращена без кавычек, и обнаружила функциональность Integration Response. Я не пробовал это исправление самостоятельно, но что-то в этом направлении должно работать:
- Перейдите на страницу Выполнение метода вашего ресурса,
- нажмите "Интеграционный ответ",
- expand Состояние ответа на вызов 200,
- expand Шаблоны сопоставления,
- нажмите "application/json",
- щелкните карандашом рядом с Output Passthrough,
- изменить "application/json" на "image/png"
Надеюсь, что это сработает!
Ответ 2
Я заранее извиняюсь за то, что дал ответ, который напрямую не отвечает на вопрос, и вместо этого предлагает вам принять другой подход... но основываясь на вопросе и комментариях и моем собственном опыте с тем, что я считаю похожее приложение, похоже, вы можете использовать неправильный инструмент для проблемы или, по крайней мере, инструмент, который не является оптимальным выбором в экосистеме AWS.
Если ваша служба изображений была запущена внутри Amazon Lambda, необходимость в API Gateway была бы более очевидной. Если этого нет, я этого не вижу.
Amazon CloudFront предоставляет выборку контента с внутреннего сервера, кэширование контента (в более чем 50 "крайних" местах по всему миру), бесплатно для хранения кэшированного контента, и вы можете настроить до 100 отдельных имен хостов, указывающих на один дистрибутив Cloudfront, в дополнение к по умолчанию xxxxxxxx.cloudfront.net
имя хоста. Он также поддерживает SSL. Это похоже на то, что вы пытаетесь сделать, а затем некоторые.
Я использую его, довольно успешно, для точно описанного вами сценария: "прокси-сервер перед сервисом изображения". Точно, что мой сервис изображений и служба имиджей могут быть разными (мой - это resizer, который может искать исходный URL-адрес отсутствующего/никогда не запрашиваемого изображения, выборки и изменения размера), но в корне кажется, что мы выполняем аналогичную цель.
Любопытно, что структура ценообразования CloudFront в некоторых регионах (например, us-east-1 и us-west-2) такова, что она не только экономична, но на самом деле использование CloudFront может быть почти на $0.005 дешевле, чем нет используя его на гигабайт.
В моем случае, помимо службы обратного изображения, у меня также есть ведро S3 с одним файлом в нем, прикрепленным к одному пути в дистрибутиве CloudFront (как второе "обычное происхождение" ), для единственная цель обслуживания /robots.txt
, чтобы контролировать прямой доступ к моим изображениям с помощью хорошо выполненных сканеров. Это позволяет управлять файлом robots.txt отдельно от службы изображения.
Если это, похоже, не касается ваших потребностей, не стесняйтесь комментировать, и я уточню или отозму этот ответ.
Ответ 3
@kjsc: мы наконец выяснили, как заставить это работать над альтернативным вопросом с данными, закодированными в base64, которые могут оказаться полезными в вашем решении:
API-интерфейс API AWS base64Decode создает искаженный двоичный файл?
Чтобы ответить на ваш вопрос, чтобы получить Content-Type в виде жестко заданного значения, сначала перейдите на экран ответа метода и добавьте заголовок Content-Type и любой тип контента, который вы хотите.
![ответ метода шлюза api]()
Затем вы перейдете на экран "Ответ на интеграцию" и установите для типа содержимого требуемое значение (рисунок/png в этом примере). Wrap 'image/png' в одинарных кавычках.
![введите описание изображения здесь]()