Browse Source

[*]requestBody注释优化,knife4j兼容请求注释优化

Lianjy 4 years ago
parent
commit
78aa51a0d7

+ 29 - 11
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -1,6 +1,5 @@
 package org.ssssssss.magicapi.controller;
 
-import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -31,6 +30,7 @@ import org.ssssssss.magicapi.model.*;
 import org.ssssssss.magicapi.modules.ResponseModule;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.magicapi.script.ScriptManager;
+import org.ssssssss.magicapi.utils.JsonUtils;
 import org.ssssssss.magicapi.utils.PatternUtils;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.MagicScriptDebugContext;
@@ -110,11 +110,27 @@ public class RequestHandler extends MagicController {
 		}
 		MagicScriptContext context = createMagicScriptContext(requestEntity);
 
-		if (StringUtils.isNotBlank(requestEntity.getApiInfo().getRequestBody()) && JSONUtil.toBean(requestEntity.getApiInfo().getRequestBody(), BaseDefinition.class).getChildren().size() > 0) {
+		if (context.get(VAR_NAME_REQUEST_BODY) != null && StringUtils.isNotBlank(requestEntity.getApiInfo().getRequestBody()) && JsonUtils.readValue(requestEntity.getApiInfo().getRequestBody(), BaseDefinition.class).getChildren().size() > 0) {
 			// 验证 body
-			value = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, JSONUtil.toBean(requestEntity.getApiInfo().getRequestBody(), BaseDefinition.class).getChildren(), JSONUtil.parseObj(context.get(VAR_NAME_REQUEST_BODY)));
-			if (value != null) {
-				return requestEntity.isRequestedFromTest() ? new JsonBean<>(PATH_VARIABLE_INVALID, value) : value;
+			BaseDefinition body = JsonUtils.readValue(requestEntity.getApiInfo().getRequestBody(), BaseDefinition.class);
+			// 请求体首层是数组的时候单独处理
+            if (context.get(VAR_NAME_REQUEST_BODY) instanceof List) {
+				if (!VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(body.getDataType().getJavascriptType())) {
+                    Object result = resultProvider.buildResult(requestEntity, RESPONSE_CODE_INVALID, String.format("body参数错误,应为[%s]", body.getDataType().getJavascriptType()));
+                    return requestEntity.isRequestedFromTest() ? new JsonBean<>(BODY_INVALID, result) : result;
+				}
+
+				for (Object objMap : (List)context.get(VAR_NAME_REQUEST_BODY)) {
+					value = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, body.getChildren().get(0).getChildren(), (Map)objMap);
+					if (value != null) {
+						return requestEntity.isRequestedFromTest() ? new JsonBean<>(BODY_INVALID, value) : value;
+					}
+				}
+			} else {
+				value = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, body.getChildren(), (Map)context.get(VAR_NAME_REQUEST_BODY));
+				if (value != null) {
+					return requestEntity.isRequestedFromTest() ? new JsonBean<>(BODY_INVALID, value) : value;
+				}
 			}
 		}
 
@@ -143,17 +159,17 @@ public class RequestHandler extends MagicController {
 
 			// 针对requestBody多层级的情况
 			if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_OBJECT.equalsIgnoreCase(parameter.getDataType().getJavascriptType())) {
-				Object result = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, parameter.getChildren(), JSONUtil.parseObj(parameters.get(parameter.getName())));
+				Object result = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, parameter.getChildren(), (Map)parameters.get(parameter.getName()));
 				if (result != null) {
 					return result;
 				}
 			}
             if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(parameter.getDataType().getJavascriptType())) {
-                for (Object obj : JSONUtil.parseArray(parameters.get(parameter.getName()))) {
-                    Object result = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, parameter.getChildren().get(0).getChildren(), JSONUtil.parseObj(obj));
-                    if (result != null) {
-                        return result;
-                    }
+                for (Object objMap : (List)parameters.get(parameter.getName())) {
+					Object result = doValidate(requestEntity, VAR_NAME_REQUEST_BODY, parameter.getChildren().get(0).getChildren(), (Map)objMap);
+					if (result != null) {
+						return result;
+					}
                 }
             }
 
