diff --git a/.idea/misc.xml b/.idea/misc.xml
index 132404b..6f5230a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
* 这个异常标识传入的SDK方法的参数错误
@@ -17,13 +19,9 @@ package com.jhinno.sdk.openapi;
* @author yanlongqi
* @date 2024/1/31 10:36
*/
+@Getter
public class ArgsException extends RuntimeException {
- /**
- * 用户名
- */
- private String username;
-
/**
* 错误信息
*/
@@ -69,15 +67,6 @@ public class ArgsException extends RuntimeException {
@Override
public String getMessage() {
- return String.format("[ErrorMessage]:%s", errorMessage);
- }
-
- /**
- * 获取一个错误信息
- *
- * @return 错误信息
- */
- public String getErrorMessage() {
return errorMessage;
}
diff --git a/src/main/java/com/jhinno/sdk/openapi/CommonConstant.java b/src/main/java/com/jhinno/sdk/openapi/CommonConstant.java
index 5fb3a9b..e4a7f18 100644
--- a/src/main/java/com/jhinno/sdk/openapi/CommonConstant.java
+++ b/src/main/java/com/jhinno/sdk/openapi/CommonConstant.java
@@ -21,4 +21,15 @@ public class CommonConstant {
* 默认的token有效时间(单位:分钟)
*/
public static final int DEFAULT_TOKEN_EFFECTIVE_TIME = 30;
+
+
+ /**
+ * token 默认剩余时间
+ */
+ public static final int DEFAULT_TOKEN_RESIDUE_TIME = 5;
+
+ /**
+ * 获取token时AES加密的默认key
+ */
+ public static final String DEFAULT_AES_KEY = "jin5no@aqec8gtw6";
}
diff --git a/src/main/java/com/jhinno/sdk/openapi/ServiceException.java b/src/main/java/com/jhinno/sdk/openapi/ServiceException.java
index 2205f75..83a82ca 100644
--- a/src/main/java/com/jhinno/sdk/openapi/ServiceException.java
+++ b/src/main/java/com/jhinno/sdk/openapi/ServiceException.java
@@ -28,11 +28,21 @@ package com.jhinno.sdk.openapi;
*/
public class ServiceException extends RuntimeException {
+ /**
+ * 请求错误码
+ */
+ private int errorCode;
+
/**
* 错误信息
*/
private String errorMessage;
+ /**
+ * 请求的路径
+ */
+ private String requestPath;
+
/**
* 创建一个默认的实例
*/
@@ -44,21 +54,60 @@ public class ServiceException extends RuntimeException {
/**
* 创建一个包含错误消息的实例。
*
+ * @param requestPath 请求路径
+ * @param errorCode 错误码
* @param errorMessage 错误信息
*/
- public ServiceException(String errorMessage) {
- this(errorMessage, null);
+ public ServiceException(String requestPath, int errorCode, String errorMessage) {
+ this(requestPath, errorCode, errorMessage, null);
}
/**
* 创建一个包含错误消息和异常的实例
*
+ * @param requestPath 请求路径
+ * @param errorCode 错误码
* @param errorMessage 错误信息
* @param cause 一个异常
*/
- public ServiceException(String errorMessage, Throwable cause) {
+ public ServiceException(String requestPath, int errorCode, String errorMessage, Throwable cause) {
super(null, cause);
this.errorMessage = errorMessage;
+ this.requestPath = requestPath;
+ this.errorCode = errorCode;
+ }
+
+
+ /**
+ * 获取请求码
+ *
+ * @return 请求码
+ */
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ /**
+ * 获取错信息
+ *
+ * @return 错误信息
+ */
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ /**
+ * 获取请求路径
+ *
+ * @return 请求路径
+ */
+ public String getRequestPath() {
+ return requestPath;
+ }
+
+ @Override
+ public String getMessage() {
+ return String.format("%s\n[请求路径]: %s\n[错误码]: %s", errorMessage, requestPath, errorCode);
}
}
diff --git a/src/main/java/com/jhinno/sdk/openapi/api/JHApiExecution.java b/src/main/java/com/jhinno/sdk/openapi/api/JHApiExecution.java
index 60685b8..955c5a6 100644
--- a/src/main/java/com/jhinno/sdk/openapi/api/JHApiExecution.java
+++ b/src/main/java/com/jhinno/sdk/openapi/api/JHApiExecution.java
@@ -1,5 +1,7 @@
package com.jhinno.sdk.openapi.api;
+import cn.hutool.crypto.symmetric.AES;
+import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.alibaba.fastjson2.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.CommonConstant;
@@ -13,6 +15,8 @@ import java.util.HashMap;
import java.util.Map;
/**
+ * 定义一个请求的执行器,
+ *
* @author yanlongqi
* @date 2024/1/30 19:39
*/
@@ -21,8 +25,27 @@ public class JHApiExecution {
/**
* JHApiClient实例
*/
- private static JHApiClient JH_API_CLIENT;
+ public JHApiClient jhApiClient;
+ /**
+ * token的超时时间
+ */
+ private int tokenTimeout = CommonConstant.DEFAULT_TOKEN_EFFECTIVE_TIME;
+
+ /**
+ * token提前获取的时间
+ */
+ private int tokenResidueTime = CommonConstant.DEFAULT_TOKEN_RESIDUE_TIME;
+
+
+ /**
+ * 获取一个执行器的实例
+ *
+ * @param jhApiClient 请求的客户端
+ */
+ protected JHApiExecution(JHApiClient jhApiClient) {
+ this.jhApiClient = jhApiClient;
+ }
/**
* 用户令牌的缓存
@@ -35,14 +58,33 @@ public class JHApiExecution {
* @param jhApiClient 客户端实例
*/
public void setJHApiClient(JHApiClient jhApiClient) {
- this.JH_API_CLIENT = jhApiClient;
+ this.jhApiClient = jhApiClient;
+ }
+
+
+ /**
+ * 设置token超时的时间,单位:分钟
+ *
+ * @param tokenTimeout token的超时时间
+ */
+ public void setTokenTimeout(int tokenTimeout) {
+ this.tokenTimeout = tokenTimeout;
+ }
+
+ /**
+ * 设置提前获取token的时间,单位:分钟
+ *
+ * @param tokenResidueTime 提前获取token的时间
+ */
+ public void setTokenResidueTime(int tokenResidueTime) {
+ this.tokenResidueTime = tokenResidueTime;
}
/**
* 获取用户的Token
*
* @param username 用户名
- * @param isForce 是否强制获取token
+ * @param isForce 是否强制获取toke
* @return 用户的token
*/
public String getToken(String username, boolean isForce) {
@@ -50,15 +92,22 @@ public class JHApiExecution {
throw new ArgsException("用户名称不能为空!");
}
TokenInfo tokenInfo = TOKEN_INFO_MAP.get(username);
- // 如果是强制获取、用户令牌为空、用户令牌过期等,则获取令牌
- if (isForce || tokenInfo == null || System.currentTimeMillis() - tokenInfo.getCurrentTimestamp() <= CommonConstant.DEFAULT_TOKEN_EFFECTIVE_TIME * 60 * 1000) {
- Map
+ * 如果是true则会启动一个新的会话,否则复用已经启动好的会话
+ */
+ private boolean startNew;
+
+
+ /**
+ * 工作路径
+ */
+ private String cwd;
+
+ /**
+ * 工作文件
+ */
+ private String workFile;
+
+ /**
+ * 指标
+ */
+ private String metrics;
+
+
+ /**
+ *
+ * 请求获取到的JHClient协议链接的过期目标时间。(必填)
+ *
+ * 注意:
+ *
+ * 2. 该时间错由景行的JHClient进行验证,并不是在服务端进行验证, + * 所以为了防止客户端的时间和服务器的时间不一致而导会话不能启动, + * 因此此字段尽量在浏览器的生成 + *
+ */ + private String currentTimestamp; + + /** + * 会话类型 + */ + private String sessionType; + + private String sessionOwner; + + /** + * 启动参数 + *+ * 例如启动一个demo.exe 该demo.exe需要传入用户名,在命令行的的操作为 demo.exe -u admin + *
+ * + *+ * 此处传入的参数则为:"-u admin" + *
+ */ + private String param; + + private String loginUser; + + private String sessionId; + + private String remoteAddr; + + private String remotePort; + + private boolean isInMeetingRoom; + + private String currentMeetingId; + + private boolean jhClientInstalled; + +} diff --git a/src/main/java/com/jhinno/sdk/openapi/api/app/AppStartedInfo.java b/src/main/java/com/jhinno/sdk/openapi/api/app/AppStartedInfo.java new file mode 100644 index 0000000..7c3ac8d --- /dev/null +++ b/src/main/java/com/jhinno/sdk/openapi/api/app/AppStartedInfo.java @@ -0,0 +1,38 @@ +package com.jhinno.sdk.openapi.api.app; + +import com.alibaba.fastjson2.JSON; +import lombok.Getter; + +/** + * 会话启动信息 + * + * @author yanlongqi + * @date 2024/2/1 18:39 + */ +@Getter +public class AppStartedInfo { + + /** + * JHClient的地址(用于拉起对应会话的JHClient客户端) + * + *+ * 如:https://192.168.3.12/appform + *
*/ - private String baseUrl; + private final String baseUrl; /** - * 初始化一个JHApiClient的实例,值得注意的是该实例只能内部创建 + * 初始化一个JHApiClient的实例,可使用自定义的客户端 * * @param baseUrl 景行接口服务的基础地址 * @param closeableHttpClient 可关闭的HTTP客户端 @@ -66,7 +68,7 @@ public class JHApiClient { /** - * 每次发送请求的配置,如果该配置未进行设置则走{@link DefaultHttpClientConfig}中的默认配置 + * 每次发送请求的配置,如果该配置未进行设置则走 {@link DefaultHttpClientConfig} 中的默认配置 */ private RequestConfig requestConfig; @@ -85,7 +87,7 @@ public class JHApiClient { /** *- * 通过{@link DefaultHttpClientConfig}默认配置的最大连接数和服务每次能并行接收的请求数量构建一个JHApiClient实例 + * 通过 {@link DefaultHttpClientConfig} 默认配置的最大连接数和服务每次能并行接收的请求数量构建一个JHApiClient实例 *
* * @param baseUrl 景行接口服务的基础地址 @@ -96,7 +98,7 @@ public class JHApiClient { } /** - * 通过外部传入的{@link CloseableHttpClient}构建一个请求客户端 + * 通过外部传入的 {@link CloseableHttpClient} 构建一个请求客户端 ** * @param httpClient 请求连接池 @@ -151,9 +153,9 @@ public class JHApiClient { *
* *- * {@link JHApiClient } 默认只配置了 socket连接超时的时间(socketTimeout) 、连接超时的时间(connectTimeout)、 - * 请求超时的时间(connectionRequestTimeout)这三项,其默认配置在{@link DefaultHttpClientConfig}中。 - * 如果你要自定义你自己的配置,则可以通过{@link HttpClients}构建自己的RequestConfig来请求接口 + * {@link JHApiClient} 默认只配置了 socket连接超时的时间(socketTimeout) 、连接超时的时间(connectTimeout)、 + * 请求超时的时间(connectionRequestTimeout)这三项,其默认配置在{@link DefaultHttpClientConfig} 中。 + * 如果你要自定义你自己的配置,则可以通过{@link HttpClients} 构建自己的RequestConfig来请求接口 *
* * @param requestConfig HTTP请求的配置 diff --git a/src/test/java/com/jhinno/sdk/openapi/test/app/AppApiTest.java b/src/test/java/com/jhinno/sdk/openapi/test/app/AppApiTest.java new file mode 100644 index 0000000..656c9a7 --- /dev/null +++ b/src/test/java/com/jhinno/sdk/openapi/test/app/AppApiTest.java @@ -0,0 +1,33 @@ +package com.jhinno.sdk.openapi.test.app; + +import com.jhinno.sdk.openapi.api.app.AppStartRequest; +import com.jhinno.sdk.openapi.api.app.AppStartedInfo; +import com.jhinno.sdk.openapi.api.app.JHAppApiExecution; +import com.jhinno.sdk.openapi.client.JHApiClient; +import org.junit.Test; + +import java.util.List; +import java.util.Map; + +/** + * 会话启动相关单元测试 + * + * @author yanlongqi + * @date 2024/2/1 16:47 + */ + +public class AppApiTest { + + /** + * 测试获取"jhadmin"的Linux桌面会话的JHClient链接 + */ + @Test + public void testStartApp() { + JHApiClient client = JHApiClient.build("https://192.168.87.25/appform"); + JHAppApiExecution jhAppApiExecution = new JHAppApiExecution(client); + AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("jhadmin", "linux_desktop", new AppStartRequest()); + System.out.println(appStartedInfo); + } + + +} diff --git a/src/test/java/com/jhinno/sdk/openapi/test/auth/AuthApiTest.java b/src/test/java/com/jhinno/sdk/openapi/test/auth/AuthApiTest.java new file mode 100644 index 0000000..a3554c5 --- /dev/null +++ b/src/test/java/com/jhinno/sdk/openapi/test/auth/AuthApiTest.java @@ -0,0 +1,24 @@ +package com.jhinno.sdk.openapi.test.auth; + +import com.jhinno.sdk.openapi.api.app.JHAppApiExecution; +import com.jhinno.sdk.openapi.client.JHApiClient; +import org.junit.Test; + +/** + * 鉴权相关测试累 + * @author yanlongqi + * @date 2024/2/1 18:06 + */ +public class AuthApiTest { + + /** + * 启动会话 + */ + @Test + public void testStartApp() { + JHApiClient client = JHApiClient.build("https://192.168.87.25/appform"); + JHAppApiExecution jhAppApiExecution = new JHAppApiExecution(client); + String token = jhAppApiExecution.getToken("jhadmin"); + System.out.println(token); + } +}