文章目录
创建一个新项目
项目名:LM-client-sdk
加入依赖Lombok(可选),Spring Configuration Processor(必选)
Spring Configuration Processor:帮助开发者自动生成配置ID代码提示.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
修改maven配置成自己的路径,后面会在这个路径的maven仓库中找到这个starter.
pom文件配置
项目创建成功后,pom.xml文件中删除
完整的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lm.client</groupId>
<artifactId>LM-client-sdk</artifactId>
<version>0.0.1</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
<name>LM-client-sdk</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
删掉主启动类和test包下的方法
项目路径如下:
创建配置类LMApiClientConfig
package com.lm.client.lmclientsdk;
import com.lm.client.lmclientsdk.Client.LMClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//@Configuration 这是一个配置类
//@ConfigurationProperties("lmapi.client") 读取yaml文件的配置,读到的配置设置成这里的属性
//@Data
//@ComponentScan 注解用于自动扫描组件,使得Spring能够自动注册相应的bean
@Configuration
@ConfigurationProperties("lmapi.client")
@Data
@ComponentScan
public class LMApiClientConfig {
private String accessKey;
private String secretKey;
@Bean
public LMClient lMClient(){
return new LMClient(accessKey,secretKey);
}
}
starter中的业务方法
方便调用者去使用它的方法, 这里的业务方法是api签名认证
client包下LMClient
package com.lm.client.lmclientsdk.Client;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.lm.client.lmclientsdk.model.User;
import java.util.HashMap;
import java.util.Map;
import static com.lm.client.lmclientsdk.utils.SignUtils.genSign;
/**
* 调用第三方接口的客户端
*/
public class LMClient {
private String accessKey;
private String secretKey;
public LMClient(String accessKey, String secretKey) {
this.accessKey = accessKey;
this.secretKey = secretKey;
}
//使用get方法从服务器上获取名称信息
public String getNameByGet(String name){
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("name", name);
String result= HttpUtil.get("http://localhost:8123/api/name/get", paramMap);
System.out.println(result);
return result;
}
//使用get方法从服务器上获取名称信息
public String getNameByPost(String name){
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("name", name);
String result= HttpUtil.post("http://localhost:8123/api/name/post", paramMap);
System.out.println(result);
return result;
}
//使用get方法像服务器发送User对象,并获取服务器返回的结果
public String getNameByPostUser(User user){
//对象转JSON格式的string
String json = JSONUtil.toJsonStr(user);
//获得服务器返回的结果
String result = HttpRequest.post("http://localhost:8123/api/name/postUser")
//加上请求头
.addHeaders(getHeaderMap(json))
.body(json)
.execute().body();
System.out.println(result);
return result;
}
//把accessKey和secretKey放到请求头中
private Map<String ,String> getHeaderMap(String body){
HashMap<String, String> map = new HashMap<>();
map.put("accessKey", accessKey);
map.put("nonce", RandomUtil.randomNumbers(4));
map.put("body", body);
map.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
map.put("sign", genSign(body, accessKey));
return map;
}
}
model包下User
@Data
public class User {
private String username;
}
utils包下SignUtils ,签名工具
package com.lm.client.lmclientsdk.utils;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
/**
* 签名工具
*/
public class SignUtils {
/**
* 生成签名
* @param body
* @param secretKey
* @return
*/
public static String genSign(String body,String secretKey){
//使用SHA256算法的Digester
Digester md5 = new Digester(DigestAlgorithm.SHA256);
//构建签名内容
String content = body + "." + secretKey;
return md5.digestHex(content);
}
}
META-INF创建spring.factories
spring.factories:定义了Spring Boot的自动配置。用于制定自动配置的类。
在springboot启动时,它会加载这个文件,并根据其中的配置项自动进行相应的配置.
配置项的全限定类名=对应的自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.lm.client.lmclientsdk.LMApiClientConfig
打包
maven install,打包成功后,去maven仓库下去找,路径是pom.xml文件的groupId
使用这个starter
调用者在pom.xml引入这个依赖,加载
<dependency>
<groupId>com.lm.client</groupId>
<artifactId>LM-client-sdk</artifactId>
<version>0.0.1</version>
</dependency>
在application.yml配置,可以识别出starter中写的配置
这里的lmapi.client就是starter里的LMApiClientConfig类上注释@ConfigurationProperties(“lmapi.client”)
lmapi:
client:
access-key: 123
secret-key: 456
测试
import com.lm.client.lmclientsdk.Client.LMClient;
import com.lm.client.lmclientsdk.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@SpringBootTest
class LmInterfaceApplicationTests {
@Resource
private LMClient lmClient;
@Test
void contextLoads() {
String result = lmClient.getNameByGet("lby");
User user = new User();
user.setUsername("李保洋");
String nameByPostUser = lmClient.getNameByPostUser(user);
System.out.println(result);
System.out.println(nameByPostUser);
}
}