@@ -460,6 +476,8 @@ public class RequestHandler extends MagicController {
 					}
 				}
 			} catch (HttpMessageNotReadableException ignored) {
+				System.out.println(ignored.getHttpInputMessage().getBody().toString());
+				ignored.printStackTrace();
 				return null;
 			}
 		}

+ 4 - 3
magic-api/src/main/java/org/ssssssss/magicapi/model/ApiInfo.java

@@ -152,7 +152,7 @@ public class ApiInfo extends MagicEntity {
 				.flatMap(it -> it.getOptions().stream())
 				.forEach(option -> {
 					if (!map.containsKey(option.getName())) {
-						map.put(option.getName(), option.getValue());
+						map.put(option.getName(), option.getValue().toString());
 					}
 				});
 		return map;
@@ -228,8 +228,9 @@ public class ApiInfo extends MagicEntity {
 				.flatMap(it -> it.getOptions().stream())
 				.filter(it -> key.equals(it.getName()))
 				.findFirst()
-				.map(BaseDefinition::getValue)
-				.orElse(null);
+				.map(it -> {
+					return String.valueOf(it.getValue());
+				}).orElse(null);
 	}
 
 	@Override

+ 3 - 3
magic-api/src/main/java/org/ssssssss/magicapi/model/BaseDefinition.java

@@ -13,7 +13,7 @@ public class BaseDefinition {
 	/**
 	 * 值
 	 */
-	private String value;
+	private Object value;
 
 	/**
 	 * 描述
@@ -76,11 +76,11 @@ public class BaseDefinition {
 		this.name = name;
 	}
 
-	public String getValue() {
+	public Object getValue() {
 		return value;
 	}
 
-	public void setValue(String value) {
+	public void setValue(Object value) {
 		this.value = value;
 	}
 

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCodeConstants.java

@@ -61,6 +61,8 @@ public interface JsonCodeConstants {
 
 	JsonCode PATH_VARIABLE_INVALID = new JsonCode(0, "路径变量验证失败");
 
+	JsonCode BODY_INVALID = new JsonCode(0, "body验证失败");
+
 	JsonCode FILE_IS_REQUIRED = new JsonCode(0, "请上传文件");
 
 	JsonCode SIGN_IS_INVALID = new JsonCode(0, "签名验证失败");

+ 11 - 1
magic-api/src/main/java/org/ssssssss/magicapi/swagger/SwaggerEntity.java

@@ -17,7 +17,7 @@ public class SwaggerEntity {
 
 	private Set<Tag> tags = new TreeSet<>(Comparator.comparing(Tag::getName));
 
-	private Map<String, Object> definitions = Collections.emptyMap();
+	private Map<String, Object> definitions = new HashMap<>();
 
 	private Map<String, Map<String, Path>> paths = new HashMap<>();
 
@@ -219,6 +219,8 @@ public class SwaggerEntity {
 
 		private String summary;
 
+		private String description;
+
 		private String operationId = UUID.randomUUID().toString().replace("-", "");
 
 		private List<String> produces = new ArrayList<>();
@@ -308,6 +310,14 @@ public class SwaggerEntity {
 		public void setResponses(Map<String, Object> responses) {
 			this.responses = responses;
 		}
+
+		public String getDescription() {
+			return description;
+		}
+
+		public void setDescription(String description) {
+			this.description = description;
+		}
 	}
 
 	public static class Parameter {

+ 23 - 11
magic-api/src/main/java/org/ssssssss/magicapi/swagger/SwaggerProvider.java

@@ -1,6 +1,5 @@
 package org.ssssssss.magicapi.swagger;
 
-import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -9,6 +8,7 @@ import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.model.BaseDefinition;
 import org.ssssssss.magicapi.model.Path;
 import org.ssssssss.magicapi.provider.GroupServiceProvider;
+import org.ssssssss.magicapi.utils.JsonUtils;
 import org.ssssssss.script.parsing.ast.literal.BooleanLiteral;
 
 import java.util.*;
@@ -61,6 +61,7 @@ public class SwaggerProvider {
 
 	@ResponseBody
 	public SwaggerEntity swaggerJson() {
+		this.DEFINITION_MAP.clear();
 		List<ApiInfo> infos = mappingHandlerMapping.getApiInfos();
 		SwaggerEntity swaggerEntity = new SwaggerEntity();
 		swaggerEntity.setInfo(info);
@@ -76,8 +77,8 @@ public class SwaggerProvider {
 				List<SwaggerEntity.Parameter> parameters = parseParameters(mapper, info);
 				hasBody = parameters.stream().anyMatch(it -> VAR_NAME_REQUEST_BODY.equals(it.getIn()));
                 if (hasBody) {
-                    BaseDefinition baseDefinition = JSONUtil.toBean(info.getRequestBody(), BaseDefinition.class);
-                    doProcessDefinition(baseDefinition, info);
+                    BaseDefinition baseDefinition = JsonUtils.readValue(info.getRequestBody(), BaseDefinition.class);
+                    doProcessDefinition(baseDefinition, info, StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY));
                 }
 				parameters.forEach(path::addParameter);
 				path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), BODY_EMPTY), Object.class));
@@ -89,7 +90,8 @@ public class SwaggerProvider {
 				path.addConsume("*/*");
 			}
 			path.addProduce("application/json");
-			path.setSummary(StringUtils.defaultIfBlank(info.getDescription(), info.getName()));
+			path.setSummary(info.getName());
+			path.setDescription(StringUtils.defaultIfBlank(info.getDescription(), info.getName()));
 
 			swaggerEntity.addPath(requestPath, info.getMethod(), path);
 		}
