当前位置: 首页 > news >正文

使用 IDEA 开发一个简单易用的 SDK

目录

一、什么是 SDK

二、为什么要开发 SDK

三、开发 SDK 的详细步骤

四、导入 SDK 进行测试

附:@ConfigurationProperties 注解的介绍及使用


一、什么是 SDK

1. 定义:软件开发工具包 Software Development Kit

2. 用于开发特定软件或应用程序的工具、库、文档和示例代码的集合

二、为什么要开发 SDK

1. 便于集成和使用:编写 SDK,为其他开发者提供一种简化的方式来使用我们提供的功能或服务;开发者只需要填写简单的配置信息,即可创建客户端,调用我们提供的 API 进行操作,而不用关心具体实现

2. 加速开发过程:通过提供 SDK,其他开发者可以直接使用我们预先封装好的功能和接口,而无需从头开始编写相关代码

例如:我们编写好了 API 签名认证的功能,其中客户端需要设置请求头,服务端需要取出请求头中的数据进行校验,通过签名生成算法来校验签名 sign 是否一致以判断用户的权限,操作繁杂。如果其他开发者引入我们编写的 SDK,就不需要重复编写上面的实现代码,直接填写配置创建客户端就可以直接调用现成的接口来进行 API 签名认证了!

3. 提供示例和文档:SDK 通常附带有详细的文档和示例代码,文档可以提供清晰的说明、API 参考和最佳实践等,示例代码则可以展示如何正确地使用 SDK 中提供的功能

4. 开放共享和合作:其他开发者可以在我们提供的 SDK 的基础上进行二次开发和定制化

5. 功能代码复用:如果其他项目需要使用(API 签名认证功能),直接导入之前写好的 SDK / starter,就可以直接使用咯

三、开发 SDK 的详细步骤

1. 新建 SpringBoot 项目,引入依赖

  • Lombok
  • Spring Configuration Processor:在 application.yml 中填写配置时自动补全、提示代码 / 配置项

2. 修改 pom.yml 文件中的版本号和依赖

  • 修改版本号:自己开发的 starter 的版本号

  • 删除 <build></build> 中的内容:build 中是 Maven 构建依赖的方式,不删除会构建为 jar 包,开发 SDK 是要构建依赖包而不是 jar 包,直接删除 build 中的内容

3. 删除项目主类,创建自己 SDK 的客户端配置主类,并添加注解

创建配置类,在引入依赖时自动生成客户端实例

  • @Configuration
  • @ConfigurationProperties("leapi.client"):读取配置项,自动映射
  • @ComponentScan
  • @Data

4.定义客户端 LeAPIClient 以及添加客户端所需的依赖 Hutool

package com.ghost.leapiclientsdk.client;import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.ghost.leapiclientsdk.model.User;
import com.ghost.leapiclientsdk.utils.SignUtil;import java.util.HashMap;
import java.util.Map;/*** 调用第三方接口的客户端* @author 乐小鑫* @version 1.0* @Date 2024-02-01-20:28*/
public class LeAPIClient {private String accessKey;private String secretKey;public LeAPIClient(String accessKey, String secretKey) {this.accessKey = accessKey;this.secretKey = secretKey;}public String getNameByGet(String name) {//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("name", name);String result = HttpUtil.get("http://localhost:8102/api/name/", paramMap);System.out.println(result);return result;}public String getNameByPost(String name) {HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("name", name);String result = HttpUtil.post("http://localhost:8102/api/name/", paramMap);System.out.println(result);return result;}/*** 将参数添加到请求头 map* @return*/private Map<String, String> headerMap(String body) {HashMap<String, String> hashMap = new HashMap<>();hashMap.put("accessKey", accessKey);// 一定不能发送给后端!
//        hashMap.put("secretKey", secretKey);hashMap.put("nonce", RandomUtil.randomNumbers(5));hashMap.put("body", body);hashMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));hashMap.put("sign", SignUtil.genSign(body, secretKey));return hashMap;}public String getNameByJSON(User user) {String userStr = JSONUtil.toJsonStr(user);HttpResponse httpResponse = HttpRequest.post("http://localhost:8102/api/name/user").addHeaders(headerMap(userStr))// 客户端在请求头中携带签名.body(userStr).execute();System.out.println(httpResponse.getStatus());String body = httpResponse.body();System.out.println(body);return body;}}

5. 定义生成客户端的 Bean,读取配置文件 application.yml 中的配置项为 Java 对象 / 属性(accessKey 和 secretKey)赋值

