>() {
diff --git a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHDepartmentApiExecution.java b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHDepartmentApiExecution.java
index 6a13554..812bed3 100644
--- a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHDepartmentApiExecution.java
+++ b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHDepartmentApiExecution.java
@@ -5,6 +5,7 @@ import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
+import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
@@ -18,6 +19,7 @@ import java.util.Map;
* @author yanlongqi
* @date 2024/2/6 17:37
*/
+@NoArgsConstructor
public class JHDepartmentApiExecution extends JHApiExecution {
/**
diff --git a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHUserApiExecution.java b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHUserApiExecution.java
index 0714d5b..1ad657d 100644
--- a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHUserApiExecution.java
+++ b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/api/organization/JHUserApiExecution.java
@@ -6,6 +6,7 @@ import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.api.PageResult;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
+import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
@@ -19,6 +20,7 @@ import java.util.Map;
* @author yanlongqi
* @date 2024/2/6 17:37
*/
+@NoArgsConstructor
public class JHUserApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
diff --git a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/DefaultHttpClientConfig.java b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/DefaultHttpClientConfig.java
index 2d05c1d..87441b6 100644
--- a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/DefaultHttpClientConfig.java
+++ b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/DefaultHttpClientConfig.java
@@ -16,7 +16,7 @@ public class DefaultHttpClientConfig {
/**
* 默认服务每次能并行接收的请求数量
*/
- public static int MAX_PER_ROUT = 20;
+ public static int MAX_PER_ROUTE = 20;
/**
@@ -33,4 +33,26 @@ public class DefaultHttpClientConfig {
* 默认请求超时的时间(单位:毫秒)
*/
public static final int CONNECTION_REQUEST_TIMEOUT = 5000;
+
+ /**
+ * 是否使用服务器的时间
+ */
+ public static final boolean DEFAULT_IS_USED_SERVER_TIME = false;
+
+ /**
+ * 默认不强制获取token
+ */
+ public static final boolean DEFAULT_IS_FORCE_GET_TOKEN = false;
+
+
+ /**
+ * 默认的token有效时间(单位:分钟)
+ */
+ public static final int DEFAULT_TOKEN_EFFECTIVE_TIME = 30;
+
+
+ /**
+ * token 默认剩余时间
+ */
+ public static final int DEFAULT_TOKEN_RESIDUE_TIME = 5;
}
diff --git a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/JHApiClient.java b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/JHApiClient.java
index c46b4d7..4a2a3c6 100644
--- a/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/JHApiClient.java
+++ b/jhinno-openapi-java-sdk/src/main/java/com/jhinno/sdk/openapi/client/JHApiClient.java
@@ -1,43 +1,21 @@
package com.jhinno.sdk.openapi.client;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.ClientErrorCode;
import com.jhinno.sdk.openapi.ClientException;
-import com.jhinno.sdk.openapi.api.auth.AuthPathConstant;
+import com.jhinno.sdk.openapi.CommonConstant;
+import com.jhinno.sdk.openapi.api.ResponseResult;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.*;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.ssl.SSLContextBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
-import java.security.KeyManagementException;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@@ -53,275 +31,70 @@ import java.util.TimeZone;
public class JHApiClient {
/**
- * 基础的请求URL地址
+ * 基础的请求URL地址
*
- * 如:https://192.168.3.12/appform
+ * 如:https:// 192.168.3.12/appform
*
*/
private String baseUrl;
/**
- * 对象转换器
+ * 设置自定义的jackson序列化配置
*/
private ObjectMapper mapper;
- /**
- * HTTP的连接客户端
- */
- private CloseableHttpClient closeableHttpClient;
-
/**
- * 每次发送请求的配置,如果该配置未进行设置则走 {@link DefaultHttpClientConfig} 中的默认配置
+ * API HTTP 客户端
*/
- private RequestConfig requestConfig;
-
- private int socketTimeout = DefaultHttpClientConfig.SOCKET_TIMEOUT;
- private int connectTimeout = DefaultHttpClientConfig.CONNECT_TIMEOUT;
- private int connectRequestTimeout = DefaultHttpClientConfig.CONNECTION_REQUEST_TIMEOUT;
- private int maxTotal = DefaultHttpClientConfig.MAX_TOTAL;
- private int maxPerRout = DefaultHttpClientConfig.MAX_PER_ROUT;
- /**
- * 初始化一个JHApiClient的实例,可使用自定义的客户端
- *
- * @param baseUrl 景行接口服务的基础地址
- * @param closeableHttpClient 可关闭的HTTP客户端
- */
- public JHApiClient(CloseableHttpClient closeableHttpClient, String baseUrl, int socketTimeout, int connectTimeout, int connectRequestTimeout) {
- this.baseUrl = baseUrl.endsWith("/") ? baseUrl.substring(0, baseUrl.length() - 1) : baseUrl;
- this.closeableHttpClient = closeableHttpClient;
- this.socketTimeout = socketTimeout;
- this.connectTimeout = connectTimeout;
- this.connectRequestTimeout = connectRequestTimeout;
- clientInit();
- }
-
- public JHApiClient() {
- closeableHttpClient = createHttpClients(maxTotal, maxPerRout);
- clientInit();
- }
+ private JHApiHttpClient apiHttpClient;
- /**
- * 初始化客户端
- */
- public void clientInit(){
- this.requestConfig = RequestConfig.custom()
- .setSocketTimeout(socketTimeout)
- .setConnectTimeout(connectTimeout)
- .setConnectionRequestTimeout(connectRequestTimeout)
- .build();
+ public JHApiClient(String baseUrl) {
+ if (StringUtils.isBlank(baseUrl)) {
+ throw new ClientException("服务器的BaseUrl不能为空!");
+ }
+ if (baseUrl.endsWith("/")) {
+ baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
+ }
+ this.baseUrl = baseUrl;
mapper = new ObjectMapper();
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
- mapper.setDateFormat(new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN));
+ mapper.setDateFormat(new SimpleDateFormat(CommonConstant.NORM_DATETIME_PATTERN));
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
- /**
- * 通过最大连接数和服务每次能并行接收的请求数量构建一个JHApiClient实例
- *
- * @param maxTotal 最大连接数
- * @param maxPerRout 服务每次能并行接收的请求数量
- * @param baseUrl 景行接口服务的基础地址 如: http://192.168.3.4/appform
- * @return JHApiClient的实例
- */
- public static JHApiClient build(String baseUrl, int maxTotal, int maxPerRout, int socketTimeout, int connectTimeout, int connectRequestTimeout) {
- return build(createHttpClients(maxTotal, maxPerRout), baseUrl, socketTimeout, connectTimeout, connectRequestTimeout);
- }
-
- /**
- * 通过{@link DefaultHttpClientConfig}默认配置的最大连接数和服务每次能并行接收的请求数量构建一个JHApiClient实例
- *
- *
- * @param baseUrl 景行接口服务的基础地址,如: http://192.168.3.4/appform
- * @return JHApiClient的实例
- */
- public static JHApiClient build(String baseUrl) {
- CloseableHttpClient client = createHttpClients(com.jhinno.sdk.openapi.client.DefaultHttpClientConfig.MAX_TOTAL, com.jhinno.sdk.openapi.client.DefaultHttpClientConfig.MAX_PER_ROUT);
- return build(client, baseUrl, com.jhinno.sdk.openapi.client.DefaultHttpClientConfig.SOCKET_TIMEOUT, com.jhinno.sdk.openapi.client.DefaultHttpClientConfig.CONNECT_TIMEOUT, com.jhinno.sdk.openapi.client.DefaultHttpClientConfig.CONNECTION_REQUEST_TIMEOUT);
- }
-
- /**
- * 通过外部传入的{@link CloseableHttpClient}构建一个请求客户端.
- *
- *
- * @param httpClient 请求连接池
- * @param baseUrl 景行接口服务的基础地址
- * @return JHApiClient的实例
- */
- public static JHApiClient build(CloseableHttpClient httpClient, String baseUrl, int socketTimeout, int connectTimeout, int connectRequestTimeout) {
- return new JHApiClient(httpClient, baseUrl, socketTimeout, connectTimeout, connectRequestTimeout);
- }
-
-
- /**
- * 初始化一个HTTP客户端实例
- *
- * @param maxTotal 设置最大连接数
- * @param maxPerRoute 服务每次能并行接收的请求数量
- * @return 返回一个可关闭的HTTP客户端示例
- */
- public static CloseableHttpClient createHttpClients(int maxTotal, int maxPerRoute) {
- SSLContextBuilder builder = new SSLContextBuilder();
- try {
- builder.loadTrustMaterial(null, (x509Certificates, s) -> true);
- SSLConnectionSocketFactory sslref = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
- Registry registry = RegistryBuilder.create().register("http", new PlainConnectionSocketFactory()).register("https", sslref).build();
- PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
- cm.setMaxTotal(maxTotal);
- cm.setDefaultMaxPerRoute(maxPerRoute);
- return HttpClients.custom().setSSLSocketFactory(sslref).setConnectionManager(cm).setConnectionManagerShared(true).build();
- } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
- throw new ClientException(e.getMessage(), ClientErrorCode.SSL_EXCEPTION, e);
- }
- }
-
- /**
- * 关闭JHApiClient实例 (释放所有资源)
- * 调用JHApiClient实例的shutdown() 后,JHApiClient实例不可用。
- * 如果客户端不存在则不进行任何操作
- */
- public void shutdown() {
- try {
- if (closeableHttpClient != null) {
- closeableHttpClient.close();
- }
- } catch (IOException e) {
- throw new ClientException("关闭JHApiClient失败", e);
- }
- }
-
-
- /**
- * 设置自定义的jackson序列化配置
- *
- * @param mapper 序列化器
- */
- public void setMapper(ObjectMapper mapper) {
- this.mapper = mapper;
- }
-
- /**
- *
- * 设置一个HTTP请求的配置
- *
- *
- *
- * {@link JHApiClient} 默认只配置了 socket连接超时的时间(socketTimeout) 、连接超时的时间(connectTimeout)、
- * 请求超时的时间(connectionRequestTimeout)这三项,其默认配置在{@link DefaultHttpClientConfig} 中。
- * 如果你要自定义你自己的配置,则可以通过{@link HttpClients}构建自己的RequestConfig来请求接口
- *
- *
- * @param requestConfig HTTP请求的配置
- */
- public void setRequestConfig(RequestConfig requestConfig) {
- this.requestConfig = requestConfig;
- }
-
- /**
- * 原始发送请求
- *
- * @param httpRequest 请求体
- * @param headers 请求头
- * @return 响应体
- */
- public HttpEntity request(HttpRequestBase httpRequest, Map headers) {
- if (requestConfig == null) {
- throw new ClientException("请配置requestConfig");
- }
-
- if (httpRequest == null) {
- throw new ClientException("httpRequest不能为空");
- }
- httpRequest.setConfig(requestConfig);
-
- // 添加请求头
- if (CollectionUtil.isNotEmpty(headers)) {
- for (Map.Entry entry : headers.entrySet()) {
- httpRequest.setHeader(entry.getKey(), entry.getValue());
- }
- }
-
- try {
- HttpResponse response = closeableHttpClient.execute(httpRequest);
- int statusCode = response.getStatusLine().getStatusCode();
- if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
- httpRequest.releaseConnection();
- throw new ClientException("发送HTTP请求失败,请求码:" + statusCode, ClientErrorCode.REQUEST_ERROR);
- }
- return response.getEntity();
- } catch (IOException e) {
- throw new ClientException(e.getMessage());
- }
-
- }
-
-
- /**
- * 请求服务器的时间戳
- *
- * @return 服务器的时间戳
- */
- public Long requestTimeMillis() {
- HttpGet httpGet = new HttpGet(getUrl(AuthPathConstant.PING));
- httpGet.setConfig(requestConfig);
- try {
- HttpResponse response = closeableHttpClient.execute(httpGet);
- Header header = response.getFirstHeader("Date");
- if (header == null) {
- return null;
- }
- String value = header.getValue();
- if (StringUtils.isBlank(value)) {
- return null;
- }
- return DatePattern.HTTP_DATETIME_FORMAT.parse(value).getTime();
- } catch (IOException e) {
- throw new ClientException(e.getMessage());
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
-
- }
-
- /**
- * 发送请求
- *
- * @param httpRequest HttpRequestBase
- * @param headers 请求头
- * @param type 返回数据类型
- * @param 返回的数据类型
- * @return 返回的接口数据
- */
- public T request(HttpRequestBase httpRequest, Map headers, TypeReference type) {
- try {
- InputStream content = request(httpRequest, headers).getContent();
- return mapper.readValue(content, type);
- } catch (IOException e) {
- throw new ClientException(e.getMessage());
- }
-
+ public void initDefaultApiClient() {
+ JHApiHttpClientImpl jhApiHttpClient = new JHApiHttpClientImpl();
+ jhApiHttpClient.init();
+ jhApiHttpClient.createHttpClients();
+ this.apiHttpClient = jhApiHttpClient;
}
/**
* 发送一个get请求
*
- * @param path 接口地址
+ * @param path 接口路径
* @param headers 请求头
- * @param type 请求返回值类型
- * @param t
- * @return t
+ * @param type 返回数据类型
+ * @param 返回数据类型
+ * @return 返回数据
*/
- public T get(String path, Map headers, TypeReference type) {
+ public T get(String path, Map headers, TypeReference type) {
if (StringUtils.isBlank(path)) {
throw new ArgsException("url不能为空");
}
- HttpGet httpGet = new HttpGet(getUrl(path));
- return request(httpGet, headers, type);
+ try {
+ InputStream content = apiHttpClient.get(getUrl(path), headers);
+ return mapper.readValue(content, type);
+ } catch (IOException e) {
+ throw new ClientException(e.getMessage());
+ }
}
+
/**
* 发起一个get请求
*
@@ -360,8 +133,8 @@ public class JHApiClient {
if (value instanceof String) {
urlBuilder.append(URLEncoder.encode((String) value, StandardCharsets.UTF_8.name()));
} else if (value instanceof Date) {
- SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
- urlBuilder.append(URLEncoder.encode(format.format(value), "utf-8"));
+ SimpleDateFormat format = new SimpleDateFormat(CommonConstant.NORM_DATETIME_PATTERN);
+ urlBuilder.append(URLEncoder.encode(format.format(value), StandardCharsets.UTF_8.name()));
} else {
urlBuilder.append(value);
}
@@ -396,18 +169,47 @@ public class JHApiClient {
* @param k body的类型
* @return t
*/
- public T post(String path, K body, Map headers, TypeReference type) {
+ public T post(String path, K body, Map headers, TypeReference type) {
if (StringUtils.isBlank(path)) {
throw new ArgsException("path不能为空");
}
- HttpPost httpPost = new HttpPost(getUrl(path));
try {
+ String bodyStr = null;
if (body != null) {
- String bodyStr = mapper.writeValueAsString(body);
- httpPost.setEntity(new StringEntity(bodyStr, "utf-8"));
+ bodyStr = mapper.writeValueAsString(body);
}
- return request(httpPost, headers, type);
- } catch (Exception e) {
+ InputStream content = apiHttpClient.post(getUrl(path), bodyStr, headers);
+ return mapper.readValue(content, type);
+ } catch (IOException e) {
+ throw new ClientException(e.getMessage());
+ }
+ }
+
+
+ /**
+ * 发起put请求
+ *
+ * @param path 请求地址
+ * @param params 请求参数
+ * @param body 请求体
+ * @param headers 请求头
+ * @param type 请求数据类型
+ * @param t 返回的数据的类型
+ * @param k body的类型
+ * @return 请求返回的数据
+ */
+ public T put(String path, Map params, K body, Map headers, TypeReference type) {
+ if (StringUtils.isBlank(path)) {
+ throw new ArgsException("path不能为空");
+ }
+ try {
+ String bodyStr = null;
+ if (body != null) {
+ bodyStr = mapper.writeValueAsString(body);
+ }
+ InputStream content = apiHttpClient.put(getUrl(path), bodyStr, headers);
+ return mapper.readValue(content, type);
+ } catch (IOException e) {
throw new ClientException(e.getMessage());
}
}
@@ -424,20 +226,8 @@ public class JHApiClient {
* @param k body的类型
* @return 请求返回的数据
*/
- public T put(String path, K body, Map headers, TypeReference type) {
- if (StringUtils.isBlank(path)) {
- throw new ArgsException("url不能为空");
- }
- HttpPut httpPost = new HttpPut(getUrl(path));
- try {
- if (body != null) {
- String bodyStr = mapper.writeValueAsString(body);
- httpPost.setEntity(new StringEntity(bodyStr, "utf-8"));
- }
- return request(httpPost, headers, type);
- } catch (Exception e) {
- throw new ClientException(e.getMessage());
- }
+ public T put(String path, K body, Map headers, TypeReference type) {
+ return put(path, null, body, headers, type);
}
@@ -477,12 +267,16 @@ public class JHApiClient {
* @param 响应数据类型
* @return 响应数据
*/
- public T delete(String path, Map headers, TypeReference type) {
+ public T delete(String path, Map headers, TypeReference type) {
if (StringUtils.isBlank(path)) {
- throw new ArgsException("url不能为空");
+ throw new ArgsException("path不能为空");
+ }
+ try {
+ InputStream content = apiHttpClient.delete(getUrl(path), headers);
+ return mapper.readValue(content, type);
+ } catch (IOException e) {
+ throw new ClientException(e.getMessage());
}
- HttpDelete httpDelete = new HttpDelete(getUrl(path));
- return request(httpDelete, headers, type);
}
@@ -497,4 +291,32 @@ public class JHApiClient {
public T delete(String path, TypeReference type) {
return delete(path, null, type);
}
+
+ /**
+ * @param path 请求路径
+ * @param keyName 文件key
+ * @param fileName 文件名
+ * @param is 文件流
+ * @param headers 请求头
+ * @param body 请求体其他数据
+ * @param type 返回数据类型
+ * @return 请求类型
+ */
+ public ResponseResult