一、背景
在上一篇文章中:
跟我一起学开源设计第7节: 蓝兔支付平台SDK的封装与设计实现(上)
我们分享了目前正在开发的蓝兔支付平台的SDK中的几个设计点:
(1)、以Spring Boot Starter作为入口,自顶向下开发SDK的设计
(2)、一种通用的整合多种不同HTTP请求框架的抽象设计
(3)、SDK中的请求和响应模型的设计
本节继续分享,分享剩余的几个设计点,往往开发人员的设计经验是从无数个小的设计经验积累上提高的,如果想提高个人代码的设计能力,日常的刻意练习,还是非常有必要的。
目前蓝兔支付的SDK的开源地址为:
二、正文开始
2.1、SDK中的一个请求的真实链路
在SDK开源工程中,我提供了一个Demo工程,大家可以跟着Demo工程进行调试分析链路的请求过程,首页在客户端使用的时候,比如针对一个订单生成的请求,我们通过如下代码定义请求的入口:
看到这个客户端的使用代码是不是非常简单的,这就是SDK开发后的使用的效率,不到10行就可以创建一个支付的二维码图片。
我们定义好一个测试请求后,调用Service层的创建订单方法,代码如下所示:
这个代码首先会调用抽象请求中的checkAndSign方法进行参数的校验,和签名,这个思想可以值得我们学习,请求链路中的参数签名是一个安全类的接口必备的条件,大家一定要了解哦。
然后定义一个请求URL,然后将当前请求转换为请求的报文字符串,这里封装了一个toFormBody方法,该方法封装 的请求Body的字符串格式如下:
key1=value1&key2=value2
这个格式也是蓝兔支付提供的Open API中,请求参数的通用格式。然后调用Post方法进行请求发送,然后调用结果类进行相应数据转换和处理。
请大家牢记这个请求流程,这个是任何第三方SDK请求的一个标准化的设计流程:
接下来,我们关注下Post方法的设计,这个是核心,串联起上篇文章中的相关设计。代码如下:
post方法,内部构造了一个请求的执行器Executor对象,传递给了execute方法,execute方法先进行了一种外部嵌套,让他支持HTTP请求的错误重试,这个设计思路也是值得我们学习的,如果我们的SDK需要支持重试功能,就可以像它这样进行设计。继续看executeInternal方法,代码如下:
从代码中,可以看到,该方法最终会调用【请求执行器Executor】中的执行方法,此时就关联了我们上节文章中分享的HTTP请求框架的设计,最终就会执行到我们当前HTTP请求框架的的请求执行器的HTTP请求方法,在一定程度上完成了业务代码和HTTP请求框架的解耦设计。
2.2、SDK中设计模式
在当前SDK工程中,非常明显的用到了设计模式:策略模式、模板方法设计模式。这两个设计模式对于日常开发时非常重要的 ,它决定了你的代码是否简单,是否消除了IF/ELSE。
当前工程中定义了AbstractWxPayRequest类,作为请求的父类,各个不同的API请求,需要继承这个父类,同时根据各自真实的业务场景的需求,来实现相关方法,
在这个抽象类中:
提供了一个未实现的storeMap方法,这个在模板方法设计模式中极为重要,没有这种方法个人觉得,他可能就是一个策略模式,有了这种方法, 算是比较真实的模板方法设计模式,强制让子类进行实现,父类来通过流程去编排。抽象共性的代码设计实现。
对于SDK中的另外一个模板的设计,则是HTTP请求执行器的Executor的设计,默认提供了OKHTTP的请求设计,与GET方法和POST方法的设计,如果我们有的业务有自己的特殊的请求逻辑,则可以新增和重写相关方法,这块具体的设计思路的学习可以参考下wxjava项目的设计,对我们非常有帮助。
2.3、一个必填参数的校验设计
当前的SDK工程中,目前的版本也从wxjava上学习了一种基于注解的必填参数的请求校验,首先我们定义一个必填参数的注解:
然后,在请求Request对象上,进行使用:
然后在请求参数检查方法中,我们读取并进行判断处理:
这样通过反射,我们就获取到了所有字段,判断是否存在注解,然后进行处理。
到此为止,这个SDK的设计我们就基本分享完了,技术是需要刻意练习的,感兴趣的小伙伴可以自己练习开发哦。
三、总结
今天简单的分享了蓝兔支付平台的SDK的剩余的几个可以学习的设计,后续我们可能会开始分享第三方登录相关的开源学习了。也希望通过最近2篇文章的梳理,让大家都能学会如何设计一个SDK组件。希望让大家通过这个项目你可以学习到:
1、统一抽象的HTTP请求框架的设计与实现
2、多个模板方法模式、策略模式、建造者设计与实现
3、请求三方时的@Require注解校验设计与实现
4、错误重试的设计与实现
5、泛型的设计与实现
6、请求参数的签名的设计与实现
四、练习
1、感兴趣的可以基于苍穹外卖项目,集成下蓝兔支付SDK,练习下使用的效果哦。
苍穹外卖的资料和地址如下:
苍穹外卖是一个SpringBoot+SSM企业级项目实战,相比于瑞吉外卖苍穹外卖的业务更加真实完整,用户端改为微信小程序,登录改为了微信登录,加入了统计报表,来单提醒,客户催单,订单管理等功能,业务实现了闭环。技术选型更加丰富和实用。