2016-03-04 5 views
0

Скажем, у меня есть этот HTML:AWS API шлюз и Lambda вернуть изображение

<img src="http://example.com/pic"/> 

То, что я хотел бы сделать, это example.com/pic карту в конечной точке AWS API шлюза.

Эта конечная точка затем вызывает функцию лямбда.

Эта функция лямбда считывает случайное изображение из ведра s3 и возвращает его.

Итак, моя цель - использовать СТАНДАРТНЫЙ тег HTML-изображения и в итоге получить изображение из ведра s3, но через какой-то код принятия решения в лямбде решить, как вернуть изображение.

Я знаю, что вы можете использовать s3 для непосредственного отображения статического содержимого (отсюда лямбда, чтобы принять решение о том, какое изображение). Я также знаю, что могу делать что-то в лямбде, например, b64 кодировать ответ, а затем обрабатывать его на клиенте, но я намерен использовать стандартный HTML IMG-тег.

Возможно ли это?

Я попытался использовать ResponseStreamHandler (Java SDK) для лямбда и возвратил массив байтов изображения, а также добавил конфигурацию шлюза API, чтобы не отображать вывод в JSON, но ничего не работает!

ответ

2

Просто чтобы быть ясно, клиент выполняет две различные запросы:

  1. Первое, чтобы получить HTML (включая URL изображения).
  2. Второе, чтобы получить данные изображения из URL-адреса.

Другими словами, данные изображения не заключены в HTML.

Основываясь на этих знаниях, вы можете иметь Лямбду (за шлюзом API), как вы предлагаете. Реализация Lambda может иметь некоторую логику, которая определяет URL-адрес изображения, сохраненного в S3. Тем не менее, Lambda возвращает данные JSON, а не HTML (есть обходные методы, такие как return the html in a variable), что делает вещи более сложными, особенно для больших HTML-страниц.

Предлагаю несколько иной подход, так как только получение тега изображения не приведет вас далеко. Я предполагаю, что вы добавите тег изображения в HTML-документ, возможно, используя JavaScript. Тогда вы также можете позволить API-шлюзу/Лямбда-запросу вернуть документ JSON с URL-адресом изображения и позволить JavaScript либо обновлять существующий тег изображения с помощью нового URL-адреса, либо генерировать тег для вас.

0

В настоящее время это невозможно, потому что вы не можете вернуть двоичные данные через AWS API Gateway.

Для этого функция лямбда должна вернуть данные изображения в виде двоичного блока и некоторую метаинформацию, такую ​​как тип содержимого изображения. Затем AWS API Gateway должен будет сопоставить это с ответом HTTP. Например: -

лямбда возвратов: { contentType: 'image/png', image: "encoded binary data" }

затем шлюз API потребуется карта CONTENTTYPE для заголовка «Content-Type» ответа, и поместить данные изображения в теле ответа с правильное кодирование и длина.

К сожалению, это не так.Он отображает только текстовые кодировки, такие как application/json или application/xml, как тип ответа (в конце концов, он предназначен для API).

Вы можете легко достичь этого, используя ElasticBeanstalk, где у вас намного больше контроля над ответом на http.

4

Я столкнулся с подобной проблемой. Как уже упоминалось, вы в настоящее время не можете напрямую вернуть свое изображение в двоичном формате с конечной точки шлюза API, что необходимо для корректного отображения браузера.

Однако я решил это, вместо того чтобы API Gateway возвратил 302 Redirect, указывая на нужный файл в S3. Вы можете заставить вашу Лямбду-функцию вернуть URL-адрес в файл, который позже будет сопоставлен с заголовком «Местоположение» в шлюзе API. Браузер выполнит перенаправление и отобразит изображение правильно.

Есть несколько способов реализации редиректа, но я сделал следующим образом:

  • Lambda возвращает объект с целевым изображением, как так:

    function handler(event, context) { 
        context.succeed({ 
         location: "https://[bucket-name].s3-eu-west-1.amazonaws.com/myimage.png" }); 
        }); 
    } 
    
  • Удалить нормальный «200 «Статус ответа метода из ответа интеграции в шлюзе API. Заменить его со статусом ответа «302» и добавить заголовок «Местоположение» отображается на значение «integration.response.body.location»

  • Добавьте 302 статус Ответа Method, а

+0

Единственное решение, которое работает для меня. –

4

К счастью, теперь AWS API Gateway поддерживает двоичные данные, хотя вам также необходимо обновить свой метод ресурсов через CLI, поскольку он еще не реализован в консоли. Это то, что вам нужно сделать:

  1. В Метод Response вашего метода
    Set Content-Type в image/jpeg в HTTP 200 Статус ответ Заголовок
  2. В Интеграционном ответвашего метода
    Установите Content-Type как 'image/jpeg' в заголовках. Помните цитаты!
  3. С AWS CLI установите contentHandling атрибут CONVERT_TO_BINARY на вашей интеграции Ответ

Проверьте, чтобы весь процесс в этой большой шаг за шагом руководство: https://stackoverflow.com/a/41434295/720665

Смежные вопросы