亚马逊AWS官方博客

Amazon Cognito 集成微信登录部署系列(三)与 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之前曾长期从事互联网应用开发,先后在新浪、唯品会等公司担任架构师、技术总监等职位。对跨平台多终端的互联网应用架构和方案有深入的研究。