与 API Gateway 集成、处理输入参数、返回响应结果

阅读数:119 2019 年 10 月 9 日 14:42

与 API Gateway 集成、处理输入参数、返回响应结果

上一篇中我们介绍了 Eclipse 配置 Lambda 开发环境,使用 AWS Toolkit 开始动手开发 Java 的 Lambda 函数。在这一篇中,我们将继续为大家以代码介绍 Lambda 函数如何处理来自 API Gateway 的输入参数、响应给 API 的返回结果。

处理输入和输出

我们使用 API Gateway 配合 Lambda 函数这套经典的无服务器架构来实现 API 接口。我们知道客户端请求服务端 API 时传递来的参数,API Gateway 会以一个参数对象传递给 Lambda 函数。这个参数对象会传入我们的 Lambda 函数的 handleRequest 方法,对于 Java 语言的函数来说,就是一个包含键值对的 LinkedHashMap 对象。根据微信登录的流程,第一步需要传回后端 API 的参数只有 code 一个。所以我们的 Lambda 函数接收到的参数对象形如下面这样:

复制代码
{
"code":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

为了满足 Cognito 认证的需要,这个 API 接口的返回结果需要是以下格式。

复制代码
{
"identityId": "cn-north-1:12345678-1234-4ba8-a97f-19948a5e422a",
"userId": "12",
"status": "true",
"openIdToken": "LTExIiwidHlwIjoiSldTIiwiYWxnIjoiUleyJraWQiOiJ1cy1lYXN0"
}

我们先来继续写 Lambda 的代码,后面再配置 API Gateway。我们新建一个响应结果的类,CognitoWechatResponse.java。就是上述返回结果的一个对象。

复制代码
public class CognitoWechatResponse {
private String identityId;
private Integer userId = null;
private String openIdToken = null;
private String status = "false";
public String getIdentityId() {
return identityId;
}
public void setIdentityId(String identityId) {
this.identityId = identityId;
}
public Integer getUserId() { return userId; }
public void setUserId(Integer userId) { this.userId = userId; }
public String getOpenIdToken() { return openIdToken; }
public void setOpenIdToken(String openIdToken) { this.openIdToken = openIdToken; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
}

下面我们来配置 API Gateway 的 API,并集成前面已经创建的 Lambda 函数,再来处理一下输入参数和输出结果。

配置 API Gateway 的 API

创建 API
我们使用 API Gateway 配合 Lambda 函数这套经典的无服务器架构来实现 API 接口。这个演示例子中只需要一个后端 API 接口,我们在控制台如下配置:

https://console.amazonaws.cn/apigateway/home?region=cn-north-1

点击“创建 API”按钮。

Choose the protocol,保持默认的“REST”。

新建 API,选择“新建 API”。在设置部分,API 名称输入“CognitoWechat”,描述输入“Cognito 集成微信登录演示”。

点击“创建 API”按钮。

然后来到 API 管理界面,创建一个资源,资源名输入“loginwechat”,再给该资源创建一个 POST 方法。在接下来的集成环境先选择“Lambda 函数”,前篇我们把 Lambda 上传创建在由光环新网运营的 AWS 中国(北京)区域,所以这里 Lambda 区域选择“cn-north-1”。在 Lambda 函数格中输入我们已经创建好的函数名“CognitoWechat”。点击右下角的保存按钮,弹出提示“您将为 API Gateway 授予调用您的 Lambda 函数的权限”,点击确定即可。

配置输入输出的数据模型
我们根据前述的输入参数和输出结果,在 API 的模型里创建相应的 2 个模型。参考《为请求和响应映射创建模型和映射模板》。内容类型都是“application/json”。输入参数的模型名称是 AuthenticationRequestModel,模型架构是

复制代码
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "AuthenticationRequestModel",
"type": "object",
"properties": {
"code": {
"type": "string"
}
}
}

输出结果的模型名称是 AuthenticationResponseModel,模型架构是

复制代码
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "AuthenticationResponseModel",
"type": "object",
"properties":
{
"userId": { "type": "integer" },
"openIdToken": { "type": "string" },
"identityId": { "type": "string" },
"status": { "type": "string" }
}
}

