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

news2024/11/16 5:57:57

目录

一、什么是 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. 注入客户端实例

    @Resource
    private 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 {

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

    @Test
    void 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 将分别被赋予配置文件中的属性值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1429416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据应用开发3-Scala笔记1

一、编程框架 Scala语言是在JVM上运行的&#xff0c;兼容Java语法 区分大小写 - Scala是大小写敏感的&#xff0c;这意味着标识Hello 和 hello在Scala中会有不同的含义。 类名 - 对于所有的类名的第一个字母要大写。 如果需要使用几个单词来构成一个类的名称&#xff0c;每个…

单片机学习笔记---定时器/计数器(简述版!)

目录 定时器的介绍 定时计数器的定时原理 定时计数器的内部结构 两种控制寄存器 &#xff08;1&#xff09;工作方式寄存器TMOD &#xff08;2&#xff09;控制寄存器TCON 定时计数器的工作方式 方式0 方式1 方式2 方式3 定时器的配置步骤 第一步&#xff0c;对…

嵌入式软件中常见的 8 种数据结构

数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算机科学和软件工程的基础。当…

el-table点击某一行选中改变背景色且执行方法

elementUI table表格点击某一行选中并且改变背景色 使用:row-style"rowStyle"及row-click“selectRow”&#xff1a; 其中 selectRow 方法中&#xff1a; row 输出&#xff1a;当前行的内容 column 输出&#xff1a;当前列的信息 event 输出&#xff1a;当前事件 …

四、Redis之配置文件

redis配置文件的名称 redis.conf 通过命令 find / -name redis.confvim redis.conf通过 : set nu 设置行号: set nonu 取消行号/关键字 搜索关键字: set noh 取消高亮选择4.1 Units 配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持 bytes&#…

springBoot静态资源文件夹以及文件夹之间的优先级

1、springBoot静态资源文件夹&#xff0c;系统默认路径&#xff0c;优先级由大到小 classpath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/ 比如当static文件夹中和public文件夹中都存在a.html 浏览器访问localhost:8080/a.html将访问…

JS高级(二)-深入对象、内置构造函数、综合案例

文章目录 1.深入对象1.1创建对象的三种方式1.2构造函数1.3实例成员1.4静态成员 2.内置构造函数2.1 Object2.2 Array2.3显示赠品案例2.4包装类型2.4.1 String2.4.2 Number 3.综合案例——购物车展示 1.深入对象 了解面向对象的基础概念&#xff0c;能够利用构造函数创建对象。 1…

【TCP】四次挥手(终止连接)

前言 TCP&#xff08;传输控制协议&#xff09;是互联网协议&#xff08;IP&#xff09;中的一种重要传输层协议&#xff0c;用于在通信的计算机之间建立可靠的、有序的和错误校验的数据传输。在TCP连接中&#xff0c;数据传输是双向的&#xff0c;因此需要一种机制来开始和结…

2024美赛数学建模A题思路分析 - 资源可用性和性别比例(2)

# 1 赛题 问题A&#xff1a;资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。…

基于SSM的健身房会员管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的健身房会员管理系统(有报告)。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis J…

网络原理TCP/IP(1)

文章目录 端口号UDP协议 在网络通信中&#xff0c;协议非常重要 协议进行了分层 应用层就是对应着应用程序&#xff0c;是程序员打交道最多的这一层&#xff0c;调用系统提供的网络api写出来的代码都是属于应用层的 应用层有很多现成的协议&#xff0c;但是更多的还是程序员需要…

【Spark系列6】如何做SQL查询优化和执行计划分析

Apache Spark SQL 使用 Catalyst 优化器来生成逻辑执行计划和物理执行计划。逻辑执行计划描述了逻辑上如何执行查询&#xff0c;而物理执行计划则是 Spark 实际执行的步骤。 一、查询优化 示例 1&#xff1a;过滤提前 未优化的查询 val salesData spark.read.parquet(&quo…

STM32GPIO输入(按键控制LED、光敏电阻控制蜂鸣器实例)

文章目录 一、介绍传感器模块介绍硬件电路c语言数据类型 二、实例按键控制LED接线图代码实现 光敏电阻控制蜂鸣器组装线路代码实现 相关函数解释 一、介绍 传感器模块介绍 硬件电路 上两种按下时为0&#xff0c;下两种按下时为1。 c语言数据类型 现在常用stdint头文件所定…

【Java程序设计】【C00187】基于SSM的旅游资源网站管理系统(论文+PPT)

基于SSM的旅游资源网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游资源网站 本系统分为前台系统、用户和管理员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是…

一文掌握单基因GSEA富集分析 | gseaGO and gseaKEGG

本期教程 本期教程原文&#xff1a;一文掌握单基因GSEA富集分析 | gseaGO and gseaKEGG 写在前面 关于GSEA分析&#xff0c;我们在前期的教程单基因GSEA富集分析 | 20220404有出过类似的分享。今天&#xff0c;我们也结合相关的资源整理出一篇关于GSEA的教程及出图教程。每个…

mysql 锁知识汇总

目录 一、锁1.1 什么是锁&#xff1f;1.2 全局锁1.2.1 定义1.2.2 应用场景1.2.3 会出现的问题1.2.4 解决方法 1.3 表级锁1.3.1 表锁1.3.2 元数据锁&#xff08;MDL&#xff09;1.3.3 意向锁1.3.4 AUTO-INC锁 1.4 行级锁1.4.1 记录锁(Record Lock)1.4.2 间隙锁(Gap Lock)1.4.3 N…

字符下标计数

下标计数 数组计数&#xff0c;即通过使用一个新的数组&#xff0c;对原来数组里面的项进行计数&#xff0c;统计原来数组中各项出现的次数&#xff0c;如下图所示&#xff1a; 数组计数可以方便快速地统计出一个各项都比较小的数组中&#xff0c;数值相同的数的个数。 数组计数…

PHP集成开发 -- PhpStorm 2023

PhpStorm 2023是一款强大的PHP集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提高开发人员的生产力和代码质量。以下是关于PhpStorm 2023软件的详细介绍&#xff1a; 首先&#xff0c;PhpStorm 2023提供了丰富的代码编辑功能&#xff0c;包括语法高亮、自动补全、代…

ubuntu22.04 安装部署01:禁用内核更新

一、前言 ubunut22.04系统安装以后&#xff0c;内核更新会导致各种各样的问题&#xff0c;因此锁定初始安装环境特别重要&#xff0c;下面介绍如何锁定内核更新。 二、操作方法 2.1 查看可用内核 dpkg --list | grep linux-image dpkg --list | grep linux-headers dpkg --…

故障诊断 | 一文解决,CNN-LSTM卷积神经网络-长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-LSTM卷积神经网络-长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-LSTM模型是一种结合了卷积神经网络(Convolutional Neural Network)和长短期记忆神经网络(Long Short-Term Memory)的组合模型,常用于数据故障…