低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

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

2019 年 10 月 09 日

与 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/


2019 年 10 月 09 日 14:42572
用户头像

发布了 1249 篇内容, 共 33.1 次阅读, 收获喜欢 34 次。

关注

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

评论 2 条评论

发布
用户头像
「AWS Lambda 无服务器应用程序初探」图文详解 AWS Lambda。集成 API Gateway 从而接收参数,数据写入到 Amazon DynamoDB,代码示例。 https://youzhi.dev/articles/3/aws-lambda-no-servers
2020 年 01 月 11 日 23:07
回复
没有更多了
发现更多内容

IM聊天教程:发送图片/视频/语音/表情

GoEasy消息推送

websocket 即时通讯 聊天室 聊天

如何学 Java,我说点不太一样的学习方式

四猿外

学习 程序员 个人成长 程序员成长

架构师训练营第四周课后作业

竹森先生

极客时间 极客大学架构师训练营

创新管理体系标准ISO56002介绍

涛哥

数字化转型 创新

深入浅出kubernetes之WorkQueue详解

博文视点Broadview

Kubernetes 源码分析 k8s 队列 延迟队列

海阅优品致力打造新零售蓝海

Geek_116789

MySQL实战45讲笔记(1)

程序员老王

msyql

架构师训练营第四周作业

张明森

SpringBatch系列之Remote-Chunking

稻草鸟人

大数据 Spring Boot SpringBatch 批量任务

架构师训练营第四周学习总结

张明森

从0开始设计Flutter独立APP | 第二篇: 完整的国际化语言支持

渔子长

flutter 前端

计算机操作系统基础(五)---Linux的进程管理

书旅

php 线程 多线程 操作系统 进程

极客大学架构师训练营第四周学习总结

竹森先生

极客大学 极客大学架构师训练营

Dart vs Swift

柠檬水

swift dart

聊一聊程序员如何增加收入

张小方

程序员 互联网 面试 副业赚钱 薪资

谈谈架构和微服务<一>

Gabriel

架构 微服务 微服务架构 领域驱动设计 软件设计

架构演化

满山李子

对直播带货的一点思考

Neco.W

直播 直播带货

来了!8M/S+速度,Pdown复活!

程序员生活志

一二线城市知名 IT 互联网公司名单(新版)

程序员生活志

互联网 IT 大厂

如何成为一名合格的 C/C++ 开发者?

张小方

c++ Linux 编程语言 架构设计 后端开发

实现简单的"纤程"

Near

架构师训练营第 4 周——学习总结

在野

极客大学架构师训练营

深入理解Kubernetes的Service:回归本源的场景需求

韩超

Kubernetes 微服务 服务

【写作群星榜】6.20~6.26 写作平台优秀作者 & 文章排名

InfoQ写作平台官方

写作平台 排行榜

融云年中大促钜惠来袭 IM+RTC 超值套餐最低6折起

Geek_116789

了不起的 TypeScript 入门教程 [1.2 w字]

阿宝哥

Java typescript 前端 Web

MySQL系列 - SQL查询与修改执行过程

俊俊哥

MySQL 性能优化 关系型数据库 存储

告别静默式看房 融云音视频助力上海中原 App 上线 VR 带看服务

Geek_116789

大型互联网架构与集群技术

cxy

嗨,兄弟,别担心,这年头谁还没有一点焦虑!

攀鱼飞岩

管理 程序员人生 成长 个人感想 程序员素养

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

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