西班牙
斯潘4
你好,
我有一些json get请求工作在aws api网关和fme后端,这要感谢@GerhardAt亚搏在线Safe和@stewartharperYouTube视频和Github回购。下一步是提供压缩文件。工作台流式传输一个小的zip文件,我现在正试图通过aws api网关来实现这一点。我为内容类型添加了application/zip,并获得了支持application/zip二进制文件的网关。当我尝试调用时,虽然我只得到一个空的zip文件—尽管fme作业确实成功运行并创建了一个文件。
我怀疑这是因为身体映射不正确。这里有一些图片信息:
https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/
有人知道我应该在集成响应的主体映射模板中放置什么吗?
非常感谢,
奥利弗
对于处于类似情况下的其他人-您希望返回一个zip文件/图像除了json之外的任何东西都是您需要做的。
首先,lambda不允许您直接从fme进行流式处理,因为它试图将数据分块,然后api网关无法将其正确放回,因此当它编码为二进制时,它会失败(大多数情况下)。所以我找到的工作基本上是将它保存到s3中的任何文件,然后在lambda中提取并发送到api网关。
lambda代码需要更改为:
console.log(“lambda函数工作”);var aws=需要(“aws sdk”);var https=需要('https');var querystring=需要('querystring');变量主机='xxx';var路径='/fmedatastreaming/apirepository/';变量s3key='xx';变量s3secretkey='xx';var isjson=false;var iszip=假;var makerequesttofme=函数(httpmethod,event,callback){var qs=querystring.stringify(event.params.querystring);var token=querystring.stringify(事件[“阶段变量”]);无功状态码;分析变量;变量Fmeresponse='';变量parsedResponse;var options={主机名:主机,端口:443,路径:路径+事件。工作区+'?'+qs+“&”+令牌,超时:20000,方法:httpmethod};console.log(“选项”,options);var req=https.request(选项,函数(响应){response.on('error',函数(d){console.log(“fme error”,d);if(callback){callback({statuscode:response.statuscode});}};response.on('data',函数(returndata){console.log(“headers”,response.headers);if(response.headers['content-type']=='application/json'){isjson=true;Fmeresponse+=返回数据;}if(response.headers['content-type']=='application/zip'){iszip=true;Fmeresponse+=返回数据;}};response.on('end',函数(d){console.log('fme response end',fmereponse);parsed=json.parse(fmeresponse);如果(解析!=空&&(已分析。状态!==未定义和分析。文件名!==未定义){iszip=true;}if(iszip){if(fmereponse==''){if(callback){回调({正文:{“状态”:response.statuscode,“消息”:response.status message},状态码:response.statuscode,状态消息:response.statusmessage});}else{console.log('fme response end',fmereponse);parsed=json.parse(fmeresponse);if(callback){callback({body:parsed.filename,statuscode:parsed.status,statusmessage:'reply from fme'+parsed.status});}}}else if(isjson){parsed=json.parse(fmereponse);if(parsed.status){//use status code defined in json statuscode=parsed.status;}否则{//默认为请求status code=response.statuscode返回的http状态码;}if(callback){回调({body:parsed,statuscode:statuscode,statusmessage:response.statusmessage});}}};log(“结束makefmerequest”,响应);返回响应;});console.log(“请求消失”);请求结束();};exports.handler=(event,context,callback)=>{尝试{var http method=event.context[“http方法”];makerequesttofme(httpmethod,event,function(response){console.log('makefmerequest done',response);如果(回应。身体!=null&&response.statuscode=='ok'){var s3=new aws.s3({region:“us-east-1”,accesskeyid:s3key,secretaccesskey:s3secretkey});s3.getobject({bucket:'xxxxx',key:'download/'+response.body},函数(err,data){if(err){console.log(“s3”,err);回拨(err);}其他{console.log(“zip”,data.body);回调(空,data.body.tostring('base64'));}};}else{console.log('上下文失败',响应);返回context.fail(json.stringify(response.body));}};}catch(e){console.log('try catch',e);上下文失败(e);}};
在api网关中,在settings和binary media types下添加mime类型。应用程序/zip
然后在方法响应中添加内容类型
在集成响应中,将其拉入二进制并更新头映射,如下所示
然后,当发出curl请求时,比如postman,请确保以内容类型/应用程序zip的形式请求头中的数据。
我希望这能帮助一些人,aws网关和lambda集成是一个相当棘手的部分,fme是最简单的一点。
干杯
奥利弗
现在看来lambda函数是拦截器,它当前仅配置为发送json内容,而不是二进制内容。我们已经对这个函数做了一些修改,但是目前它还不能工作,直接在lambda中调试是一个非常棘手的问题。
代码如下,但理想情况下,如果有任何测试,直接在lamba看看哪里是错误的,但我们还没有制定出什么我们需要通过测试。
欢迎提出任何建议,谢谢
console.log('加载函数');var https=需要('https');var querystring=需要('querystring');变量主机='[xx].fmecloud.com';var路径='/fmedatastreaming/apirepository/';var datazipobj=false;/**处理对fme cloud的http请求。*/var makehttprequest=函数(httpmethod,event,callback){var datajsonobj='';var qs=querystring.stringify(event.params.querystring)var path=querystring.stringify(event.params.path);无功状态码;分析变量;var options={主机名:主机,端口:443,路径:路径+事件。工作区+'?'+qs+“&”+路径,方法:httpmethod};var req=https.request(options,function(response){//如果ajax请求未能响应,则触发错误响应。on('error',function(d){console.log(“error”);if(callback){callback({statuscode:response.statuscode});}};//数据传入时填充json对象。response.on('data',函数(d){if(response.headers['content-type']=='application/json'){datajsonobj+=d;}if(response.headers['content-type']=='application/zip'){datazipobj=true;}};//用json响应和状态代码填充回调对象。response.on('end',function(d){//检查请求if是否返回任何数据(datajsonobj==>&&datazipobj===false){if(callback){callback({body:{“status”:response.statuscode,“message”:response.statusmessage},statuscode:response.statuscode,statusmessage:response.statusmessage});}else if(datazipobj){parsed=d;if(parsed.status){//use status code defined in json statuscode=parsed.status;}}否则{//json在请求进程中返回。parsed=json.parse(datajsonobj);//fme可以返回200http状态,但会返回一个警告错误,这//将用fme的json中的状态代码//覆盖请求对象上的状态代码。if(parsed.status){//use status code defined in json statuscode=parsed.status;}否则{//默认为请求status code=response.statuscode返回的http状态码;}if(callback){回调({body:parsed,statuscode:statuscode,statusmessage:response.statusmessage});}}};返回响应;});请求结束();};由API网关调用的处理程序。* /出口。handler = function(event, context) { try { var httpMethod = event.context["http-method"];makeHttpRequest(httpMethod, event, function (response) {if (!dataZIPObj) return context.fail(JSON.stringify(response.body));否则返回response.body;});} catch (e) {context.fail(e);}};
?2019安全亚搏在线软件公司|合法的