02 янв. 2017 г., 16:36 от rjmurt

Шлюз AWS API base64Decode создает искаженный двоичный файл?

Я пытаюсь вернуть 1px gif из метода AWS API Gateway.

Поскольку двоичные данные теперь поддерживаются, я возвращаю изображение / gif, используя следующее отображение «Ответ интеграции»:

$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")

Однако, когда я смотрю на это в Chrome, я вижу, что возвращается следующий двоичный файл:

Вместо:

Может ли кто-нибудь помочь мне понять, почему это искажено и неправильной длины? Или что я мог сделать, чтобы вернуть правильный двоичный файл? Есть ли что-то еще, что я всегда мог вернуть этот 1px GIF без использования функции base64Decode?

Большое спасибо заранее, это причиняет мне много боли!

РЕДАКТИРОВАТЬ

Этот становится незнакомцем. Похоже, проблема не в base64Decode, а в общей обработке двоичного кода. Я добавил лямбда-бэкэнд (ранее я использовал Firehose) послеэтот блог и этоВопрос переполнения стека, Я устанавливаю изображения как двоичныйMediaType в соответствии с этимстраница документации.

Это позволило мне передать следующий пиксель изображения / bmp из Lambda через API шлюза, и он работает правильно:

exports.handler = function(event, context) {

  var imageHex = "\x42\x4d\x3c\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x06\x00\x00\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00";
  context.done(null, { "body":imageHex });

};

Однако следующие изображения, представляющие изображение / png или изображение / gif, искажаются при прохождении:

exports.handler = function(event, context) {

//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\xff\xff\xff\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x01\x44\x00\x3b";
//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b";
  var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b\x0a"
  context.done(null, { "body":imageHex });

};

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

Если это кому-нибудь поможет,это был хороший инструмент для преобразования между base64 и hex.

Ответы на вопрос (0)

02 янв. 2017 г., 23:04 от 4,657

Похоже, что это была известная проблема ранее:https://forums.aws.amazon.com/thread.jspa?messageID=668306򣊒

Но это должно быть возможно теперь, когда они добавили поддержку двоичных данных:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html

Похоже, это то, что нам нужно: «Установите для свойства contentHandling ресурса IntegrationResponse значениеCONVERT_TO_BINARY чтобы преобразовать полезную нагрузку ответа из строки в кодировке Base64 в ее двоичный двоичный объект ". Тогда нам не нужноbase64Decode() функция.

Сейчас работаем над тестом, чтобы увидеть, работает ли это.

РЕДАКТИРОВАТЬЯ наконец смог заставить это работать. Вы можете увидеть двоичное изображение здесь:https://chtskiuz10.execute-api.us-east-1.amazonaws.com/prod/rest/image

Вот моя лямбда-функция, которая возвращает кодированный в Base64 PNG в виде строки:https://gist.github.com/davemaple/73ce3c2c69d5310331395a0210069263

Я обновил ответ метода следующим образом:

Я обновил ответ интеграции, чтобы включить жестко закодированный заголовок изображения / png:

Последний шаг был хитрым: настройкаcontentHandling свойство "CONVERT_TO_BINARY". Я не мог понять, как это сделать в консоли AWS. Мне пришлось использовать CLI API для достижения этой цели:

aws apigateway update-integration-response \
    --profile davemaple \
    --rest-api-id chtskiuzxx \
    --resource-id ki1lxx \
    --http-method GET \
    --status-code 200 \
    --patch-operations '[{"op" : "replace", "path" : "/contentHandling", "value" : "CONVERT_TO_BINARY"}]'

Надеюсь, это поможет.

12 дек. 2017 г., 20:22 от M.R.

Для тех, у кого есть проблемы с этим: я также бился головой о стену, пытаясь получить двоичное изображение через API-шлюзинтеграция с прокси отлямбда, но потом я заметил, что там прямо в разделе «Двоичная поддержка» Lambda Console написано:

API-шлюз будет смотреть наТип содержимого а такжепринимать Заголовки HTTP, чтобы решить, как обращаться с телом.

И я добавилAccept: image/png к заголовкам запроса и все заработало. О радость и радость! Нет необходимости вручную изменять обработку контента на CONVERT_TO_BINARY или копаться в кли. Конечно, это исключает использование, например,<img src= напрямую (не могу установить заголовки).

Итак, чтобы получить двоичный файл через API-шлюз от лямбды с интеграцией прокси:

Перечислите все поддерживаемые двоичные типы контента в лямбда-консоли (и разверните)Заголовок Accept запроса должен включать заголовок Content-Type, возвращаемый из лямбда-выраженияВозвращенное тело должно быть в кодировке base64Объект результата также должен иметьisBase64Encoded свойство установлено вtrue

Код:

callback(null, {
    statusCode: 200,
    headers: { 'Content-Type': 'image/png' },
    body: buffer.toString('base64'),
    isBase64Encoded: true
}

ВАШ ОТВЕТ НА ВОПРОС