当前位置: 首页 > 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 将分别被赋予配置文件中的属性值

相关文章:

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

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…...

CSS transition(过渡效果)详解

CSS过渡效果&#xff08;Transition&#xff09;是一种在CSS3中引入的动画效果&#xff0c;它允许开发者在元素状态变化时&#xff08;如鼠标悬停、类更改等&#xff09;平滑地改变CSS属性值&#xff0c;从而创建出平滑的动画效果。过渡效果可以应用于多种CSS属性&#xff0c;如…...

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…...

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中&#xff0c;Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句&#xff0c;MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档&#xff1a;https://www.baomidou.com/&#xff0c;感谢苞米豆和黑马程序员。 Mybat…...

C语言--------指针(1)

0.指针&指针变量 32位平台&#xff0c;指针变量是4个字节&#xff08;32bit/84)--------x86 64位平台&#xff0c;指针变量是8个字节&#xff08;64bit/88)--------x64 编号指针地址&#xff1b;我们平常讲的p是指针就是说p是一个指针变量&#xff1b; ************只要…...

Vite 下一代的前端工具链,前端开发与构建工具

一、Vite 简介 官方中文网站&#xff1a;Vite | 下一代的前端工具链 官方定义&#xff1a; Vite&#xff0c;下一代的前端工具链&#xff0c;为开发提供极速响应。 Vue3.4版本&#xff0c;Vue新版本使用Vite构建、开发、调试、编译。 Vite的优势 极速的服务启动 使用原生…...

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…...

巴尔加瓦算法图解:算法运用。

树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点&#xff0c;左子节点的值都比它小&#xff0c;…...

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…...

忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG&#xff08;检索增强生成&#xff09;设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而&#xff0c;重点主要是改进检索工具的效率&#xff0c;如嵌入式搜索、混合搜索和微调嵌入&#xff0c;而不是智能搜索。 这篇文章介绍了一种新的方法&#xff0c;灵感…...

利用路由懒加载和CDN分发策略,对Vue项目进行性能优化

目录 一、Vue项目 二、路由懒加载 三、CDN分发策略 四、如何对Vue项目进行性能优化 一、Vue项目 Vue是一种用于构建用户界面的JavaScript框架&#xff0c;它是一种渐进式框架&#xff0c;可以用于构建单页应用&#xff08;SPA&#xff09;和多页应用。Vue具有简单易学、灵…...

【Scala】1. 变量和数据类型

1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件&#xff0c;注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下&#xff1a; hello world!Pr…...

何时以及如何选择制动电阻

制动电阻的选择是优化变频器应用的关键因素 制动电阻器在变频器中是如何工作的&#xff1f; 制动电阻器在 VFD 应用中的工作原理是将电机减速到驱动器设定的精确速度。它们对于电机的快速减速特别有用。制动电阻还可以将任何多余的能量馈入 VFD&#xff0c;以提升直流母线上的…...

消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

消息队列 消息队列&#xff1a;它主要用来暂存生产者生产的消息&#xff0c;供后续其他消费者来消费。 它的功能主要有两个&#xff1a; 暂存&#xff08;存储&#xff09;队列&#xff08;有序&#xff1a;先进先出 从目前互联网应用中使用消息队列的场景来看&#xff0c;…...

Rust开发WASM,浏览器运行WASM

首先需要安装wasm-pack cargo install wasm-pack 使用cargo创建工程 cargo new --lib mywasm 编辑Cargo.toml文件&#xff0c;修改lib的类型为cdylib&#xff0c;并且添加依赖wasm-bindgen [package] name "mywasm" version "0.1.0" edition "…...

Vue3编写简单的App组件(二)

一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…...

java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 云平台教学系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据…...

QT初始程序

#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();} 解释&#xff1a; Qt系统提供的类头文件没有.h后缀Qt一个类对应一个头文件&#xff0c;类名和头文件名一致QA…...

ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image

ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…...

51单片机之LED灯模块篇

御风以翔 破浪以飏 &#x1f3a5;个人主页 &#x1f525;个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...