ソースを参照

add 增加统计返回

GITZYY 7 ヶ月 前
コミット
422603732e
15 ファイル変更336 行追加41 行削除
  1. 19 0
      egress-gateway-service-client/src/main/java/com/hrsk/cloud/eg/vo/response/DataVo.java
  2. 3 2
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/ApiResult.java
  3. 20 7
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/HttpApi.java
  4. 7 0
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/HttpApiConfig.java
  5. 30 0
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/common/ApiResultTypeENum.java
  6. 1 6
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiJsonPayloadResolver.java
  7. 1 10
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiPayloadResolver.java
  8. 1 9
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiPayloadResolverManage.java
  9. 150 0
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiJsonResultResolver.java
  10. 22 0
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiResultResolver.java
  11. 61 0
      egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiResultResolverManage.java
  12. 3 2
      egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/ApiGateWayImpl/ApiGatewayImpl.java
  13. 6 0
      egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/business/GenerateHttpApiConfigService.java
  14. 11 4
      egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/business/HttpRequestCheckIntoService.java
  15. 1 1
      start/src/test/java/StartTest.java

+ 19 - 0
egress-gateway-service-client/src/main/java/com/hrsk/cloud/eg/vo/response/DataVo.java

@@ -19,10 +19,14 @@ public class DataVo implements Serializable {
 
     private String msg;
 
+
     public DataVo(Integer status, String msg) {
         this.status = status;
         this.msg = msg;
     }
+    public DataVo() {
+
+    }
 
     public static DataVo success(){
         return new DataVo(1,"撞库成功");
@@ -32,4 +36,19 @@ public class DataVo implements Serializable {
     }
 
 
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
 }

+ 3 - 2
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/ApiResult.java

@@ -1,5 +1,6 @@
 package com.hrsk.cloud.eg.domain.api;
 
+import com.alibaba.fastjson2.JSONObject;
 import lombok.Getter;
 import lombok.experimental.Accessors;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
@@ -17,7 +18,7 @@ public class ApiResult {
     /**
      * 入参
      */
-    private final Object output;
+    private final JSONObject output;
     /**
      * spel context
      */
@@ -28,7 +29,7 @@ public class ApiResult {
      *
      * @param output 出参
      */
-    public ApiResult(Object output) {
+    public ApiResult(JSONObject output) {
         this.output = output;
         spelContext.setVariable("param", output);
     }

+ 20 - 7
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/HttpApi.java

@@ -2,8 +2,13 @@ package com.hrsk.cloud.eg.domain.api;
 
 import com.alibaba.cola.domain.Entity;
 import com.alibaba.cola.exception.BizException;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.google.gson.JsonObject;
 import com.hrsk.cloud.eg.domain.api.common.ApiPayloadTypeEnum;
 import com.hrsk.cloud.eg.domain.api.resolver.payload.ApiPayloadResolverManage;
+import com.hrsk.cloud.eg.domain.api.resolver.result.ApiResultResolverManage;
 import com.hrsk.cloud.eg.vo.response.DataVo;
 import com.hrsk.cloud.eg.vo.response.DefaultResponseVo;
 import lombok.Getter;
@@ -95,7 +100,8 @@ public class HttpApi implements Api {
      */
     public Object loadResult(HttpApiConfig config,Object output){
         this.httpApiConfig = config;
-        ApiResult context = new ApiResult(output);
+         JSONObject res = JSON.parseObject(output.toString());
+        ApiResult context = new ApiResult(res);
          return doLoadResult(context);
     }
 
@@ -151,17 +157,24 @@ public class HttpApi implements Api {
      * @date: 2024/9/2 16:01
      */
     private Object doLoadResult(ApiResult output) {
-        Object result = null;
+
         try {
-            if(StringUtils.equals(httpApiConfig.getContentType(), ApiPayloadTypeEnum.APPLICATION_JSON.getCode())){
-                result=Objects.toString(ApiPayloadResolverManage.getInstance().resolve(httpApiConfig.getContentType(),httpApiConfig.getResult(),output),"");
-            }
+            //判断是否存在这个返回信息的配置
+//            if(StringUtils.equals(httpApiConfig.getContentType(), ApiPayloadTypeEnum.APPLICATION_JSON.getCode())){
+//               if (Objects.isNull(httpApiConfig.getResultHandle())) {
+//                   result=Objects.toString(ApiPayloadResolverManage.getInstance().resolve(httpApiConfig.getContentType(),httpApiConfig.getResult(),output),"");
+//               }
+//                JSONArray resultHandleJson=JSON.parseObject(httpApiConfig.getResultHandle(),JSONArray.class);
+//               if (CollectionUtils.isEmpty(resultHandleJson)) {
+//                   result=Objects.toString(ApiPayloadResolverManage.getInstance().resolve(httpApiConfig.getContentType(),httpApiConfig.getResult(),output),"");
+//               }
+               return Objects.toString(ApiResultResolverManage.getInstance().resolve(httpApiConfig.getContentType(),httpApiConfig.getResult(),output),"");
+//            }
         }catch (Exception e){
             //下面这种方式是默认和统一的返回
             log.error("Api 统一返回值解析异常",e);
-            return DataVo.fail();
+            return null;
         }
-        return result;
 
     }
 

+ 7 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/HttpApiConfig.java

@@ -46,9 +46,16 @@ public class HttpApiConfig extends ApiConfig implements Serializable {
      */
     private String content;
 
+    /**
+     * result 返回处理
+     */
+    private String resultHandle;
+
      /**
      * result 返回值
      */
     private String result;
 
+
+
 }

+ 30 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/common/ApiResultTypeENum.java

@@ -0,0 +1,30 @@
+package com.hrsk.cloud.eg.domain.api.common;
+
+/**
+ * @author zhangyy
+ * @version 1.0
+ * @description: ApiResultTypeENum
+ * @date 2024/9/2 18:04
+ */
+public enum ApiResultTypeENum {
+    APPLICATION_JSON("application/json");
+
+    /**
+     * 编码
+     * -- GETTER --
+     *  获取编码
+     *
+     * @return 编码
+
+     */
+    private final String code;
+
+    /**
+     * 构造函数
+     * @param code 编码
+     */
+    ApiResultTypeENum(String code) {
+        this.code = code;
+    }
+
+}

+ 1 - 6
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiJsonPayloadResolver.java

@@ -36,12 +36,7 @@ public class ApiJsonPayloadResolver implements ApiPayloadResolver {
     }
 
 
-    @Override
-    public Object resolve(String jsonTemplate, ApiResult context) {
-        JsonElement jsonElement = GsonUtils.fromJson(jsonTemplate, JsonElement.class);
-        traverseJson(jsonElement,jsonElement,null,context,0);
-        return jsonElement.toString();
-    }
+
     /**
      * 遍历json
      * @param jsonElement json元素

+ 1 - 10
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiPayloadResolver.java

@@ -1,8 +1,5 @@
 package com.hrsk.cloud.eg.domain.api.resolver.payload;
-
-
 import com.hrsk.cloud.eg.domain.api.ApiContext;
-import com.hrsk.cloud.eg.domain.api.ApiResult;
 
 /**
  * @author: bianlanzhou
@@ -17,11 +14,5 @@ public interface ApiPayloadResolver {
      */
     Object resolve(String template, ApiContext context);
 
-    /**
-     * @description:  加载返回值模版
-     * @author zhangyy
-     * @date 2024/9/2 15:19
-     * @version 1.0
-     */
-    Object resolve(String template, ApiResult context);
+
 }

+ 1 - 9
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/payload/ApiPayloadResolverManage.java

@@ -48,20 +48,12 @@ public class ApiPayloadResolverManage {
         return RESOLVER_MAP.get(code).resolve(template,apiContext);
     }
 
-    /**
-     * 解析
-     * @param code 编码
-     * @param apiResult
-     * @return 解析结果
-     */
-    public Object resolve(String code, String template, ApiResult apiResult){
-        return RESOLVER_MAP.get(code).resolve(template,apiResult);
-    }
     /**
      * 注册
      */
     private static void regist(){
         log.info("开始注册Payload解析器!");
         RESOLVER_MAP.put(ApiPayloadTypeEnum.APPLICATION_JSON.getCode(),new ApiJsonPayloadResolver());
+
     }
 }

+ 150 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiJsonResultResolver.java

@@ -0,0 +1,150 @@
+package com.hrsk.cloud.eg.domain.api.resolver.result;
+
+import com.alibaba.cola.exception.BizException;
+import com.google.gson.*;
+import com.hrsk.cloud.eg.domain.api.ApiContext;
+import com.hrsk.cloud.eg.domain.api.ApiResult;
+import com.hrsk.cloud.eg.domain.api.ValueObject;
+import com.hrsk.cloud.eg.domain.common.utils.GsonUtils;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author: bianlanzhou
+ * @create: 2024-08-01 15:38
+ * @description: json类型payload
+ **/
+public class ApiJsonResultResolver implements ApiResultResolver {
+    /**
+     * JSON配置最大深度
+     */
+    private static final Integer MAX_DEEP = 10;
+    /**
+     * 配置前缀标记
+     */
+    private static final String CONFIG_PREFIX_SIGN = "#{";
+
+    /**
+     * 配置后缀标记
+     */
+    private static final String CONFIG_END_SIGN = "}";
+
+
+
+    @Override
+    public Object resolve(String jsonTemplate, ApiResult context) {
+        JsonElement jsonElement = GsonUtils.fromJson(jsonTemplate, JsonElement.class);
+        traverseJson(jsonElement,jsonElement,null,context,0);
+        return jsonElement.toString();
+    }
+    /**
+     * 遍历json
+     * @param jsonElement json元素
+     * @param context 上下文
+     * @param deep 深度
+     */
+    public void traverseJson(JsonElement jsonElement, JsonElement currentElement,String currentKey,ApiResult context,Integer deep) {
+        deep++;
+        if(deep >= MAX_DEEP){
+            throw new BizException(String.format("请求payload的json配置深度达到允许的最大深度[%s]!",MAX_DEEP));
+        }
+        if (jsonElement.isJsonObject()) {
+            JsonObject jsonObject = jsonElement.getAsJsonObject();
+            for (String key : jsonObject.keySet()) {
+                traverseJson(jsonObject.get(key),jsonObject,key,context,deep);
+            }
+        } else if (jsonElement.isJsonArray()) {
+            JsonArray jsonArray = jsonElement.getAsJsonArray();
+            for (JsonElement elem : jsonArray) {
+                traverseJson(elem,currentElement,null,context,deep);
+            }
+        } else {
+            if(jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isString()){
+                String value = jsonElement.getAsString();
+                if(value.startsWith(CONFIG_PREFIX_SIGN)&&value.endsWith(CONFIG_END_SIGN)){
+                    JsonPrimitive newElement = parseSpelConfigToRealValue(jsonElement,context);
+                    if(StringUtils.isNotBlank(currentKey)){
+                        currentElement.getAsJsonObject().add(currentKey,newElement);
+                    }
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 遍历json
+     * @param jsonElement json元素
+     * @param context 上下文
+     * @param deep 深度
+     */
+    public void traverseJson(JsonElement jsonElement, JsonElement currentElement,String currentKey,ApiContext context,Integer deep) {
+        deep++;
+        if(deep >= MAX_DEEP){
+            throw new BizException(String.format("请求payload的json配置深度达到允许的最大深度[%s]!",MAX_DEEP));
+        }
+        if (jsonElement.isJsonObject()) {
+            JsonObject jsonObject = jsonElement.getAsJsonObject();
+            for (String key : jsonObject.keySet()) {
+                traverseJson(jsonObject.get(key),jsonObject,key,context,deep);
+            }
+        } else if (jsonElement.isJsonArray()) {
+            JsonArray jsonArray = jsonElement.getAsJsonArray();
+            for (JsonElement elem : jsonArray) {
+                traverseJson(elem,currentElement,null,context,deep);
+            }
+        } else {
+            if(jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isString()){
+                String value = jsonElement.getAsString();
+                if(value.startsWith(CONFIG_PREFIX_SIGN)&&value.endsWith(CONFIG_END_SIGN)){
+                    JsonPrimitive newElement = parseSpelConfigToRealValue(jsonElement,context);
+                    if(StringUtils.isNotBlank(currentKey)){
+                        currentElement.getAsJsonObject().add(currentKey,newElement);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 将spel表达式转换成真实值
+     * @param jsonElement json元素
+     */
+    private JsonPrimitive parseSpelConfigToRealValue(JsonElement jsonElement, ApiResult context){
+        String value = jsonElement.getAsString();
+        value = StringUtils.replace(value,CONFIG_PREFIX_SIGN,"{",3);
+        ValueObject valueObject = new Gson().fromJson(value,ValueObject.class);
+        Object realValue = valueObject.compile(context).getRealValue();
+        if(realValue instanceof Number){
+            return new JsonPrimitive((Number)realValue);
+        }else if(realValue instanceof String){
+            return new JsonPrimitive((String)realValue);
+        }else if(realValue instanceof Boolean){
+            return new JsonPrimitive((Boolean)realValue);
+        }else if(realValue instanceof Character){
+            return new JsonPrimitive((Character)realValue);
+        }
+        return null;
+    }
+
+    /**
+     * 将spel表达式转换成真实值
+     * @param jsonElement json元素
+     */
+    private JsonPrimitive parseSpelConfigToRealValue(JsonElement jsonElement, ApiContext context){
+        String value = jsonElement.getAsString();
+        value = StringUtils.replace(value,CONFIG_PREFIX_SIGN,"{",3);
+        ValueObject valueObject = new Gson().fromJson(value,ValueObject.class);
+        Object realValue = valueObject.compile(context).getRealValue();
+        if(realValue instanceof Number){
+            return new JsonPrimitive((Number)realValue);
+        }else if(realValue instanceof String){
+            return new JsonPrimitive((String)realValue);
+        }else if(realValue instanceof Boolean){
+            return new JsonPrimitive((Boolean)realValue);
+        }else if(realValue instanceof Character){
+            return new JsonPrimitive((Character)realValue);
+        }
+        return null;
+    }
+}

+ 22 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiResultResolver.java

@@ -0,0 +1,22 @@
+package com.hrsk.cloud.eg.domain.api.resolver.result;
+
+
+import com.hrsk.cloud.eg.domain.api.ApiContext;
+import com.hrsk.cloud.eg.domain.api.ApiResult;
+
+/**
+ * @author: bianlanzhou
+ * @create: 2024-08-01 15:37
+ * @description: http api payload
+ **/
+public interface ApiResultResolver {
+
+
+    /**
+     * @description:  加载返回值模版
+     * @author zhangyy
+     * @date 2024/9/2 15:19
+     * @version 1.0
+     */
+    Object resolve(String template, ApiResult context);
+}

+ 61 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/result/ApiResultResolverManage.java

@@ -0,0 +1,61 @@
+package com.hrsk.cloud.eg.domain.api.resolver.result;
+
+import com.google.common.collect.Maps;
+import com.hrsk.cloud.eg.domain.api.ApiContext;
+import com.hrsk.cloud.eg.domain.api.ApiResult;
+import com.hrsk.cloud.eg.domain.api.common.ApiPayloadTypeEnum;
+import com.hrsk.cloud.eg.domain.api.resolver.payload.ApiJsonPayloadResolver;
+import com.hrsk.cloud.eg.domain.api.resolver.payload.ApiPayloadResolver;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+/**
+ * @author: bianlanzhou
+ * @create: 2024-08-01 17:38
+ * @description: api payload 管理器
+ **/
+@Slf4j
+public class ApiResultResolverManage {
+    /**
+     * PAYLOAD MAP
+     */
+    private static final Map<String, ApiResultResolver> RESOLVER_MAP = Maps.newHashMap();
+    /**
+     * INSTANCE
+     */
+    private static final ApiResultResolverManage INSTANCE = new ApiResultResolverManage();
+
+    static {
+        regist();
+    }
+
+    private ApiResultResolverManage(){}
+
+    /**
+     * 获取实例
+     * @return 实例
+     */
+    public static ApiResultResolverManage getInstance(){
+        return INSTANCE;
+    }
+
+
+    /**
+     * 解析
+     * @param code 编码
+     * @param apiResult
+     * @return 解析结果
+     */
+    public Object resolve(String code, String template, ApiResult apiResult){
+        return RESOLVER_MAP.get(code).resolve(template,apiResult);
+    }
+    /**
+     * 注册
+     */
+    private static void regist(){
+        log.info("开始注册Payload解析器!");
+        RESOLVER_MAP.put(ApiPayloadTypeEnum.APPLICATION_JSON.getCode(),new ApiJsonResultResolver());
+
+    }
+}

+ 3 - 2
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/ApiGateWayImpl/ApiGatewayImpl.java

@@ -1,5 +1,6 @@
 package com.hrsk.cloud.eg.infrastructure.ApiGateWayImpl;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.hrsk.cloud.eg.domain.api.ApiGateway;
 import com.hrsk.cloud.eg.domain.common.response.DefaultResponseVo;
 import com.hrsk.cloud.eg.dto.data.CheckIntoParamDto;
@@ -28,8 +29,8 @@ public class ApiGatewayImpl implements ApiGateway {
 
     @Override
     public DefaultResponseVo<DataVo> checkIntoRequest(CheckIntoParamDto param) {
-        Object data = checkIntoService.checkInto(param);
-        return DefaultResponseVo.success((DataVo) data);
+        DataVo data = checkIntoService.checkInto(param);
+        return DefaultResponseVo.success(data);
 
     }
 }

+ 6 - 0
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/business/GenerateHttpApiConfigService.java

@@ -88,6 +88,12 @@ public class GenerateHttpApiConfigService {
         body.put("merchantNo","#"+JSONObject.toJSONString(merchantNo));
         //主体
         httpApiConfig.setContent(JSONObject.toJSONString(body));
+        JSONObject resultObj=new  JSONObject();
+        KeyValueObject status=new KeyValueObject();
+        status.setType("spel");
+        status.setValue("#param.data.status");
+        resultObj.put("status","#"+JSONObject.toJSONString(status));
+        httpApiConfig.setResult(JSONObject.toJSONString(resultObj));
         String jsonString = JSONObject.toJSONString(httpApiConfig);
         log.info("json input data {}",jsonString);
          return httpApiConfig;

+ 11 - 4
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/business/HttpRequestCheckIntoService.java

@@ -1,5 +1,6 @@
 package com.hrsk.cloud.eg.infrastructure.business;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.hrsk.cloud.eg.domain.api.Api;
 import com.hrsk.cloud.eg.domain.api.ApiFactory;
 import com.hrsk.cloud.eg.domain.api.HttpApi;
@@ -11,12 +12,11 @@ import com.hrsk.cloud.eg.infrastructure.repository.database.entity.EgApiEndpoint
 import com.hrsk.cloud.eg.infrastructure.service.EgApiEndpointService;
 import com.hrsk.cloud.eg.infrastructure.service.EgApiService;
 import com.hrsk.cloud.eg.vo.response.DataVo;
-import com.hrsk.cloud.eg.vo.response.DefaultResponseVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.annotation.Resource;
+import java.util.Objects;
 
 /**
  * @author zhangyy
@@ -47,7 +47,7 @@ public class HttpRequestCheckIntoService {
      * @author zhangyy
      * @date: 2024/8/30 14:24
      */
-    public Object checkInto(CheckIntoParamDto paramDto){
+    public DataVo checkInto(CheckIntoParamDto paramDto){
         EgApiEndpointDo eg = egApiEndpointService.getById(paramDto.getPlan().getApiId());
         try {
             HttpApiConfig httpApiConfig = (HttpApiConfig) HessianUtils.deserialize(eg.getApiConfig());
@@ -55,7 +55,14 @@ public class HttpRequestCheckIntoService {
              httpApiConfig.setType(type);
             Api api = apiFactory.createApi(httpApiConfig,paramDto);
             Object result = httpTemPlateClient.request((HttpApi) api);
-           return apiFactory.createResult(httpApiConfig,result);
+            if (Objects.isNull(result)) {
+                return DataVo.fail();
+            }
+            Object output = apiFactory.createResult(httpApiConfig, result);
+            JSONObject res = JSONObject.parseObject(output.toString());
+            DataVo dataVo=new DataVo();
+            dataVo.setStatus(res.getInteger("status"));
+            return dataVo;
         } catch (Exception e) {
             log.error("check into error ",e);
         }

+ 1 - 1
start/src/test/java/StartTest.java

@@ -38,7 +38,7 @@ public class StartTest {
 
     @Test
     public void apiTest(){
-      Long apiId= 441205582851136L;
+      Long apiId= 441277113551168L;
         UserInBaseInfoDto user =new UserInBaseInfoDto();
         user.setPhoneMd5("b5500dfab55f42b340d31326561e16cb");
         PlanDto  plan =new PlanDto();