我将Api网关端点设置为HTTP_PROXY
,并且按预期工作 - 只要您不提供Accept-Encoding: gzip
标头。然后就失败了。似乎Api Gateway正在对响应进行“某种操作”,这使得它在接收端无法解读。
这就是我所看到的:
curl --compressed
成功完成)。curl --compressed
(以及其他方式)通过Api网关发送请求会导致“无效的阻止类型”。Content-Length
标题中。x-amzn-Remapped-Content-Length
标头,因此它似乎知道它对响应做了某些事情。API方法配置为HTTP PROXY,如下所示:
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 Gateway的任何映射。 UI也不表示任何响应映射。
测试Api,我看到以下内容:
"Content-Length":"17514"
,这是预期值Content-Length
标题也相同。在测试期间,重新映射的内容长度值在任何地方都不可见,x-amzn-Remapped-Content-Length
标头也不可见。这让我怀疑这可能是由Cloudfront完成的吗?
我通过“execute-api”和我的自定义域映射得到了相同的结果。
任何指针?
答案 0 :(得分:2)
正如迈克尔在他的一篇(非常有帮助的)评论中所怀疑的那样 - 这确实是API Gateway将我的gzip流视为UTF-8编码文本并重新编码的情况。鉴于这是一个没有设置集成响应映射的端点,API Gateway会以任何方式处理我的响应,这似乎非常违反直觉,但在文档中提到了它。
解决方案是告诉API Gateway,对于此REST API,application/json
内容类型是"二进制数据"。这会导致API Gateway在未处理的情况下传递响应。然而,指示REST API使用Cloudformation执行此操作本身就是一个漏洞,这是解决方案:
RestApi:
Type: 'AWS::ApiGateway::RestApi'
Properties:
Name: !Sub 'agraNcdx${Environment}'
BinaryMediaTypes:
- 'application~1json'