【问题标题】:Getting URL Parameter from API Gateway in Lambda从 Lambda 中的 API 网关获取 URL 参数
【发布时间】:2016-03-23 01:41:10
【问题描述】:

我希望有人可以帮助我获取从 Lambda 中的 AWS API Gateway 传递的 URL 参数。

我有点困惑如何在 Lambda 代码中访问它。

对于 API 网关,我遵循了以下步骤:

1) 转到资源 -> 集成请求

2) 点击模板下拉菜单旁边的加号图标

3) 在内容类型字段中显式键入 application/json

4) 对于输入映射 Entered:

{ "apiToken": "$input.params('apiToken')" }

为了澄清,我如何在我的 Lambda 函数中访问参数 apiToken

我已经看了一段时间的演练和其他文档,我的大脑有点疲惫。

感谢所有帮助和反馈 :)

更新

所以,问题似乎是 AWS 网站 AJAX 保存没有保存我在映射中输入的内容(我在酒店 wifi 上,所以可能是这样)。

现在,当我测试它时,我得到:

Received event: { appToken: '123456' }

在 lambda 的控制台日志中。但是,当我去 API 网关,并 deploy 响应是:

"errorMessage": "进程在完成请求前退出"

有什么想法吗?

P.S 该函数在 Lambda 控制台中有效,但是,当我使用 Postman [POST + Param] 对其进行测试时,它不起作用,上面提供了错误消息

更新 2

这是我的整个 Lambda 函数

    console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var http = require('http');

exports.handler = function(event, context) {



    var tableName = "clients";

    var appToken = event.params.appToken; //gr5f4sgnca25hki98
    dynamodb.getItem({
        TableName: tableName,
        Key: {
            ClientID: { S: appToken } }

    }, function (err, data)
{
    if (err) {
       context.done(err);
    } else {
        var url = data.Item.url.S + data.Item.api.S;
        console.log(url);
        console.log('Received event:', event.params.appToken);
        http.get(url, function(res) {
            // Continuously update stream with data
            var body = '';
            res.on('data', function(d) {
                body += d;
            });
            res.on('end', function() {
                var result = body.replace('\\', '');
                context.succeed(JSON.parse(result));
            });
            res.on('error', function(e) {
                context.fail("Got error: " + e.message);
            });
        });
    }
    });
};

在我的测试活动中,我有:

{
    "method": "POST",
    "params": {
        "appToken": "gr5f4sgnca25hki98"
    }
}

当我在 Lambda 中运行它时,响应会起作用,它会连接到外部 JSON 文件并返回它。

但是,在 Postman 中我收到错误:

"errorMessage": "进程在完成请求前退出"

任何人都可以看到为什么在控制台中一切正常,而当我在部署中尝试它时仍然出现错误?

当我打开 XCODE 并使用 Alamofire 测试此网址时,我收到此错误(如果有帮助)

字符 72 周围的序列无效

更新 3(从 API 控制台测试)

从 API 控制台测试时,使用:

 {
"method": "POST",
"params": {
    "appToken": "gr5f4sgnca25hki98"
}
}

在请求正文中。我明白了:

请求:/sendtoclient

状态:200

延迟:1839 毫秒

响应正文

{ "errorMessage": "进程在完成请求前退出" }

响应标头

{"Content-Type":"application/json"}

日志

Execution log for request test-request
Tue Mar 22 17:28:27 UTC 2016 : Starting execution for request:    test-invoke-request
Tue Mar 22 17:28:27 UTC 2016 : HTTP Method: POST, Resource      Path: /sendtoclient
Tue Mar 22 17:28:27 UTC 2016 : Method request path: {}
Tue Mar 22 17:28:27 UTC 2016 : Method request query string:     {}
Tue Mar 22 17:28:27 UTC 2016 : Method request headers: {}
Tue Mar 22 17:28:27 UTC 2016 : Method request body before  transformations: {
"method": "POST",
"params": {
    "appToken": "gr5f4sgnca25hki98"
}
}
Tue Mar 22 17:28:27 UTC 2016 : Endpoint request body after transformations: { "appToken": "" }
Tue Mar 22 17:28:29 UTC 2016 : Endpoint response body before transformations: {"errorMessage":"Process exited before completing request"}
Tue Mar 22 17:28:29 UTC 2016 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=123456789, Connection=keep-alive, Content-Length=59, X-Amz-Function-Error=Unhandled, Date=Tue, 22 Mar 2016 17:28:29   GMT, Content-Type=application/json}
Tue Mar 22 17:28:29 UTC 2016 : Method response body after transformations: {"errorMessage":"Process exited before completing request"}
Tue Mar 22 17:28:29 UTC 2016 : Method response headers: {Content-Type=application/json}
Tue Mar 22 17:28:29 UTC 2016 : Successfully completed execution
Tue Mar 22 17:28:29 UTC 2016 : Method completed with status: 200

我不确定如何破译这个。任何帮助将不胜感激。但是我注意到了这一点:

 Endpoint request body after transformations: { "appToken": "" }

出于某种原因,我觉得这可能很重要

【问题讨论】:

  • 将此添加到您的 Lambda 函数中(在大多数示例中已经存在)console.log('Received event:', JSON.stringify(event, null, 2)); 然后事件对象应该很好地打印在您的日志中,您将能够看到所有可用的属性供您在代码中访问。
  • 这给了我输出:Received event: {} 当我测试 lambda 函数时
  • 那你没有正确映射到 API Gateway。
  • 我发布了绘制它的步骤。你能看出我做错了什么吗?
  • p.s 我在您的个人资料中看到您已获得 AWS 认证 - 感谢您帮助我,非常感谢。

标签: amazon-web-services lambda url-parameters aws-lambda


【解决方案1】:

您应该根据您给我们的映射在您的函数中使用“event.apiToken”。 {apiToken} 在您的资源名称中,对吗?

【讨论】:

  • 您是指网关资源吗?不,apiToken 是参数。它在 lambda 控制台中工作,这样对吗?当我更改您的编辑时,我得到:一个或多个参数值无效:一个 AttributeValue 可能不包含空字符串。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 2022-07-23
  • 2016-08-10
  • 2020-11-05
  • 1970-01-01
  • 2022-07-10
  • 2016-02-07
相关资源
最近更新 更多