AWS API Gateway с Lambda-прокси всегда выдает строковый ответ base64 - PullRequest
0 голосов
/ 28 ноября 2018

Я использую лямбда-прокси API Gateway и пытаюсь вернуть двоичный ответ application/protobuf.Независимо от того, что я делаю, тело ответа всегда является строкой в ​​кодировке base64

  • У меня есть application/protobuf, настроенный как binary media types в APIG
  • Мой клиент (javascript) отправляетследующие заголовки в POST: Accept: application/protobuf Content-Type: application/protobuf
  • Моя лямбда отвечает content-type: application/protobuf и правильно устанавливает IsBase64Encoded Лямбда-ответ на true

Как сделатьвы получаете APIG для base64 декодирования строки?Клянусь, у меня это работало несколько месяцев назад, когда я впервые попробовал это.

Примечание: я также попробовал */* как binary media types

Некоторые похожие посты, чтобы добавить фон:

Обновление:

Оказывается, я могу только получитьэто работает, если binary media type установлено на */*.Заголовок Accept клиента не оказывает влияния после его установки.

Множество плохих побочных эффектов от использования */*, потому что каждый ответ пытается декодироваться (даже если IsBase64Encoded имеет значение false или не установлен)

Я думал, что это не декодирование, потому что инструменты проверки сети Chrome всегда будут отображать двоичные данные в виде base64, закодированного на вкладке Preview.Вы можете увидеть protobuf на вкладке Response.

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема заключалась в том, что я использовал CloudFront перед API-шлюзом, и я не передавал заголовок Accept источнику (APIG).

Документы по обработке двоичных файлов с помощью Lambda-прокси неотлично, поэтому вот краткое резюме:

  • Ваш клиент должен отправить заголовок Accept, который соответствует 1-му типу носителя , который вы задали как binary media types в API Gateway
  • Ваш Lambda, если обслуживает двоичный тип носителя, должен установить для IsBase64Encoded значение true И body должен быть в кодировке base64

Если заголовок Accept клиентов соответствуетзапись в API шлюза binary media types и эти условия будут выполнены, API-шлюз преобразуется (декодирование base64) перед отправкой ответа клиенту.

Этот пост в блоге проведет вас шаг за шагом-шаг о том, как заставить его работать (без CloudFront).

Этот - это полноценный aws-blueprint для получения ci / cd промышленного класса с CloudFront.

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