  • @Bean:让 Spring 自动加载客户端,管理 Bean

6. 指定加载配置类

  • 创建 META-INF/spring.factories

7. 完成后 install 安装项目到本地 Maven 仓库,SDK 编写完成✔

四、导入 SDK 进行测试

1. 在 pom.xml 中引入 SDK / starter

  • 我们自己编写的 SDK

  • 在其他项目中导入 SDK 

2. 在项目的 application.yml 中编写配置(因为 SDK 引入了 Spring Configuration Processor,所以会有提示)

自动生成配置项提示的原理:Spring Configuration Processor 生成的

3. 注入客户端实例

    @Resourceprivate LeAPIClient leAPIClient;// 注入客户端实例

4. 调用接口

package com.ghost.leapiinterface;import com.ghost.leapiclientsdk.client.LeAPIClient;
import com.ghost.leapiclientsdk.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;@SpringBootTest
class LeapiInterfaceApplicationTests {@Resourceprivate LeAPIClient leAPIClient;// 注入客户端实例@Testvoid testClientSDK() {// 调用接口String result = leAPIClient.getNameByGet("ghost");User user = new User();user.setUsername("xiaoxin");String nameByJSON = leAPIClient.getNameByJSON(user);System.out.println(result);System.out.println(nameByJSON);}
}

5. 测试效果:编写测试类,注入客户端,使用客户端调用接口,测试成功✔

附:@ConfigurationProperties 注解的介绍及使用

1. 作用:将配置文件中的属性值与Java类进行绑定。它的作用是将配置文件中的属性值映射到对应的Java对象中,方便在代码中直接使用这些属性值

2. 使用步骤

  • 在需要绑定属性的 Java 类上添加 @ConfigurationProperties 注解。
  • 可以通过 prefix 属性指定要绑定的属性的前缀,也可以通过 value 属性指定具体的属性名。
  • 定义对应的属性字段,并提供 setter 和 getter 方法。
  • 在 application.properties 或 application.yml 配置文件中设置相应的属性值。

3. 示例

@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {private String name;private int age;// getters and setters}
  • 配置文件
myapp.name=My Application
myapp.age=20

上述示例中,使用 @ConfigurationProperties(prefix = "myapp") 将配置文件中以 myapp 为前缀的属性值与 MyAppConfig 类中的属性进行绑定。属性 name 和 age 将分别被赋予配置文件中的属性值

相关文章:

  • SSRF漏洞给云服务元数据带来的安全威胁
  • 【实训】网络规划与部署实训
  • ElasticSearch-SpringBoot整合ElasticSearch
  • Stable Diffusion 模型下载:国风4 GuoFeng4 XL
  • kafka-splunk数据通路实践
  • Springboot+vue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目
  • 【Linux系统 01】Vim工具
  • 为什么高防CDN可以防御DDOS攻击?
  • 亚信安全助力宁夏首个人工智能数据中心建成 铺设绿色算力安全底座
  • 算法学习——LeetCode力扣链表篇1
  • 第八届:世界3D渲染挑战赛《无尽阶梯》正式开启
  • 2024.02.05
  • 亚马逊新店铺视频怎么上传?视频验证失败怎么办?——站斧浏览器
  • EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)
  • XGB-3: 模型IO
  • 时间复杂度分析经典问题——最大子序列和
  • 230. Kth Smallest Element in a BST
  • Angular6错误 Service: No provider for Renderer2
  • java 多线程基础, 我觉得还是有必要看看的
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • node.js
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vagrant 添加本地 box 安装 laravel homestead
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • webpack4 一点通
  • 记一次和乔布斯合作最难忘的经历
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 日剧·日综资源集合(建议收藏)
  • 如何在 Tornado 中实现 Middleware
  • 系统认识JavaScript正则表达式
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 交换综合实验一
  • ​业务双活的数据切换思路设计(下)
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (10)ATF MMU转换表
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (南京观海微电子)——COF介绍
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)甲方乙方——赵民谈找工作
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ****Linux下Mysql的安装和配置
  • ./configure,make,make install的作用(转)
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core WebAPI中封装Swagger配置
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net(C#)中String.Format如何使用
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET设计模式(11):组合模式(Composite Pattern)