如何将POST变量传递给运行lambda函数的AWS API网关?

时间:2018-02-06 15:31:34

标签: java amazon-web-services

我正在使用以下代码尝试命中运行简单测试lambda函数的aws api网关。

public class AWSTest {

public static void main(String[] args) {
    HttpClient client = HttpClientBuilder.create().build();
    HttpPost post = new HttpPost("AWS API GATEWAY LINK HERE");

    try {
        HttpResponse response = client.execute(post);

        String json = "{ \"key1\":\"username\", \"key2\":\"password\", \"key3\":\"value3\" }";

        List<NameValuePair> argys = new ArrayList<>();
        argys.add(new BasicNameValuePair("key1", "key1"));

        post.setEntity(new StringEntity(json));

        System.out.println(EntityUtils.toString(response.getEntity()));
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

我的Lambda函数如下:

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, 'Hello from ' + event.key1);
};

我收到的结果是:

"Hello from undefined"

命中lambda函数的API资源正在使用POST方法。没有API密钥或任何形式的身份验证,因为这只是一个测试。

将API网关的信息传递给Lambda函数的最佳方法是什么?我还打算将来使用这个Lambda函数作为登录验证,所以也让我知道我正在做的不是好的做法,而且还有更好的方法。谢谢!

1 个答案:

答案 0 :(得分:1)

执行所需操作的最佳方法是将API端点设置为lambda的代理。为此,它只需要两个步骤。

Fisrt,在API网关控制台中为您的资源创建POST方法时,在配置步骤中选择使用Lambda代理集成,您可以在其中选择方法将调用的lambda。 这将包装您的请求,然后以非常方便的格式将其发送到lambda,这将允许您的lambda不仅访问您的POST请求的主体,还包括URL,标题等中包含的所有信息 具体来说,格式为:

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {Incoming request headers}
    "queryStringParameters": {query string parameters }
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

您示例的json对象将包含在上面的包装器json的主体中。

其次,您只需修改lambda即可读取该对象。只需通过

访问身体即可
event.body

您可以在AWS文档here

中查看完整示例

关于您关于身份验证的第二个问题,通过API + Lambda实现它不会有任何问题。一切都取决于您如何实现身份验证。 Spring OAtuth可能是个不错的选择。您可以使用lambda生成访问令牌并通过API访问该lambda,但这只是一个选项。