サーバーレストサービスを提供し、Accept-Encoding
ヘッダー値を介して圧縮されたコンテンツを返すContent-Encoding:gzip
ヘッダーをサポートするアプリケーションを開発しました。
このアプリケーションはawsのec2インスタンスにデプロイされ、Accept-Encoding
値を設定してリクエストを送信すると、応答が正しく構築されます。
APIゲートウェイを使用してこのAPIを公開したいのですが、リクエストを圧縮しないように機能しているだけです。 gzip圧縮されたコンテンツを要求するリクエストを送信すると、Content-Encoding
ヘッダーは正しく設定されますが、レスポンスのコンテンツは破損しています。
統合応答またはメソッド応答のステップで特別なパラメーターまたは構成を設定する必要がありますか?
よろしく。
2017年12月19日以降。AWSAPI Gatewayはエンコードをサポートしています。
APIが作成されたら、[設定]に移動して[コンテンツエンコーディングを有効にする]を選択します。
また、 here はAWS公式リリースの投稿です。
残念ながら、API Gatewayは現在HTTP圧縮をサポートしていません。ただし、今後の開発に備えて検討中です。
現時点では、API Gatewayを介してプロキシするために、エンドポイントから圧縮されていないコンテンツを返す必要があります(つまり、Accept-Encodingヘッダーを省略します)。
ユースケースで機能する場合は、代わりに圧縮されたコンテンツをbase64エンコードし、API Gatewayを介してプロキシし、クライアントでデコードすることができます。
ありがとう、ライアン
回避策のみですが、 設定した場合Accept-Encoding: identity
結果を正しく受け取る必要があります (リンクされたディスカッションとは異なり、私はそれがPOSTand 取得する)。
AWS API Gateway Accept-Encoding
にIntegration Request
を追加して機能させました
ステップ1:AWS API Gatewayコンソールに移動し、Integration Request
ステップ2:Accept-Encoding
をHTTP Headers
セクションに追加し、値'identity'
(単一引用符が必要)
ステップ3:Actions
-> Deploy API
をクリックします
AWS CloudFormation
を使用している場合は、yaml Integration: RequestParameters: integration.request.header.Accept-Encoding: "'identity'
を追加できます
この質問は少し古いですが、この質問は最も多く表示されている質問なので、回答を追加したいと思います。実際、圧縮されたコンテンツを返すことに関連する2つのシナリオがあります。
最初のシナリオは、API Gatewayでコンテンツを圧縮する場合です。受け入れられた回答が示唆するように、APIでコンテンツエンコーディングを有効にしてからデプロイできます。
2番目のシナリオは、統合エンドポイントが既に結果を圧縮しており、APIゲートウェイ経由でそれをバイパスしたい場合です。従来の回避策は、バイナリメディアタイプとして構成することでした。ただし、メディアタイプを含むすべての応答をバイナリとして扱い始めるため、これは問題になる可能性があります。さらに、複数のメディアタイプを処理する必要がある場合、唯一の選択肢はそれを「*」として設定することです。非プロキシ統合を使用している場合、結果を変換する機会が失われます。
2番目の問題に対処するため、プロキシ統合が使用され、コンテンツがエンコードされている場合、API Gatewayは応答結果をバイナリとして暗黙的に想定します(応答には、 'identity'以外の値のContent-Encodingがあります)。これらの条件が満たされている場合、バイナリメディアタイプを構成する必要はありません。ただし、実際のバイナリメディア(画像、ビデオなど)を返す場合でも、それらをバイナリメディアタイプとして構成する必要があります。
両方のシナリオがあるとどうなるのか不思議に思うかもしれません。短い答えは、応答に既にContent-Encodingヘッダーが含まれている場合、API Gatewayは再度圧縮しないということです。
うまくいけば、これが役立ちます。
HTTPプロキシエンドポイントからGZippedコンテンツを許可するには、APIの「バイナリサポート」セクションにある「バイナリメディアタイプ」に*/*を追加できます。