我正在使用以下代码尝试命中运行简单测试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函数作为登录验证,所以也让我知道我正在做的不是好的做法,而且还有更好的方法。谢谢!
答案 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,但这只是一个选项。