使用apigateway呼叫外部api

时间:2017-09-25 13:19:07

标签: amazon-web-services aws-lambda aws-api-gateway

我正在node.js中编写一个lambda,它将调用api(post)并返回生成的主体,代码如下所示。

const AWS = require('aws-sdk');
const request = require('request');

exports.handle = function(e, ctx, callback) {
    var bodyDetails = {
        uri: "myURL",
        json: {
            "requestChannel": "web1" },
        "method": "POST"
    };

    callback = ctx.done;
    var data = e.bodyJson || {};
    request(bodyDetails, function(error, response, body) {
        if (!error && response.statusCode === 200) {
            console.log(JSON.parse(JSON.stringify(body)));
            jsonBody = JSON.parse(JSON.stringify(body));
            console.log(body + "\t from suvccess") // Print the json response
            callback(null, jsonBody); // Return the JSON object back to our API call
        } else {
            callback(error);
        }
    });
}

我正在我的lambda控制台中测试它。通过传递一个空白的json {},我得到了正确的回复。

现在我的下一个计划是将此部分与API Gateway集成。所以我在我的apigateway中为此创建了一个api,并且我创建了一个名为home的资源。在家里,我创建了一个GET方法。以下详细信息。

Integration type: Lambda Function
Use Lambda Proxy integration : checked
Lambda Region: us-east-1 
Lambda Function: myWorkingLambdaName

当我使用apigateway提供的test选项进行测试时。我得到了回复

Request: /home
Status: 502
Latency: 2942 ms
Response Body
{
  "message": "Internal server error"
}

当我看到我的控制台时,我看到打印成功块的值,但状态码是502.这非常令人困惑,请告诉我哪里出错了,我该如何解决这个问题。

由于

1 个答案:

答案 0 :(得分:3)

API Gateway期望从Lambda返回以下属性:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

因此,您应该像callback(null, jsonBody)一样调用callback而不是callback(null, { isBase64Encoded: false, statusCode: 200, headers: { "Access-Control-Allow-Origin" : "*", }, body: JSON.stringify(jsonBody), })

"87987987 / 78979878978"