当前位置:   article > 正文

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

使用 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

  1. package com.ghost.leapiclientsdk.client;
  2. import cn.hutool.core.util.RandomUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.HttpResponse;
  5. import cn.hutool.http.HttpUtil;
  6. import cn.hutool.json.JSONUtil;
  7. import com.ghost.leapiclientsdk.model.User;
  8. import com.ghost.leapiclientsdk.utils.SignUtil;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. /**
  12. * 调用第三方接口的客户端
  13. * @author 乐小鑫
  14. * @version 1.0
  15. * @Date 2024-02-01-20:28
  16. */
  17. public class LeAPIClient {
  18. private String accessKey;
  19. private String secretKey;
  20. public LeAPIClient(String accessKey, String secretKey) {
  21. this.accessKey = accessKey;
  22. this.secretKey = secretKey;
  23. }
  24. public String getNameByGet(String name) {
  25. //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
  26. HashMap<String, Object> paramMap = new HashMap<>();
  27. paramMap.put("name", name);
  28. String result = HttpUtil.get("http://localhost:8102/api/name/", paramMap);
  29. System.out.println(result);
  30. return result;
  31. }
  32. public String getNameByPost(String name) {
  33. HashMap<String, Object> paramMap = new HashMap<>();
  34. paramMap.put("name", name);
  35. String result = HttpUtil.post("http://localhost:8102/api/name/", paramMap);
  36. System.out.println(result);
  37. return result;
  38. }
  39. /**
  40. * 将参数添加到请求头 map
  41. * @return
  42. */
  43. private Map<String, String> headerMap(String body) {
  44. HashMap<String, String> hashMap = new HashMap<>();
  45. hashMap.put("accessKey", accessKey);
  46. // 一定不能发送给后端!
  47. // hashMap.put("secretKey", secretKey);
  48. hashMap.put("nonce", RandomUtil.randomNumbers(5));
  49. hashMap.put("body", body);
  50. hashMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
  51. hashMap.put("sign", SignUtil.genSign(body, secretKey));
  52. return hashMap;
  53. }
  54. public String getNameByJSON(User user) {
  55. String userStr = JSONUtil.toJsonStr(user);
  56. HttpResponse httpResponse = HttpRequest.post("http://localhost:8102/api/name/user")
  57. .addHeaders(headerMap(userStr))// 客户端在请求头中携带签名
  58. .body(userStr)
  59. .execute();
  60. System.out.println(httpResponse.getStatus());
  61. String body = httpResponse.body();
  62. System.out.println(body);
  63. return body;
  64. }
  65. }

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. 注入客户端实例

  1. @Resource
  2. private LeAPIClient leAPIClient;// 注入客户端实例

4. 调用接口

  1. package com.ghost.leapiinterface;
  2. import com.ghost.leapiclientsdk.client.LeAPIClient;
  3. import com.ghost.leapiclientsdk.model.User;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import javax.annotation.Resource;
  7. @SpringBootTest
  8. class LeapiInterfaceApplicationTests {
  9. @Resource
  10. private LeAPIClient leAPIClient;// 注入客户端实例
  11. @Test
  12. void testClientSDK() {
  13. // 调用接口
  14. String result = leAPIClient.getNameByGet("ghost");
  15. User user = new User();
  16. user.setUsername("xiaoxin");
  17. String nameByJSON = leAPIClient.getNameByJSON(user);
  18. System.out.println(result);
  19. System.out.println(nameByJSON);
  20. }
  21. }

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

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

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

2. 使用步骤

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

3. 示例

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57343
推荐阅读
相关标签
  

闽ICP备14008679号