如何使用 AWS API 网关 return 压缩内容

How to return gzipped content with AWS API Gateway

我们开发了一个应用程序,提供多种休息服务,支持Accept-Encoding header 到return 压缩内容通过Content-Encoding:gzip header 值。

此应用程序部署在 aws 上的 ec2 实例上,当我们发送带有 Accept-Encoding 值设置的请求时,响应已正确构建。

我们想通过使用 api 网关公开此 api,但它只是用于不压缩请求。当我们发送要求压缩内容的请求时,Content-Encoding header 设置正确但响应内容已损坏。

是否需要在集成响应或方法响应步骤中设置一些特殊的参数或配置?

此致。

遗憾的是,API 网关当前不支持 HTTP 压缩。不过是为了以后的发展考虑。

现在,您需要 return 从您的端点解压缩内容(即省略 Accept-Encoding header),以便通过 API 网关代理它。

如果它适用于您的用例,您可以选择对压缩内容进行 base64 编码,通过 API 网关对其进行代理,然后在客户端对其进行解码。

谢谢, 瑞安

只是一个解决方法,但是 if you set Accept-Encoding: identity you should receive the result correctly(与链接的讨论相反,我发现它适用于 POST GET)。

要允许来自 HTTP 代理端点的 GZipped 内容,您可以在 API.

的 "Binary Support" 部分的 "Binary media types" 中添加 */*

我通过将 Accept-Encoding 添加到 AWS API 网关 Integration Request

使其工作

第 1 步: 转到 AWS API 网关控制台,单击 Integration Request

第 2 步: 添加 Accept-EncodingHTTP Headers 部分,值 'identity' (需要单引号)

第 3 步: 点击 Actions -> Deploy API

如果您使用的是 AWS CloudFormation,您可以添加 yaml Integration: RequestParameters: integration.request.header.Accept-Encoding: "'identity'

自 2017 年 12 月 19 日起。AWS API 网关具有编码支持。

创建 API 后,只需转到设置和 select 内容编码启用。

另外here是AWS官方发布post.

虽然这个问题有点老,但我想补充一个答案,因为这个问题是 top-most 看过的。其实返回压缩内容相关的场景有2种。

第一种情况是您希望API 网关压缩内容。正如已接受的答案所建议的那样,您可以在 API 上启用内容编码,然后进行部署。

第二种情况是您的集成端点已经压缩了结果,您只想通过 API 网关绕过它。传统的解决方法是将其配置为二进制媒体类型。但是,这可能会有问题,因为它将开始将媒体类型的所有响应视为二进制。此外,如果您需要处理多种媒体类型,您唯一的选择是将其设置为“*”。如果您使用 non-proxy 集成,您将失去转换结果的机会。

为了解决第二个问题,现在 API 当使用代理集成并且对内容进行编码时,网关隐式地将响应结果假定为二进制(响应具有 Content-Encoding 以外的值'identity')。当满足这些条件时,您不再需要配置二进制媒体类型。 但是,如果您要返回实际的二进制媒体(例如图像、视频),您仍然需要将它们配置为二进制媒体类型。

您可能想知道当您同时遇到这两种情况时会发生什么。简短的回答是当响应已经有 Content-Encoding header.

时,API 网关不会再次压缩

希望这对您有所帮助。