2017-01-02 5 views
5

Я пытаюсь вернуть 1px gif из метода AWS API Gateway.AWS Gateway API base64Decode производит искаженный двоичный файл?

Поскольку двоичные данные в настоящее время поддерживается, могу вернуть изображение/GIF с помощью следующей «Integration Response» отображение:

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

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

enter image description here

Вместо:

enter image description here

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

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

EDIT

Это один получает незнакомца. Похоже, проблема связана не с base64Decode, а с общей обработкой двоичного кода. Я добавил бэкэнд Lambda (ранее я использовал Firehose) после this blog post и этого Stack Overflow question. Я установил изображения как binaryMediaType в соответствии с этим documentation page.

Это позвольте мне передать следующее изображение/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 }); 

}; 

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

В случае, если это помогает кому-либо, this has been a good tool для преобразования между base64 и hex.

+0

Что заголовки ответа выглядеть в Chrome? –

+0

Спасибо, заголовки ответа: 'HTTP/1.1 200 OK Content-Type: изображение/GIF Content-Length: 52 соединения: держать-жив Дата: Понедельник, 2 января 2017 22:08:55 GMT х-AMZN-RequestID: 0d3f620c-d138-11e6- 941a-0f16afc9bdc4 X-AMZN-трассировки-Id: Корень = 1-586acf77-93ce6c87faa62ee76758abf5 X-кэша: Мисс от CloudFront Via: 1.1 227087338674ca3d3d23a79539f2998b.cloudfront.net (CloudFront) X-Amz-Cf-Id: 9V1XUr1cPqjm7Bj2HOFfakLlFM5MWo_Ucuv9cdk35xsBz_xhcPvixQ = = ' И ответ возвращается как: ' данные: изображения/GIF; base64, R0lGODlhAQABAO +/vQAAAAAA77 + 977 + 977 + 9Ie +/vQQBAAAAACwAAAAAAQABAAACAUQAOw == ' – rjmurt

+0

Что бэкенд для API шлюза? Это Лямбда? –

ответ

6

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

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

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

Работая над тестом, чтобы узнать, работает ли это.

EDIT: Я, наконец, смог получить эту работу.Вы можете увидеть бинарное изображение здесь: https://chtskiuz10.execute-api.us-east-1.amazonaws.com/prod/rest/image

Вот моя функция Lambda, которая возвращает в формате base64 PNG в виде строки: https://gist.github.com/davemaple/73ce3c2c69d5310331395a0210069263

Я обновил ответ метод следующим образом: api gateway binary method response

Я обновленное ответ интеграции, включающий заголовок жестко кодированного изображения/png: api gateway binary integration response

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

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"}]' 

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

+1

Спасибо за вашу помощь Дэйв, я добавил дополнительные подробности о моем исследовании выше. Было бы очень интересно услышать, как вы справляетесь! – rjmurt

+0

дайте мне знать, если вы получите эту работу, как только у вас появится возможность просмотреть. –

+1

Ничего себе, это сработало! Я не могу вас поблагодарить. Я бы не заметил этого! – rjmurt

0

Отъезд this answer. Это помогло мне разоблачить PDF-файл для загрузки через GET-запрос без каких-либо дополнительных заголовков.

1

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

API Шлюз будет выглядеть на Content-Type и Accept 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 
} 

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

  • Нет связанных вопросов^_^