前言:
现在朋友们对“java openapi”可能比较关怀,朋友们都需要学习一些“java openapi”的相关内容。那么小编也在网上网罗了一些对于“java openapi””的相关文章,希望我们能喜欢,同学们快快来学习一下吧!最近花了几周时间写了一个JAVA开源项目openapi, 项目是为了解决接口之间调用的加解密和验签问题。
项目地址:GitHub - hdwang123/openapi: 开放接口sdk
项目介绍:
openapi致力于提供一个能够快速搭建开放api的sdk背景
对外服务的接口为了安全起见,往往需要进行相应的安全处理:数据加密传输和身份认证。 数据加密传输有对称加密和非对称加密两种,为了更加安全起见采用非对称加密比较好些,身份认证则采用数字签名可以实现。 开发此sdk就是为了能够快速地实现项目中api的安全开放。
基于框架
spring-boot
主要依赖包
cn.hutool.hutool-all
功能
1.负责对外开放接口(基于HTTP对外提供服务)
2.实现接口的参数与返回值的加解密(使用非对称加密:RSA/SM2,或对称加密:AES/SM4)
3.实现接口的验签(服务端会校验客户端的签名,确保调用者身份以及数据不被篡改)
程序流程图使用方法服务端1.引入openapi-server-sdk
<dependency> <groupId>io.github.hdwang123</groupId> <artifactId>openapi-server-sdk</artifactId> <version>1.2.2</version></dependency>2.实现OpenApiConfig接口进行配置
注:默认没有任何配置实现类,启动项目会报错,必须手动配置一个OpenApiConfig实现类
@Componentpublic class OpenApiConfigImpl implements OpenApiConfig { @Value("${keys.local.rsa.privateKey}") private String privateKey; @Value("${keys.local.rsa.publicKey}") private String publicKey; @Value("${keys.remote.rsa.publicKey}") private String callerPublicKey; @Override public AsymmetricCryEnum getAsymmetricCry() { return AsymmetricCryEnum.RSA; } @Override public String getCallerPublicKey(String callerId) { //TODO 根据调用者ID查找调用者的公钥(可以将所有调用者的公钥存到数据库中) return callerPublicKey; } @Override public String getSelfPrivateKey() { return privateKey; } @Override public boolean retEncrypt() { return true; }}3.自定义开放API
注:被@OpenApi标识的类必须处于spring包的扫描路径下,方可注入容器中
@Slf4j@OpenApi("userApi")public class UserApi { @OpenApiMethod("getUserById") public User getUserById(Long id) { log.info("getUserById:id=" + id); User user = new User(); user.setId(1L); user.setName("张三"); return user; }}客户端1.引入openapi-client-sdk
<dependency> <groupId>io.github.hdwang123</groupId> <artifactId>openapi-client-sdk</artifactId> <version>1.2.2</version></dependency>2.调用openapi方式一
直接调用OpenApiClient
@Slf4j@Componentpublic class UserApiClient { @Value("${keys.local.rsa.privateKey}") private String privateKey; @Value("${keys.local.rsa.publicKey}") private String publicKey; @Value("${keys.remote.rsa.publicKey}") private String remotePublicKey; String baseUrl = ";; /** * 定义OpenApiClient */ OpenApiClient apiClient = null; @PostConstruct public void init() { apiClient = new OpenApiClientBuilder(baseUrl, privateKey, remotePublicKey, "001", "userApi") .asymmetricCry(AsymmetricCryEnum.RSA) .retDecrypt(true) .enableSymmetricCry(true) .symmetricCry(SymmetricCryEnum.AES) .build(); } public void getUserById() { OutParams outParams = apiClient.callOpenApi("getUserById", 10001); log.info("返回值:" + outParams); }}方式二
使用注解@OpenApiRef定义服务引用,在需要的地方注入即可
1.定义配置
openapi: client: config: openApiRefPath: openapi.example.client.openapiclient baseUrl: selfPrivateKey: ${keys.local.rsa.privateKey} remotePublicKey: ${keys.remote.rsa.publicKey} asymmetricCryEnum: RSA retDecrypt: true enableSymmetricCry: true symmetricCryEnum: AES callerId: "001"
2.定义服务引用
@OpenApiRef(value = "userApi")public interface UserApiClient { @OpenApiMethod("getUserById") User getUserById(Long id);}
3.注入服务引用调用远程openapi服务
@Componentpublic class UserApiTest2 { @Autowired UserApiClient userApiClient; public void getUserById() { User user = userApiClient.getUserById(10001L); log.info("返回值:" + user); }}版本记录v1.0.0
初版,支持非对称加解密(RSA或SM2)和接口验签功能
v1.1.0
新增对称加密模式(AES或SM4),即:内容采用对称加密以提高加解密速度,对称加密的密钥用非对称加密后传输
v1.1.1
1.签名优化,将请求流水号加到签名内容中,保证无参方法的调用也是经过验签的
2.方法新增数组类型参数的支持
3.注解OpenApiMethod新增属性,支持方法级别的配置
v1.1.2
1.方法多参数支持
2.修复类型转换错误
v1.1.3
1.OpenApiClient构造优化,新增OpenApiClientBuilder类
2.OpenApiClient调用优化,新增多个callOpenApi重载方法
v1.1.4
完善日志打印:SDK日志加上uuid,方便定位请求
v1.1.5
完善日志打印:SDK打印初始配置信息
v1.2.0
openapi-client-sdk新增服务引用方式调用openapi
v1.2.1
加解密方法重构:改成加解密处理器,方便以后算法扩展
v1.2.2
1.优化类型转换代码
2.增加HTTP超时时间设置
标签: #java openapi #sm2验签算法c程序百度云