【问题标题】:How to return gzipped content with AWS API Gateway如何使用 AWS API Gateway 返回压缩后的内容
【发布时间】:2017-01-20 01:20:03
【问题描述】:

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

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

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

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

问候。

【问题讨论】:

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


    【解决方案1】:

    很遗憾,API Gateway 目前不支持 HTTP 压缩。但是,它正在考虑未来的发展。

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

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

    谢谢, 瑞恩

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在拉我的头发几个小时后,我可以确认这条晦涩的信息有效。由于 GZipping 的这个问题以及让 CORS 工作的问题,设置起来一直是一场噩梦。我敢肯定,成千上万的人没有我的毅力而只是放弃了。让亚马逊一起行动。
    • @Lobos 同样在这里,我已经为设置苦苦挣扎了 2 天。这是一场噩梦。
    • 更新:我已经放弃了。
    • 我也是;而是安装了Kong!无论如何,API 网关相当昂贵。
    【解决方案3】:

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

    【讨论】:

    • 来自其他来源的引文必须正确注明出处,格式为文本,而不是屏幕截图。
    【解决方案4】:

    我通过将 Accept-Encoding 添加到 AWS API Gateway 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'

    【讨论】:

      【解决方案5】:

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

      创建 API 后,只需进入设置并选择启用内容编码。

      here 也是 AWS 官方发布帖。

      【讨论】:

      • 如果您在应用中管理 CORS 标头,请不要忘记在您的飞行前响应中允许任何必要的响应标头。我错过了Content-Encoding,尽管启用了这个 API 选项,API Gateway 并没有压缩我的响应。在我对 CORS OPTION 飞行前的回复中,标题 Access-Control-Allow-Headers: Content-Type,Content-Encoding 似乎已修复它。
      • 另外我认为我必须在启用此设置后将 API 部署到舞台。尽管我的 API 中没有其他任何变化,并且设置似乎设置为“api”级别而不是“单个阶段”级别,但在我重新部署 API 之前,我没有看到我的 prod 阶段的压缩到那个阶段。
      • @CarlG 你是什么意思你必须部署到舞台?如果我已经在舞台上工作并修改了设置以启用压缩怎么办?
      【解决方案6】:

      虽然这个问题有点老了,但我想添加一个答案,因为这个问题是观看次数最多的问题。实际上,返回压缩内容有两种情况。

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

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

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

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

      希望这会有所帮助。

      【讨论】:

      • 我正在处理第二种情况(我的集成 Lambda 返回 gzip 压缩的内容,我单独对其进行了测试)但 API 网关弄乱了响应。我的 Lambda 返回我在 API Gateway Web 控制台中测试的标题“Content-Encoding”:“gzip”。任何想法如何让 API 网关将响应视为二进制?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2019-08-24
      • 2021-10-03
      相关资源
      最近更新 更多