我想我已经密切关注了迄今为止发现的文档和教程,但是我仍然可以使用它。 我不能说服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?
我迄今使用的来源是:
我已经通过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,而不是被保留为二进制文件。