AWS Api代理压缩“无效块类型”
我有一个Api网关端点设置为HTTP_PROXY
,并且它按预期工作 - 只要您不提供Accept-Encoding: gzip
标头即可。然后它失败了。看来,Api Gateway对响应做了“某些事情”,这使得它在接收端无法解读。AWS Api代理压缩“无效块类型”
这是我所看到的:
- 直接将请求发送到代理服务器后端按预期工作(例如
curl --compressed
成功完成)。 - 通过Api Gateway以
curl --compressed
(以及其他方式)发送请求会导致“无效块类型”。 - 来自代理服务器的响应是17514字节,而通过Api网关,它已被炸至31506字节。这反映在
Content-Length
标题中。 - Api网关包括
x-amzn-Remapped-Content-Length
标题与旧(正确)值,所以它似乎知道它做了东西到响应。
的API方法被配置为HTTP代理,并且看起来是这样的:
aws apigateway get-method --rest-api-id xxxxx --resource-id yyyyy --http-method POST {
"requestModels": {
"application/json": "MyRequestModel"
},
"authorizationType": "CUSTOM",
"apiKeyRequired": false,
"httpMethod": "POST",
"methodIntegration": {
"passthroughBehavior": "WHEN_NO_MATCH",
"cacheKeyParameters": [],
"requestParameters": {},
"uri": "http://myproxy/api/v1/resource",
"httpMethod": "POST",
"requestTemplates": {},
"cacheNamespace": "zzzzz",
"type": "HTTP_PROXY"
},
"requestValidatorId": "xyxyxyxy",
"authorizerId": "zyzyzyzyz"
}
据我所知,没有什么在这里表示代表API网关的任何映射。用户界面也不会显示任何响应映射。
测试API的,我看到以下内容:
- 响应头包括
"Content-Length":"17514"
,这是预期值 - 从中似乎像端点响应主体和方法响应主体是日志同样,尽管手动比较两个gzip数据的乱码ascii表示有点困难。两个
Content-Length
标题都是一样的。
测试期间,重新映射的内容长度值在任何地方都不可见,也不是x-amzn-Remapped-Content-Length
标头。这让我怀疑这可能是由Cloudfront完成的?
我通过“execute-api”和这个API的自定义域映射获得了相同的结果。
任何指针?
回答:
由于Michael在他的一个(非常有帮助的)评论中怀疑 - 这确实是API Gateway将我的gzip流视为UTF-8编码文本的情况,并对其进行了重新编码。鉴于这是一个未设置集成响应映射的端点,API网关会以任何方式处理我的响应,但似乎非常不直观,但在文档中提到了它。
解决方案是告诉API网关,对于此REST API,application/json
内容类型是“二进制数据”。这会导致API网关传递未处理的响应。指示REST API然而,随着Cloudformation要做到这一点,是有点本身就是一个兔子洞,这里的解决方案:
RestApi: Type: 'AWS::ApiGateway::RestApi'
Properties:
Name: !Sub 'agraNcdx${Environment}'
BinaryMediaTypes:
- 'application~1json'
以上是 AWS Api代理压缩“无效块类型” 的全部内容, 来源链接: utcz.com/qa/262310.html