API Gateway Lambdaプロキシ統合を使用していて、バイナリapplication/protobuf
応答を返そうとしています。私が何をしても、応答本文は常にbase64でエンコードされた文字列です
application/protobuf
をbinary media types
として設定しています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ネットワーク検査ツールは常にバイナリデータをPreview
タブでbase64エンコードとして表示するため、デコードしていないと思いました。Response
タブ。
問題は、API Gatewayの前でCloudFrontを使用していて、Accept
ヘッダーをOrigin(APIG)に渡していないことでした。
Lambdaプロキシでバイナリを処理することに関するドキュメントは素晴らしいものではないので、ここに簡単な要約を示します。
Accept
ヘッダーを送信する必要があります 1番目のメディアタイプが一致 API Gatewayでbinary media types
として設定したものIsBase64Encoded
をtrueに設定し、body
をbase64エンコードする必要がありますクライアントのAccept
ヘッダーがAPI Gatewayのbinary media types
のエントリと一致し、これらの条件が満たされている場合、API Gatewayはクライアントに応答を送信する前に変換(base64デコード)します。
このブログ投稿 (CloudFrontなしで)機能させる方法をステップバイステップで説明します。
これ は本格的な aws-blueprint で、CloudFrontで製品グレードのci/cdを取得します。