Parcourir la source

add 统一返回参数

GITZYY il y a 7 mois
Parent
commit
001490c1b1

+ 1 - 1
egress-gateway-service-app/src/main/java/com/hrsk/cloud/eg/app/api/ApiCheckIntoServiceImpl.java

@@ -29,7 +29,7 @@ public class ApiCheckIntoServiceImpl {
      * @author zhangyy
      * @date: 2024/8/30 14:34
      */
-    @RequestMapping("/v1")
+    @RequestMapping("/loans/v1")
     public DefaultResponseVo<DataVo> checkInto(@RequestBody CheckIntoParamDto paramDto) {
        return apiGateway.checkIntoRequest(paramDto);
     }

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

@@ -2,6 +2,7 @@ package com.hrsk.cloud.eg.domain.api;
 
 import lombok.Getter;
 import lombok.experimental.Accessors;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
 
 /**
  * @author zhangyy
@@ -13,7 +14,22 @@ import lombok.experimental.Accessors;
 @Accessors(chain = true)
 public class ApiResult {
 
-    private String output;
-
+    /**
+     * 入参
+     */
+    private final Object output;
+    /**
+     * spel context
+     */
+    private final StandardEvaluationContext spelContext = new StandardEvaluationContext();
 
+    /**
+     * 构造函数
+     *
+     * @param output 出参
+     */
+    public ApiResult(Object output) {
+        this.output = output;
+        spelContext.setVariable("param", output);
+    }
 }

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

@@ -36,4 +36,12 @@ public class FunctionObject implements Serializable {
         }
         return ValueObjectFunctionManager.getInstance().apply(code,functionParam);
     }
+
+    public Object apply(Object value,ApiResult apiContext){
+        FunctionParam functionParam = new FunctionParam().setInput(value);
+        for(ValueObject arg : args){
+            functionParam.getExtArg().add(ValueObjectResolverManager.getInstance().resolve(arg,apiContext));
+        }
+        return ValueObjectFunctionManager.getInstance().apply(code,functionParam);
+    }
 }

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

@@ -61,4 +61,18 @@ public class ValueObject implements Serializable {
         return this;
     }
 
+
+    public ValueObject compile(ApiResult apiContext){
+        this.realValue = ValueObjectResolverManager.getInstance().resolve(this,apiContext);
+        if(CollectionUtils.isEmpty(functions)){
+            return this;
+        }
+        for(FunctionObject function : functions){
+            this.realValue = function.apply(realValue,apiContext);
+        }
+        return this;
+    }
+
+
+
 }

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

@@ -3,6 +3,7 @@ package com.hrsk.cloud.eg.domain.api.resolver.payload;
 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;
@@ -34,6 +35,49 @@ public class ApiJsonPayloadResolver implements ApiPayloadResolver {
         return jsonElement.toString();
     }
 
+
+    @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元素
@@ -68,6 +112,27 @@ public class ApiJsonPayloadResolver implements ApiPayloadResolver {
         }
     }
 
+    /**
+     * 将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元素

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

@@ -2,6 +2,7 @@ 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
@@ -15,4 +16,12 @@ public interface ApiPayloadResolver {
      * @param context 上下文
      */
     Object resolve(String template, ApiContext context);
+
+    /**
+     * @description:  加载返回值模版
+     * @author zhangyy
+     * @date 2024/9/2 15:19
+     * @version 1.0
+     */
+    Object resolve(String template, ApiResult context);
 }

+ 5 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/vo/BasicTypeValueObjectResolver.java

@@ -2,6 +2,7 @@ package com.hrsk.cloud.eg.domain.api.resolver.vo;
 
 
 import com.hrsk.cloud.eg.domain.api.ApiContext;
+import com.hrsk.cloud.eg.domain.api.ApiResult;
 import com.hrsk.cloud.eg.domain.api.ValueObject;
 
 /**
@@ -24,4 +25,8 @@ public class BasicTypeValueObjectResolver implements ValueObjectResolver {
         return valueObject.getValue();
     }
 
+    public Object resolve(ValueObject valueObject, ApiResult context) {
+        return valueObject.getValue();
+    }
+
 }

+ 17 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/vo/SpelValueObjectResolver.java

@@ -1,6 +1,7 @@
 package com.hrsk.cloud.eg.domain.api.resolver.vo;
 
 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 lombok.extern.slf4j.Slf4j;
 import org.springframework.expression.ExpressionParser;
@@ -33,4 +34,20 @@ public class SpelValueObjectResolver  implements ValueObjectResolver{
             return null;
         }
     }
+
+    /**
+     * 解析
+     * @param valueObject 解析对象
+     * @param context 返回值
+     * @return 解析结果
+     */
+    @Override
+    public Object resolve(ValueObject valueObject, ApiResult context) {
+        try{
+            return parser.parseExpression(valueObject.getValue()).getValue(context.getSpelContext());
+        }catch (Exception ex){
+            log.error("属性配置错误!",ex);
+            return null;
+        }
+    }
 }

+ 4 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/vo/ValueObjectResolver.java

@@ -2,6 +2,7 @@ package com.hrsk.cloud.eg.domain.api.resolver.vo;
 
 
 import com.hrsk.cloud.eg.domain.api.ApiContext;
+import com.hrsk.cloud.eg.domain.api.ApiResult;
 import com.hrsk.cloud.eg.domain.api.ValueObject;
 
 /**
@@ -17,4 +18,7 @@ public interface ValueObjectResolver {
      * @return 解析结果
      */
     Object resolve(ValueObject valueObject, ApiContext context);
+
+    Object resolve(ValueObject valueObject, ApiResult context);
 }
+

+ 13 - 0
egress-gateway-service-domain/src/main/java/com/hrsk/cloud/eg/domain/api/resolver/vo/ValueObjectResolverManager.java

@@ -3,6 +3,7 @@ package com.hrsk.cloud.eg.domain.api.resolver.vo;
 import com.alibaba.cola.exception.BizException;
 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.ValueObject;
 import com.hrsk.cloud.eg.domain.api.common.ValueObjectTypeEnum;
 import lombok.extern.slf4j.Slf4j;
@@ -61,6 +62,18 @@ public class ValueObjectResolverManager {
         return RESOLVERS.get(key).resolve(valueObject,context);
     }
 
+    public Object resolve(ValueObject valueObject, ApiResult context){
+        String type = valueObject.getType();
+        String key = valueObject.getType();
+        if(StringUtils.equalsAnyIgnoreCase(type, BasicTypeValueObjectResolver.BASIC_TYPES)){
+            key = ValueObjectTypeEnum.BASIC.getType();
+        }
+        if(StringUtils.isBlank(key)){
+            throw new BizException("目前不支持此类型的解析!");
+        }
+        return RESOLVERS.get(key).resolve(valueObject,context);
+    }
+
 
     /**
      * 注册

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

@@ -53,6 +53,7 @@ public class HttpRequestCheckIntoService {
              httpApiConfig.setType(type);
             Api api = apiFactory.createApi(httpApiConfig,paramDto);
             Object result = httpTemPlateClient.request((HttpApi) api);
+
             return  result;
         } catch (Exception e) {
             log.error("check into error ",e);