diff --git a/modules/i3plus-pojo-bsp/pom.xml b/modules/i3plus-pojo-bsp/pom.xml
new file mode 100644
index 0000000..faedcff
--- /dev/null
+++ b/modules/i3plus-pojo-bsp/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ i3plus-pojo
+ i3plus.pojo
+ 1.0-DEV-SNAPSHOT
+ ../../pom.xml
+
+ 4.0.0
+
+ i3plus-pojo-bsp
+
+
+
+ i3plus.pojo
+ i3plus-pojo-base
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+ dev
+
+ DEV
+
+
+ true
+
+
+
+ test
+
+ TEST
+
+
+
+ docker
+
+ DOCKER
+
+
+
+ prod
+
+ PROD
+
+
+
+
+ ${project.artifactId}-${project.version}
+
+
\ No newline at end of file
diff --git a/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/common/ReturnT.java b/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/common/ReturnT.java
new file mode 100644
index 0000000..e69de29
diff --git a/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/GsonTool.java b/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/GsonTool.java
new file mode 100644
index 0000000..9d9af08
--- /dev/null
+++ b/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/GsonTool.java
@@ -0,0 +1,98 @@
+package cn.estsh.i3plus.bspserver.util;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.List;
+
+/**
+ * @Description :
+ * @Reference :
+ * @Author : Castle
+ * @CreateDate : 2021/6/17 13:40
+ * @Modify:
+ **/
+public class GsonTool {
+ private static Gson gson = null;
+
+ static {
+ gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
+ }
+
+ /**
+ * Object 转成 json
+ *
+ * @param src
+ * @return String
+ */
+ public static String toJson(Object src) {
+ return gson.toJson(src);
+ }
+
+ /**
+ * json 转成 特定的cls的Object
+ *
+ * @param json
+ * @param classOfT
+ * @return
+ */
+ public static T fromJson(String json, Class classOfT) {
+ return gson.fromJson(json, classOfT);
+ }
+
+ /**
+ * json 转成 特定的 rawClass 的Object
+ *
+ * @param json
+ * @param classOfT
+ * @param argClassOfT
+ * @return
+ */
+ public static T fromJson(String json, Class classOfT, Class argClassOfT) {
+ Type type = new ParameterizedType4ReturnT(classOfT, new Class[]{argClassOfT});
+ return gson.fromJson(json, type);
+ }
+
+ public static class ParameterizedType4ReturnT implements ParameterizedType {
+ private final Class raw;
+ private final Type[] args;
+
+ public ParameterizedType4ReturnT(Class raw, Type[] args) {
+ this.raw = raw;
+ this.args = args != null ? args : new Type[0];
+ }
+
+ @Override
+ public Type[] getActualTypeArguments() {
+ return args;
+ }
+
+ @Override
+ public Type getRawType() {
+ return raw;
+ }
+
+ @Override
+ public Type getOwnerType() {
+ return null;
+ }
+ }
+
+ /**
+ * json 转成 特定的cls的list
+ *
+ * @param json
+ * @param classOfT
+ * @return
+ */
+ public static List fromJsonList(String json, Class classOfT) {
+ return gson.fromJson(
+ json,
+ new TypeToken>() {
+ }.getType()
+ );
+ }
+}
diff --git a/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/HttpUtils.java b/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/HttpUtils.java
new file mode 100644
index 0000000..c0e5521
--- /dev/null
+++ b/modules/i3plus-pojo-bsp/src/main/java/cn/estsh/i3plus/pojo/bsp/server/util/HttpUtils.java
@@ -0,0 +1,157 @@
+package cn.estsh.i3plus.bspserver.util;
+
+import cn.estsh.i3plus.pojo.base.bean.BaseBean;
+import cn.estsh.impp.framework.boot.util.ResultBean;
+import com.google.gson.Gson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.*;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+
+/**
+ * @Description :
+ * @Reference :
+ * @Author : Castle
+ * @CreateDate : 2021/6/17 13:37
+ * @Modify:
+ **/
+public class HttpUtils {
+ private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);
+
+ // trust-https start
+ private static void trustAllHosts(HttpsURLConnection connection) {
+ try {
+ SSLContext sc = SSLContext.getInstance("TLS");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ SSLSocketFactory newFactory = sc.getSocketFactory();
+
+ connection.setSSLSocketFactory(newFactory);
+ } catch (Exception e) {
+ logger.error(e.getMessage(), e);
+ }
+ connection.setHostnameVerifier(new HostnameVerifier() {
+ @Override
+ public boolean verify(String hostname, SSLSession session) {
+ return true;
+ }
+ });
+ }
+
+ private static final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
+ @Override
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return new java.security.cert.X509Certificate[]{};
+ }
+
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ }
+ }};
+ // trust-https end
+
+
+ /**
+ * post
+ *
+ * @param url
+ * @param timeout
+ * @param requestObj
+ * @param returnTargClassOfT
+ * @return
+ */
+ public static ResultBean postBody(String url, int timeout, Object requestObj, Class returnTargClassOfT) {
+ HttpURLConnection connection = null;
+ BufferedReader bufferedReader = null;
+ try {
+ // connection
+ URL realUrl = new URL(url);
+ connection = (HttpURLConnection) realUrl.openConnection();
+
+ // trust-https
+ boolean useHttps = url.startsWith("https");
+ if (useHttps) {
+ HttpsURLConnection https = (HttpsURLConnection) connection;
+ trustAllHosts(https);
+ }
+
+ // connection setting
+ connection.setRequestMethod("POST");
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.setUseCaches(false);
+ connection.setReadTimeout(timeout * 1000);
+ connection.setConnectTimeout(3 * 1000);
+ connection.setRequestProperty("connection", "Keep-Alive");
+ connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
+ connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");
+
+ // do connection
+ connection.connect();
+
+ // write requestBody
+ if (requestObj != null) {
+ String requestBody = GsonTool.toJson(requestObj);
+
+ DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
+ dataOutputStream.write(requestBody.getBytes("UTF-8"));
+ dataOutputStream.flush();
+ dataOutputStream.close();
+ }
+
+
+ // valid StatusCode
+ int statusCode = connection.getResponseCode();
+ if (statusCode != 200) {
+
+ return new ReturnT(ReturnT.FAIL_CODE, "rpc remoting fail, StatusCode(" + statusCode + ") invalid. for url : " + url);
+ }
+
+ // result
+ bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+ StringBuilder result = new StringBuilder();
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ result.append(line);
+ }
+ String resultJson = result.toString();
+
+ // parse returnT
+ try {
+
+ ReturnT returnT = GsonTool.fromJson(resultJson, ReturnT.class);
+ return returnT;
+ } catch (Exception e) {
+ logger.error("rpc remoting (url=" + url + ") response content invalid(" + resultJson + ").", e);
+ return new ReturnT(ReturnT.FAIL_CODE, "rpc remoting (url=" + url + ") response content invalid(" + resultJson + ").");
+ }
+
+ } catch (Exception e) {
+ logger.error(e.getMessage(), e);
+ return new ReturnT(ReturnT.FAIL_CODE, "rpc remoting error(" + e.getMessage() + "), for url : " + url);
+ } finally {
+ try {
+ if (bufferedReader != null) {
+ bufferedReader.close();
+ }
+ if (connection != null) {
+ connection.disconnect();
+ }
+ } catch (Exception e2) {
+ logger.error(e2.getMessage(), e2);
+ }
+ }
+ }
+
+}
\ No newline at end of file