如何使用AWS API Gateway返回gzip压缩内容

时间:2016-09-12 14:48:39

标签: aws-api-gateway http-accept-encoding

我们开发了一个应用程序,它提供了多个休息服务,并支持Accept-Encoding标头通过Content-Encoding:gzip标头值返回压缩内容。

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

我们希望通过使用api网关公开这个api,但它只是为了不压缩请求而工作。当我们发送请求gzip压缩内容的请求时,Content-Encoding标头设置正确但响应内容已损坏。

我们是否必须在集成响应或方法响应步骤中设置一些特殊参数或配置?

问候。

5 个答案:

答案 0 :(得分:9)

不幸的是,API Gateway目前不支持HTTP压缩。但是,它是考虑到未来的发展。

目前,您需要从端点返回未压缩的内容(即省略Accept-Encoding标头),以便通过API网关进行代理。

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

谢谢, 莱恩

答案 1 :(得分:7)

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

创建API后,只需转到“设置”并选择“内容编码启用”。

See example

此外,here是AWS正式发布的帖子。

答案 2 :(得分:5)

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

答案 3 :(得分:0)

要允许来自HTTP代理端点的GZipped内容,您可以在API的“二进制支持”部分的“二进制媒体类型”中添加* / *。

答案 4 :(得分:0)

尽管这个问题有点老了,但我想添加一个答案,因为这个问题是浏览量最高的问题。实际上,有两种情况与返回压缩内容有关。

第一种情况是您希望API Gateway压缩内容时。如公认的答案所示,您可以在API上启用内容编码,然后进行部署。

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

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

您可能想知道两种情况下都会发生什么。简短的答案是,当响应已经具有Content-Encoding标头时,API Gateway将不会再次压缩。

希望这会有所帮助。