无法设置aws api网关使用gzip编码的集成端点

时间:2018-05-28 07:04:49

标签: curl postman aws-api-gateway swagger-2.0

我正在尝试在服务端点上启用gzip压缩。我最初的休息服务是一个spring boot web应用程序。由于this回答,我轻松启用了gzip。

当我尝试将其与AWS public api集成时,问题就出现了。我正在使用swagger整合。

如果我没有对公共API做任何事情,通过邮递员或卷曲公共API的请求永远不会返回与编码相关的编码响应或标题。

所以我尝试通过应用特定的示例映射将公共API的Accept-Encoding标头传递给我原来的休息服务,如下所示:

{
    "/brand/list": {
        "get": {
            "summary": "Get a list of brands",
            "description": "List",
            "operationId": "List",
            "produces": [
                "application/json",
                "application/x-www-form-urlencoded",
                "text/plain"
            ],
            "parameters": [
                {
                    "name": "Accept-Encoding",
                    "in": "header",
                    "required": false,
                    "type": "string"
                }
            ],
            "responses": {
                "200": {
                    "description": "OK",
                    "schema": {
                        "$ref": "#/definitions/DataModelOfBrandCatalogue"
                    },
                    "headers": {
                        "Content-Encoding": {
                            "type": "string"
                        }
                    }
                },
                "400": ..., ...., "500"
            },
            "x-amazon-apigateway-integration": {
                "uri": "http://original.service.com/brand/list",
                "responses": {
                    "200": {
                        "statusCode": "200",
                        "responseParameters": {
                            "method.response.header.Content-Encoding": "integration.response.header.Content-Encoding"
                        }
                    },
                    "400": ..., ...., "500"
                },
                "requestParameters": {
                    "integration.request.header.Accept-Encoding": "method.request.header.Accept-Encoding",
                    "integration.request.header.Content-Type": "'application/json'"
                },
                "passthroughBehavior": "when_no_match",
                "httpMethod": "GET",
                "type": "http"
            },
            "tags": []
        }
    }
}

虽然当我部署此描述时,会发生一些有趣的事情。当我执行下面的卷曲请求时,确实会对响应进行编码。如果我从curl中删除Accept-Encoding参数,则响应未按预期编码。一切都还好,直到这里。

curl -X GET   https://api.service.com/brand/list   -H 'Cache-Control: no-cache'   -H 'Accept-Encoding: gzip'

但是当我去邮递员,并进行相同的查询(我确定它们是相同的,因为我通过POSTMAN自己的工具生成curl命令 - code按钮)时,它没有得到任何回复。邮递员控制台显示Error: incorrect header check

我错过了什么?我的策略错了吗?或者我会错过一些细节吗?

修改:我认为编码的响应是正确的,但当我向--compressed请求添加curl时,我发现它在下面给出了错误,因此编码不是正确的。

  

curl:(61)处理内容取消编码时出错:无效的块类型

1 个答案:

答案 0 :(得分:1)

由于集成响应有效负载(来自您的服务端点)已经压缩,您应该让API Gateway知道它是二进制的。

以前,您只能通过在API设置中明确设置二进制媒体类型来执行此操作。您可以使用特定的媒体类型,例如' application / json'或' / '适用于所有媒体类型。正如您所料,有一个缺点。现在它将内容视为二进制文件,无论它是否被压缩。

最近推出了一个更新,当响应具有“内容编码”时,将整合响应作为二进制 IMPLICITLY 来处理。带有' identity'以外的值的标头。例如,如果您的回复包含'内容编码:gzip',那么API网关会将其作为二进制文件处理,而不需要任何显式二进制媒体类型设置。

但是,当您使用HTTP集成时,此行为仅适用于Lambda / HTTP代理集成。您可以在其上设置二进制媒体类型或切换到HTTP代理集成以获得隐式二进制支持的好处。如果您不使用响应正文模板等功能,我建议使用后者。