|
@@ -24,6 +24,11 @@ import static com.alibaba.dashscope.utils.JsonUtils.gson;
|
|
|
import static org.jeecg.modules.hikiot.HikiotConstant.*;
|
|
|
|
|
|
public class HikiotTool {
|
|
|
+
|
|
|
+ private static String cachedAppAccessToken = null;
|
|
|
+ private static long expirationTime = 0L;
|
|
|
+ private static String cachedUserAccessToken = null;
|
|
|
+ private static long userTokenExpirationTime = 0L;
|
|
|
private static final HttpClient httpClient = HttpClient.newBuilder()
|
|
|
.version(HttpClient.Version.HTTP_2)
|
|
|
.build();
|
|
@@ -71,20 +76,12 @@ public class HikiotTool {
|
|
|
* @return 响应结果
|
|
|
*/
|
|
|
public static String sendGetRequest(String url, Map<String, String> headers){
|
|
|
- // 获取访问凭证
|
|
|
- JsonObject appAccessToken = JsonParser.parseString(HikiotTool.getAppAccessToken()).getAsJsonObject();
|
|
|
- if (appAccessToken.get("code").getAsInt() == 0) {
|
|
|
- appAccessToken = appAccessToken.getAsJsonObject("data");
|
|
|
- } else {
|
|
|
- throw new JeecgBootException("海康API appAccessToken请求失败: " + appAccessToken.get("msg").getAsString());
|
|
|
- }
|
|
|
-
|
|
|
// 构建请求基础配置
|
|
|
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
|
|
|
.uri(URI.create(url))
|
|
|
.GET()
|
|
|
.header("Content-Type", "application/json")
|
|
|
- .header(APP_ACCESS_TOKEN_AUTH_HEADER, appAccessToken.get("appAccessToken").getAsString());
|
|
|
+ .header(APP_ACCESS_TOKEN_AUTH_HEADER, getAppAccessToken());
|
|
|
|
|
|
// 添加动态header
|
|
|
if (headers != null) {
|
|
@@ -104,14 +101,30 @@ public class HikiotTool {
|
|
|
|
|
|
/**
|
|
|
* @Author SheepHy
|
|
|
- * @Description 获取应用访问凭证
|
|
|
+ * @Description 获取应用访问凭证(带缓存)
|
|
|
* @Date 16:05 2025/8/12
|
|
|
**/
|
|
|
- public static String getAppAccessToken() {
|
|
|
+ public static synchronized String getAppAccessToken() {
|
|
|
+ // 检查缓存是否有效
|
|
|
+ if (cachedAppAccessToken != null && System.currentTimeMillis() < expirationTime) {
|
|
|
+ return cachedAppAccessToken;
|
|
|
+ }
|
|
|
+ // 缓存失效或不存在,重新获取
|
|
|
Map<String, String> map = new HashMap<>();
|
|
|
map.put(APP_KEY, APP_KEY_VALUE);
|
|
|
map.put(APP_SECRET, APP_SECRET_VALUE);
|
|
|
- return HikiotTool.sendPostRequest(GET_ACCESS_TOKEN_URL, gson.toJson(map), null);
|
|
|
+ JsonObject appAccessToken = JsonParser.parseString(HikiotTool.sendPostRequest(GET_ACCESS_TOKEN_URL, gson.toJson(map), null)).getAsJsonObject();
|
|
|
+ if (appAccessToken.get("code").getAsInt() == 0) {
|
|
|
+ JsonObject data = appAccessToken.getAsJsonObject("data");
|
|
|
+ int expiresIn = data.get("expiresIn").getAsInt();
|
|
|
+ String token = data.get("appAccessToken").getAsString();
|
|
|
+ // 更新缓存和过期时间(单位:小时转毫秒)
|
|
|
+ cachedAppAccessToken = token;
|
|
|
+ expirationTime = System.currentTimeMillis() + (expiresIn * 60L * 60L * 1000L);
|
|
|
+ return token;
|
|
|
+ } else {
|
|
|
+ throw new JeecgBootException("海康API appAccessToken请求失败: " + appAccessToken.get("msg").getAsString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -144,19 +157,36 @@ public class HikiotTool {
|
|
|
|
|
|
/**
|
|
|
* @Author SheepHy
|
|
|
- * @Description 授权码获取用户访问凭证
|
|
|
+ * @Description 授权码获取用户访问凭证(带缓存)
|
|
|
* @Date 11:36 2025/8/14
|
|
|
- * @Param
|
|
|
- * @return
|
|
|
- **/
|
|
|
- public static String getUserAccessToken() {
|
|
|
+ */
|
|
|
+ public static synchronized String getUserAccessToken() {
|
|
|
+ // 检查缓存是否有效
|
|
|
+ if (cachedUserAccessToken != null && System.currentTimeMillis() < userTokenExpirationTime) {
|
|
|
+ return cachedUserAccessToken;
|
|
|
+ }
|
|
|
+ // 缓存失效或不存在,重新获取
|
|
|
JsonObject dataAuthCode = JsonParser.parseString(HikiotTool.getAuthCode()).getAsJsonObject();
|
|
|
- if (dataAuthCode.get("code").getAsInt() == 0) {
|
|
|
- dataAuthCode = dataAuthCode.getAsJsonObject("data");
|
|
|
- } else {
|
|
|
+ if (dataAuthCode.get("code").getAsInt() != 0) {
|
|
|
throw new JeecgBootException("海康API authCode请求失败: " + dataAuthCode.get("msg").getAsString());
|
|
|
}
|
|
|
- return sendGetRequest(GET_USER_ACCESS_TOKEN_URL + dataAuthCode.get("authCode").getAsString(), null);
|
|
|
+ String authCode = dataAuthCode.getAsJsonObject("data").get("authCode").getAsString();
|
|
|
+ JsonObject userAccessToken = JsonParser.parseString(sendGetRequest(GET_USER_ACCESS_TOKEN_URL + authCode, null)).getAsJsonObject();
|
|
|
+ if (userAccessToken.get("code").getAsInt() != 0) {
|
|
|
+ throw new JeecgBootException("海康API userAccessToken请求失败: " + userAccessToken.get("msg").getAsString());
|
|
|
+ }
|
|
|
+ JsonObject data = userAccessToken.getAsJsonObject("data");
|
|
|
+ String expiresInStr = data.get("expiresIn").getAsString();
|
|
|
+ try {
|
|
|
+ int expiresInDays = Integer.parseInt(expiresInStr);
|
|
|
+ String token = data.get("userAccessToken").getAsString();
|
|
|
+ // 更新缓存和过期时间(单位:天转毫秒)
|
|
|
+ cachedUserAccessToken = token;
|
|
|
+ userTokenExpirationTime = System.currentTimeMillis() + (expiresInDays * 24L * 60L * 60L * 1000L);
|
|
|
+ return token;
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ throw new JeecgBootException("海康API expiresIn字段解析失败: " + expiresInStr, e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -212,16 +242,8 @@ public class HikiotTool {
|
|
|
**/
|
|
|
private static Map<String, String> setHeaders() {
|
|
|
Map<String, String> variables = new HashMap<>();
|
|
|
- JsonObject appAccessToken = JsonParser.parseString(HikiotTool.getAppAccessToken()).getAsJsonObject();
|
|
|
- JsonObject userAccessToken = JsonParser.parseString(HikiotTool.getUserAccessToken()).getAsJsonObject();
|
|
|
- if (appAccessToken.get("code").getAsInt() == 0) {
|
|
|
- appAccessToken = appAccessToken.getAsJsonObject("data");
|
|
|
- }
|
|
|
- if (userAccessToken.get("code").getAsInt() == 0) {
|
|
|
- userAccessToken = userAccessToken.getAsJsonObject("data");
|
|
|
- }
|
|
|
- variables.put(APP_ACCESS_TOKEN_AUTH_HEADER, appAccessToken.get("appAccessToken").getAsString());
|
|
|
- variables.put(USER_ACCESS_TOKEN, userAccessToken.get("userAccessToken").getAsString());
|
|
|
+ variables.put(APP_ACCESS_TOKEN_AUTH_HEADER, getAppAccessToken());
|
|
|
+ variables.put(USER_ACCESS_TOKEN, getUserAccessToken());
|
|
|
return variables;
|
|
|
}
|
|
|
|