把数据模型配置到 API 的请求和响应
在 /loginwechat – POST – 方法执行中点击方法请求,展开方法请求,点击“添加模型”。内容类型输入“application/json”,在模型名称的下拉菜单选择我们前面创建的 AuthenticationRequestModel,点击行尾的对勾图标保存。

在 / loginwechat – POST – 方法执行中点击方法响应,点击 HTTP 状态 200 前面的三角图标展开之,在“200 的响应正文”下的模型选择我们前面创建的 AuthenticationResponseModel,点击行尾的对勾图标保存。

Lambda 函数接收输入参数、返回模拟结果

我们知道客户端请求服务端 API 时传递来的参数,API Gateway 会以一个参数对象传递给 Lambda 函数。这个参数对象会传入我们的 Lambda 函数的 handleRequest 方法,对于 Java 语言的函数来说,就是一个包含键值对的 LinkedHashMap 对象。因此,我们在 Eclipse 中打开 CognitoWechat 类,把函数创建初始的代码改成以下这样。

复制代码
public class CognitoWechat implements RequestHandler<Object, Object> {
@Override
public CognitoWechatResponse handleRequest(Object input, Context context) {
context.getLogger().log("Input: " + input);
CognitoWechatResponse cwResponse = new CognitoWechatResponse();
@SuppressWarnings("unchecked")
LinkedHashMap<String, String> inputHashMap = (LinkedHashMap<String, String>)input;
String code = (String) inputHashMap.get("code");
// 从输入参数中提取出的 code 值,临时放到响应结果中的 OpenIdToken 字段
// 只为测试 API Gateway 和 Lambda 集成可以走通
cwResponse.setOpenIdToken(code);
return cwResponse;
}
}

这时,我们再测试运行 Lambda 函数,在工程右键菜单找到 Amazon Web Services,再点选 Run Function to AWS Lambda…。在弹出的运行对话框中,JSON 输入格现在可以填写模拟的输入参数了,比如

复制代码
{
"code":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

由于 Lambda 函数代码有更新,所以会重新上传,然后再执行,可以看到 Java 程序可以获取到输入参数,也成功输出和结果。

测试 API Gateway 中的 API

我们打开 API Gateway 中的 API 控制台,在 /loginwechat – POST – 方法执行下点击测试按钮。在方法测试界面,请求正文填写以下的模拟输入参数

复制代码
{
"code":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

点击测试按钮。可以看到响应结果都是正常的。

到此,我们的 Lambda 函数和 API 集成也已顺利调通。

小结

这一篇中我们介绍了创建 API Gateway 中的 API, Lambda 函数如何处理来自 API Gateway 的输入参数、响应给 API 的返回结果,以及实现 Lambda 函数和 API 的集成。在下一篇中,我们将具体实现对接微信开放平台验证微信用户的业务逻辑。

索引

Amazon Cognito 集成微信登录部署系列(一)Cognito 身份池、Dynamodb 表和创建 Lambda 函数
Amazon Cognito 集成微信登录部署系列(二)用 Lambda 开发服务端 API
Amazon Cognito 集成微信登录部署系列(三)与 API Gateway 集成、处理输入参数、返回响应结果
Amazon Cognito 集成微信登录部署系列(四)实现验证逻辑、发布 API
Amazon Cognito 集成微信登录部署系列(五)客户端集成 Cognito 验证

作者介绍:

薛峰
亚马逊 AWS 解决方案架构师,AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内和全球的应用和推广,在大规模并发应用架构、移动应用以及无服务器架构等方面有丰富的实践经验。在加入 AWS 之前曾长期从事互联网应用开发,先后在新浪、唯品会等公司担任架构师、技术总监等职位。对跨平台多终端的互联网应用架构和方案有深入的研究。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/amazon-cognito-wechat-deployment-3/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布