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

回到顶部