@@ -120,13 +122,19 @@ public class SwaggerProvider {
 		paths.forEach(it -> parameters.add(new SwaggerEntity.Parameter(it.isRequired(), it.getName(), VAR_NAME_PATH_VARIABLE, it.getDataType().getJavascriptType(), it.getDescription(), it.getValue())));
 		try {
 			if (StringUtils.isNotBlank(info.getRequestBody()) && !BODY_EMPTY.equals(info.getRequestBody().replaceAll("\\s", ""))) {
-				BaseDefinition baseDefinition = JSONUtil.toBean(info.getRequestBody(), BaseDefinition.class);
+				BaseDefinition baseDefinition = JsonUtils.readValue(info.getRequestBody(), BaseDefinition.class);
 				if (BooleanLiteral.isTrue(baseDefinition)) {
 					SwaggerEntity.Parameter parameter = new SwaggerEntity.Parameter(true, StringUtils.isNotBlank(baseDefinition.getName()) ? baseDefinition.getName() : VAR_NAME_REQUEST_BODY, VAR_NAME_REQUEST_BODY, baseDefinition.getDataType().getJavascriptType(), baseDefinition.getDescription(), baseDefinition);
 
-					Map<String, Object> schema = new HashMap<>();
+					Map<String, Object> schema = new HashMap<>(2);
 					String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
-					String voName =  groupName + "<" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "<" + baseDefinition.getName() + ">>";
+					String voName =  groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "«";
+					if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(baseDefinition.getDataType().getJavascriptType())) {
+						voName += StringUtils.defaultIfBlank(baseDefinition.getChildren().get(0).getName(), StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY)) + "»»";
+					} else {
+						voName += StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY) + "»»";
+					}
+
 					schema.put("originalRef", voName);
 					schema.put("$ref", DEFINITION + voName);
 					parameter.setSchema(schema);
@@ -139,27 +147,31 @@ public class SwaggerProvider {
 		return parameters;
 	}
 
-    private Map<String, Object> doProcessDefinition(BaseDefinition target, ApiInfo info) {
+    private Map<String, Object> doProcessDefinition(BaseDefinition target, ApiInfo info, String parentName) {
         Map<String, Object> result = new HashMap<>(4);
         result.put("type", target.getDataType().getJavascriptType());
         result.put("description", target.getDescription());
         if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(target.getDataType().getJavascriptType())) {
             if (target.getChildren().size() > 0) {
-                result.put("items", doProcessDefinition(target.getChildren().get(0), info));
+                result.put("items", doProcessDefinition(target.getChildren().get(0), info, parentName + "_" +target.getName()));
             } else {
                 result.put("items", Collections.emptyList());
             }
 
         } else if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_OBJECT.equalsIgnoreCase(target.getDataType().getJavascriptType())) {
             String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
-            String voName = groupName + "<" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "<" + target.getName() + ">>";
+            String voName = groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "«" + StringUtils.defaultIfBlank(target.getName(), parentName)  + "»»";
+            if (this.DEFINITION_MAP.containsKey(voName)) {
+				// TODO 应该不会出现名字都一样的
+				voName.replace("»»", parentName + "»»");
+			}
             result.put("originalRef", voName);
             result.put("$ref", DEFINITION + voName);
 
             Map<String, Object> definition = new HashMap<>(4);
             Map<String, Map<String, Object>> properties = new HashMap<>(target.getChildren().size());
             for (BaseDefinition obj : target.getChildren()) {
-                properties.put(obj.getName(), doProcessDefinition(obj, info));
+                properties.put(obj.getName(), doProcessDefinition(obj, info, parentName));
             }
             definition.put("properties", properties);
             definition.put("description", target.getDescription());

+ 1 - 1
magic-editor/src/console/src/components/common/magic-json-tree.vue

@@ -97,7 +97,7 @@
   }
 
   .ma-tree .item-selected {
-    background-color: #d9e8fb;
+    background-color: var(--toolbox-list-hover-background);
   }
 
   .item-inline {

+ 5 - 5
magic-editor/src/console/src/components/common/magic-json.vue

@@ -176,8 +176,8 @@
   .json-view {
     width: 55%;
     margin: 0px 10px;
-    border: 1px solid #c9c9c9;
-    background-color: #ffffff;
+    background-color: var(--input-background);
+    border: 1px solid var(--border-color);
   }
 
   .json-view .view-box {
@@ -189,8 +189,8 @@
   .json-panel {
     flex: 1;
     margin: 0px 10px;
-    border: 1px solid #c9c9c9;
-    background-color: #ffffff;
+    background-color: var(--input-background);
+    border: 1px solid var(--border-color);
   }
 
   .json-panel .panel-box {
@@ -216,7 +216,7 @@
     font-size: 14px;
     text-align: left;
     padding-left: 20px;
-    background-color: #f2f2f2;
+    background-color: var(--selected-background);
     width: 100%;
   }
 </style>

+ 2 - 2
magic-editor/src/console/src/components/editor/magic-script-editor.vue

@@ -490,7 +490,7 @@ export default {
         try {
          let requestBody = JSON.parse(this.info.requestBody)
           requestConfig.params = params
-          requestConfig.data = this.buildRequestBodyData(requestBody)
+          requestConfig.data = JSON.stringify(this.buildRequestBodyData(requestBody))
           requestConfig.headers['Content-Type'] = 'application/json'
           requestConfig.transformRequest = []
         } catch (e) {
@@ -541,7 +541,7 @@ export default {
         newBody += this.createJsonStr(requestBody.children, true)
         newBody += ']';
       }
-      return newBody
+      return JSON.parse(newBody)
     },
     createJsonStr(data, arrayFlag = false) {
       let body = '';

+ 1 - 0
magic-editor/src/console/src/components/layout/magic-request.vue

@@ -264,6 +264,7 @@
     mounted() {
       let that = this;
       bus.$on('update-request-body', (newVal) => {
+        console.log('update-request-body', newVal);
         this.initRequestBodyDom()
         if (!newVal || newVal == null) {
           that.bodyEditorFlag = false