从API网关到Lambda的二进体传递

我想我已经密切关注了迄今为止发现的文档和教程,但是我仍然可以使用它。 我不能说服AWS不要触摸我在文章中发布的二进制数据。

在我的应用程序中,我将原始API请求的Content-Type和Accept标头设置为application / x-msgpack,我在二进制支持下将其定义为二进制媒体types:

在这里输入图像说明

我没有在方法请求中设置任何内容:

在这里输入图像说明

在集成请求中,我没有启用代理,并且启用了请求主体直通function:

在这里输入图像说明

我已经启用了CloudWatch日志来执行API网关,我可以看到AWS仍然是base-64编码的二进制数据:

 17:30:29开始执行请求:...
 17:30:29 HTTP方法:POST,资源path:/ ...
 17:30:29方法请求path:{}
 17:30:29方法请求查询string:{}
 17:30:29方法请求标题:{
    接受=应用程序/ x-msgpack,
    内容types=应用程序/ x-msgpack,
     ...
 }
 17:30:29转换前的方法请求体:[Binary Data]
 17:30:29端点请求URI:https:// ...
 17:30:29端点请求标题:{
    接受=应用程序/ x-msgpack,
     ...
     [截断 - 我没有看到标题的其余部分]
 }
 17:30:29转换后的端点请求体:[Base-64编码的二进制数据]
 17:30:29发送请求到https:// ...

请注意,CloudWatch日志中的端点请求标头已被截断(我自己并未针对此问题截断端点请求标头)。 因此我没有看到Content-Type头是什么。

注意“转换前的方法请求体”和“转换后的端点请求体”。 为什么它仍然将二进制数据转换为base-64?

我迄今使用的来源是:

  • http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html
  • https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/
  • http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html
  • http://docs.aws.amazon.com/apigateway/api-reference/resource/integration/#contentHandling

更新

我已经通过AWS CLI检查了集成设置,并得到了这个:

 > aws apigateway get-integration \
   --rest-api-id ... \
   --resource-id ... \
   --http方法POST
 {
     “integrationResponses”:{
         “200”:{
             “selectionPattern”:“”, 
             “statusCode”:“200”
         }
     }, 
     “contentHandling”:“CONVERT_TO_TEXT”, 
     “cacheKeyParameters”:[], 
     “uri”:“...”, 
     “httpMethod”:“POST”, 
     “passthroughBehavior”:“WHEN_NO_TEMPLATES”, 
     “cacheNamespace”:“...”, 
     “type”:“AWS”
 }

我注意到了"contentHandling": "CONVERT_TO_TEXT"位,我试着重写"" (空值,这反过来完全删除属性)和"CONVERT_TO_BINARY"做:

 > aws apigateway更新集成\
   --rest-api-id ... \
   --resource-id ... \
   --http-method POST \
   --patch-operations'[{“op”:“replace”,“path”:“/ contentHandling”,“value”:“”}]'

我现在看到端点请求被保存为二进制:

 10:32:21转换后的端点请求体:[Binary Data]

但是,我得到这个错误:

 10:32:21转换之前的端点响应正文{“Type”:“User”,“message”:“无法将请求正文parsing为json:意外字符((CTRL-CHAR,code 129))...

我的Lambdafunction在CloudWatch日志上没有任何活动。 而我的Lambda函数并不是试图将传入的数据parsing为JSON的函数。 所以,在API-Lambda集成path的某个地方,数据被parsing为JSON,而不是被保留为二进制文件。