web-dev-qa-db-ja.com

AWS API Gatewayでgzip圧縮されたコンテンツを返す方法

サーバーレストサービスを提供し、Accept-Encodingヘッダー値を介して圧縮されたコンテンツを返すContent-Encoding:gzipヘッダーをサポートするアプリケーションを開発しました。

このアプリケーションはawsのec2インスタンスにデプロイされ、Accept-Encoding値を設定してリクエストを送信すると、応答が正しく構築されます。

APIゲートウェイを使用してこのAPIを公開したいのですが、リクエストを圧縮しないように機能しているだけです。 gzip圧縮されたコンテンツを要求するリクエストを送信すると、Content-Encodingヘッダーは正しく設定されますが、レスポンスのコンテンツは破損しています。

統合応答またはメソッド応答のステップで特別なパラメーターまたは構成を設定する必要がありますか?

よろしく。

16
althor

2017年12月19日以降。AWSAPI Gatewayはエンコードをサポートしています。

APIが作成されたら、[設定]に移動して[コンテンツエンコーディングを有効にする]を選択します。

See example

また、 here はAWS公式リリースの投稿です。

10

残念ながら、API Gatewayは現在HTTP圧縮をサポートしていません。ただし、今後の開発に備えて検討中です。

現時点では、API Gatewayを介してプロキシするために、エンドポイントから圧縮されていないコンテンツを返す必要があります(つまり、Accept-Encodingヘッダーを省略します)。

ユースケースで機能する場合は、代わりに圧縮されたコンテンツをbase64エンコードし、API Gatewayを介してプロキシし、クライアントでデコードすることができます。

ありがとう、ライアン

9
RyanG

回避策のみですが、 設定した場合Accept-Encoding: identity結果を正しく受け取る必要があります (リンクされたディスカッションとは異なり、私はそれがPOSTand 取得する)。

5
Dan Gravell

AWS API Gateway Accept-EncodingIntegration Requestを追加して機能させました

ステップ1:AWS API Gatewayコンソールに移動し、Integration Requestenter image description here

ステップ2:Accept-EncodingHTTP Headersセクションに追加し、値'identity'(単一引用符が必要) enter image description here

ステップ3:Actions-> Deploy APIをクリックします

AWS CloudFormationを使用している場合は、yaml Integration: RequestParameters: integration.request.header.Accept-Encoding: "'identity'を追加できます

2
ittus

この質問は少し古いですが、この質問は最も多く表示されている質問なので、回答を追加したいと思います。実際、圧縮されたコンテンツを返すことに関連する2つのシナリオがあります。

最初のシナリオは、API Gatewayでコンテンツを圧縮する場合です。受け入れられた回答が示唆するように、APIでコンテンツエンコーディングを有効にしてからデプロイできます。

2番目のシナリオは、統合エンドポイントが既に結果を圧縮しており、APIゲートウェイ経由でそれをバイパスしたい場合です。従来の回避策は、バイナリメディアタイプとして構成することでした。ただし、メディアタイプを含むすべての応答をバイナリとして扱い始めるため、これは問題になる可能性があります。さらに、複数のメディアタイプを処理する必要がある場合、唯一の選択肢はそれを「*」として設定することです。非プロキシ統合を使用している場合、結果を変換する機会が失われます。

2番目の問題に対処するため、プロキシ統合が使用され、コンテンツがエンコードされている場合、API Gatewayは応答結果をバイナリとして暗黙的に想定します(応答には、 'identity'以外の値のContent-Encodingがあります)。これらの条件が満たされている場合、バイナリメディアタイプを構成する必要はありません。ただし、実際のバイナリメディア(画像、ビデオなど)を返す場合でも、それらをバイナリメディアタイプとして構成する必要があります。

両方のシナリオがあるとどうなるのか不思議に思うかもしれません。短い答えは、応答に既にContent-Encodingヘッダーが含まれている場合、API Gatewayは再度圧縮しないということです。

うまくいけば、これが役立ちます。

2
Jaewoo Ahn

HTTPプロキシエンドポイントからGZippedコンテンツを許可するには、APIの「バイナリサポート」セクションにある「バイナリメディアタイプ」に*/*を追加できます。

0
Amee Hirani