curl - 无法设置 aws api 网关以使用 gzip 编码的集成端点
问题描述
我正在尝试在我的服务端点上启用 gzip 压缩。我原来的休息服务是一个spring boot web应用程序。由于这个答案,我很容易启用了 gzip。
当我尝试将它与 AWS 公共 api 集成时,问题就开始了。我正在使用招摇集成。
如果我不对公共 api 执行任何操作,则通过邮递员或 curl 向公共 api 发出的请求永远不会返回编码响应或与编码相关的标头。
因此,我尝试通过Accept-Encoding
应用特定示例映射将请求标头通过公共 api 传递给我的原始休息服务,如下所示:
{
"/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 中删除参数,则响应不会按预期编码。到这里为止一切都很好。
curl -X GET https://api.service.com/brand/list -H 'Cache-Control: no-cache' -H 'Accept-Encoding: gzip'
但是当我去邮递员并进行相同的查询时(我确信它们是相同的,因为我通过邮递员自己的工具 -code
按钮生成了 curl 命令)它没有得到任何响应。邮递员控制台显示Error: incorrect header check
。
我错过了什么?我的策略错了吗?还是我错过了一些细节?
编辑:我认为编码的响应是正确的,但是当我添加--compressed
到我的curl
请求时,我注意到它在下面给出了错误,所以编码也不正确。
curl:(61)处理内容未编码时出错:无效块类型
解决方案
由于集成响应负载(来自您的服务端点)已经被压缩,您应该让 API Gateway 知道它是二进制的。
以前,您只能通过在 API 设置中明确设置二进制媒体类型来做到这一点。您可以对所有媒体类型使用特定的媒体类型,例如“application/json”或“ / ”。如您所料,有一个缺点。现在无论是否压缩,它都会将内容视为二进制。
最近推出了一项更新,当响应的“Content-Encoding”标头的值不是“identity”时,将集成响应作为二进制隐式处理。例如,如果您的响应包含“Content-Encoding: gzip”,那么 API Gateway 会将其作为二进制处理,而无需任何明确的二进制媒体类型设置。
但是,当您使用 HTTP 集成时,此行为仅适用于 Lambda/HTTP 代理集成。您可以在其上设置二进制媒体类型或切换到 HTTP 代理集成以获得隐式二进制支持的好处。如果您不使用响应正文模板之类的功能,我推荐后者。
推荐阅读
- php - 使用驱动器 SDK 将大型 zip 文件上传到谷歌驱动器给出错误
- html - Bootstrap 4 卡片页脚未与页面底部对齐
- c++ - 同步访问以提升 async_write
- c - 避免使用相似结构重复代码 C
- c# - Odata V4 $Select after $expand on one to one 关系
- vba - vlookup 和索引/匹配组合的字符限制
- reactjs - 当你失去焦点时如何做某事,没有 onBlur
- php - 上传的文件超过了 php.ini 中的 upload_max_filesize 指令。无法在 wordpress 中上传新主题
- python - 无法卸载“熊猫”(distutils 安装项目)
- haskell - Haskell 可以显示多态类型的对象吗?