• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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' 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)