Обслуживание разных типов медиа в AWS Lambda с Java / Scala - PullRequest
0 голосов
/ 29 января 2019

При написании функции для AWS Lambda (в Java / Scala) функция-обработчик может иметь одну из разных подписей:

// Raw input / output
def handleRequest(is: InputStream): OutputStream = ???

// Using the AWS dependency
def handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent = ???

Это, по крайней мере, две возможные сигнатуры, которые мне известны.Возможно, есть и другие.

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

Второй ответ, похоже, использует лямбда-прокси-интеграцию и извлечет всю конфигурацию из APIGatewayProxyResponse.

Теперь по моему вопросу:

Поле body из APIGatewayProxyResponse относится к типу String.Мне кажется, что этот POJO сериализуется в JSON перед отправкой в ​​шлюз API.Это сделало бы невозможным обслуживание двоичных данных, таких как изображения или файлы PDF.

Необработанный OutputStream не может содержать информацию о заголовках и т. Д. (Или может?), Что означает, что я не могу обслуживать несколько различных типов носителей.

Конечно, я мог бы конвертировать изображения, например, в Base64.Но это далеко не оптимально.

Есть ли способ, которым я могу обслуживать разные (двоичные и недвоичные) типы мультимедиа (с правильными заголовками и т. Д.) В одном обработчике лямбды AWS?Как мне настроить шлюз API для этого?

1 Ответ

0 голосов
/ 29 января 2019

Примечание: Этот ответ основан на чтении документов.Я не пробовал его на практике, поэтому он может не работать.

Если вы откроете «Формат вывода лямбда-функции для интеграции прокси» в документации, которую вы можете увидеть isBase64Encoded поле и следующий текст:

Выход body направляется во внешний интерфейс как полезная нагрузка ответа метода.Если body - двоичный двоичный объект, вы можете закодировать его как строку в кодировке Base64 и установить isBase64Encoded в true.В противном случае вы можете установить его на false или оставить его неуказанным.

И если вы откроете APIGatewayProxyResponse в библиотеке .Net , вы увидите там свойство IsBase64Encoded.Похоже, что это просто Java API, который не раскрывает это поле.Но вся остальная инфраструктура должна его поддерживать.Вы также можете увидеть, что подобное поле было добавлено к APIGatewayProxyRequestEvent.java в некоторый момент, но не к APIGatewayProxyResponse.Поэтому я думаю, что следующий обходной путь должен работать: создайте свой собственный класс APIGatewayProxyResponseEvent с полем isBase64Encoded и используйте его.Или просто выйдите из стандартного com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent и добавьте это поле в свой подкласс.Я ожидаю, что если вы соответствуете соглашению об именах, оно должно работать.В конце концов, он должен быть преобразован в JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...