我正在尝试在服务端点上启用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)处理内容取消编码时出错:无效的块类型
答案 0 :(得分:1)
由于集成响应有效负载(来自您的服务端点)已经压缩,您应该让API Gateway知道它是二进制的。
以前,您只能通过在API设置中明确设置二进制媒体类型来执行此操作。您可以使用特定的媒体类型,例如' application / json'或' / '适用于所有媒体类型。正如您所料,有一个缺点。现在它将内容视为二进制文件,无论它是否被压缩。
最近推出了一个更新,当响应具有“内容编码”时,将整合响应作为二进制 IMPLICITLY 来处理。带有' identity'以外的值的标头。例如,如果您的回复包含'内容编码:gzip',那么API网关会将其作为二进制文件处理,而不需要任何显式二进制媒体类型设置。
但是,当您使用HTTP集成时,此行为仅适用于Lambda / HTTP代理集成。您可以在其上设置二进制媒体类型或切换到HTTP代理集成以获得隐式二进制支持的好处。如果您不使用响应正文模板等功能,我建议使用后者。