只需尝试NodeJ和AWS Lambda。到目前为止,我设法使用Serverless来构建所有堆栈并创建网关和Lambda。现在,我正在努力进行一些简单的事情,调用一个外部API。
我尝试了一些代码,以及在Stackoverflow上找到的其他代码,但到目前为止,我都失败了,所有这些代码都向浏览器返回了一个内部服务器错误消息。这些是我认为得到最接近结果的代码:
代码示例1:
import { Handler, Context, Callback } from 'aws-lambda';
import http from 'https';
const regioes: Handler = (event: any, context: Context, callback: Callback) => {
var url: string = 'https://servicodados.ibge.gov.br/api/v1/localidades/regioes';
https.get(url, function(res) {
var data = '';
res.on('data', (chunk) => { data += chunk; });
res.on('end', () => { console.log("BODY: " + data); });
}).on('error', (e) => { console.log("Got error: " + e.message);});
};
export {regioes}
代码示例2:
import { Handler, Context, Callback } from 'aws-lambda';
import http from 'https';
const regioes: Handler = (event: any, context: Context, callback: Callback) => {
var url: string = 'https://servicodados.ibge.gov.br/api/v1/localidades/regioes';
let body: any;
let response: httpResponse = {
statusCode: 200,
body: JSON.stringify({
message:'Variavel response inicializada', test: 'i am a text'
}),
isBase64Encoded: false
};
console.log('resposta padrao', response);
var reqOptions: https.RequestOptions = {
host: 'servicodados.ibge.gov.br',
path: '/api/v1/localidades/regioes',
method: 'GET'
}
var req = https.request(reqOptions, res => {
console.log("statusCode: ", res.statusCode);
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', () => {
response = {
statusCode: 200,
body: JSON.stringify({message: 'test'}),
isBase64Encoded: false
};
});
}).on('error', (err) => {
console.log(err);
response = {
statusCode: 500,
body: JSON.stringify ({ message: err.message}),
isBase64Encoded: false
}
});
req.end();
callback(null, response);
};
export {regioes}
我知道代码示例1缺少主体的返回,没有在其中添加它,因为我试图检查CloudWatch上的返回是否有任何不同,两者都相同,没有错误,但是都没有我添加的控制台日志消息。
如果您在我的代码上调用端点,您会注意到它将返回一个简单的json,无需身份验证,它是一个公共API,我在Java项目中使用了它。
更新
这是运行API网关测试的输出:
将请求发送到:忽略
UTC 2019年7月22日星期一14:45:20:收到回复。状态:200,集成延迟:6038毫秒
UTC 2019年7月22日星期一14:45:20:端点响应标头:{Date = Mon,2019年7月22日14:45:20 GMT,Content-Type = application / json,Content-Length = 114,Connection = keep -alive,x-amzn-RequestId = 7f9e2441-c4e7-418b-a6ec-e4c667950f91,X-Amz-Function-Error =未处理,x-amzn-Remapped-Content-Length = 0,X-Amz-Executed-Version = $最新,X-Amzn-Trace-Id = root = 1-1d25cbfa-a01e77f34a16ab0779d6a7d7; sampled = 0}
UTC 2019年7月22日星期一14:45:20:转换之前的端点响应正文:{“ errorMessage”:“ 2019-07-22T14:45:20.245Z 7f9c2441-c4e7-419b-a6ec-g4c776950f91任务在6.01之后超时秒”}
UTC 2019年7月22日14:45:20:由于客户功能错误,Lambda执行失败,状态为200:2019-07-22T14:45:20.245Z 7f9c2441-c4e7-419b-a6ec-g4c776950f91 6.01之后任务超时秒。 Lambda请求ID:7f9c2441-c4e7-419b-a6ec-g4c776950f91
2019年7月22日星期一14:45:20 UTC:方法已完成,状态为502
有人可以指出我的错误在哪里吗?
答案 0 :(得分:0)
我想您正在使用代理集成。您将需要对响应对象的body
属性进行字符串化。 See the docs
通过Lambda代理集成,Lambda函数必须返回 以下格式的输出:
{
statusCode: "...", // a valid HTTP status code
headers: {
custom-header: "..." // any API-specific custom header
},
body: "...", // a JSON string.
isBase64Encoded: true|false // for binary support
}