瀏覽代碼

优化`JSON`构建接口

mxd 4 年之前
父節點
當前提交
e3c2ae832a

+ 2 - 2
src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -297,7 +297,7 @@ public class RequestHandler extends MagicController {
 			// 对于return response.end() 的特殊处理
 			return new JsonBean<>(1, "empty.");
 		}
-		return new JsonBean<>(resultProvider.buildResult(requestEntity.getApiInfo(), requestEntity.getRequest(), requestEntity.getResponse(), result, requestEntity.getRequestTime()));
+		return new JsonBean<>(resultProvider.buildResult(requestEntity, result));
 	}
 
 	/**
@@ -458,7 +458,7 @@ public class RequestHandler extends MagicController {
 		} else if (value instanceof ResponseModule.NullValue) {
 			return null;
 		}
-		return resultProvider.buildResult(requestEntity.getApiInfo(), requestEntity.getRequest(), requestEntity.getResponse(), value, requestEntity.getRequestTime());
+		return resultProvider.buildResult(requestEntity, value);
 	}
 
 	/**

+ 13 - 0
src/main/java/org/ssssssss/magicapi/model/RequestEntity.java

@@ -27,6 +27,15 @@ public class RequestEntity {
 
 	private final Long requestTime = System.currentTimeMillis();
 
+	private RequestEntity() {
+		this.request = null;
+		this.response = null;
+		this.requestedFromTest = false;
+		this.parameters = null;
+		this.pathVariables = null;
+		this.apiInfo = null;
+	}
+
 	public RequestEntity(HttpServletRequest request, HttpServletResponse response, boolean requestedFromTest, Map<String, Object> parameters, Map<String, Object> pathVariables) {
 		this.request = request;
 		this.response = response;
@@ -36,6 +45,10 @@ public class RequestEntity {
 		this.apiInfo = MappingHandlerMapping.getMappingApiInfo(request);
 	}
 
+	public static RequestEntity empty() {
+		return new RequestEntity();
+	}
+
 	public ApiInfo getApiInfo() {
 		return apiInfo;
 	}

+ 22 - 30
src/main/java/org/ssssssss/magicapi/provider/ResultProvider.java

@@ -2,7 +2,6 @@ package org.ssssssss.magicapi.provider;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.model.PageResult;
 import org.ssssssss.magicapi.model.RequestEntity;
 import org.ssssssss.script.exception.MagicScriptAssertException;
@@ -10,8 +9,6 @@ import org.ssssssss.script.exception.MagicScriptException;
 import org.ssssssss.script.functions.ObjectConvertExtension;
 import org.ssssssss.script.parsing.ast.statement.Exit;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -25,14 +22,17 @@ public interface ResultProvider {
 
 	/**
 	 * 根据异常内容构建结果
+	 *
+	 * @param requestEntity 请求信息
+	 * @param root          异常对象
 	 */
-	default Object buildResult(ApiInfo apiInfo, HttpServletRequest request, HttpServletResponse response, Throwable root, long requestTime) {
+	default Object buildResult(RequestEntity requestEntity, Throwable root) {
 		MagicScriptException se = null;
 		Throwable parent = root;
 		do {
 			if (parent instanceof MagicScriptAssertException) {
 				MagicScriptAssertException sae = (MagicScriptAssertException) parent;
-				return buildResult(apiInfo, request, response, sae.getCode(), sae.getMessage(), requestTime);
+				return buildResult(requestEntity, sae.getCode(), sae.getMessage());
 			}
 			if (parent instanceof MagicScriptException) {
 				se = (MagicScriptException) parent;
@@ -40,56 +40,48 @@ public interface ResultProvider {
 		} while ((parent = parent.getCause()) != null);
 		logger.error("调用接口出错", root);
 		if (se != null) {
-			return buildResult(apiInfo, request, response, -1, se.getSimpleMessage(), requestTime);
+			return buildResult(requestEntity, -1, se.getSimpleMessage());
 		}
-		return buildResult(apiInfo, request, response, -1, root.getMessage(), requestTime);
+		return buildResult(requestEntity, -1, root.getMessage());
 	}
 
 	/**
-	 * 构建JSON返回结果(默认状态码和状态说明)
+	 * 构建JSON返回结果,code和message 默认为 1 success
 	 *
-	 * @param apiInfo  接口信息,可能为NULL
-	 * @param request  可能为NULL
-	 * @param response 可能为NULL
-	 * @param data     数据内容,状态码和状态说明默认为1 "success"
+	 * @param requestEntity 请求相关信息
+	 * @param data          返回内容
 	 */
-	default Object buildResult(ApiInfo apiInfo, HttpServletRequest request, HttpServletResponse response, Object data, long requestTime) {
+	default Object buildResult(RequestEntity requestEntity, Object data) {
 		if (data instanceof Exit.Value) {
 			Exit.Value exitValue = (Exit.Value) data;
 			Object[] values = exitValue.getValues();
 			int code = values.length > 0 ? ObjectConvertExtension.asInt(values[0], 1) : 1;
 			String message = values.length > 1 ? Objects.toString(values[1], "success") : "success";
-			return buildResult(apiInfo, request, response, code, message, values.length > 2 ? values[2] : null, requestTime);
+			return buildResult(requestEntity, code, message, values.length > 2 ? values[2] : null);
 		}
-		return buildResult(apiInfo, request, response, 1, "success", data, requestTime);
+		return buildResult(requestEntity, 1, "success", data);
 	}
 
 	/**
-	 * 构建JSON返回结果(无数据内容)
+	 * 构建JSON返回结果
 	 *
-	 * @param code    状态码
-	 * @param message 状态说明
+	 * @param requestEntity 请求相关信息
+	 * @param code          状态码
+	 * @param message       状态说明
 	 */
-	default Object buildResult(ApiInfo apiInfo, HttpServletRequest request, HttpServletResponse response, int code, String message, long requestTime) {
-		return buildResult(apiInfo, request, response, code, message, null, requestTime);
-	}
-
 	default Object buildResult(RequestEntity requestEntity, int code, String message) {
 		return buildResult(requestEntity, code, message, null);
 	}
 
-	default Object buildResult(RequestEntity requestEntity, int code, String message, Object data) {
-		return buildResult(requestEntity.getApiInfo(), requestEntity.getRequest(), requestEntity.getResponse(), code, message, data, requestEntity.getRequestTime());
-	}
-
 	/**
 	 * 构建JSON返回结果
 	 *
-	 * @param code    状态码
-	 * @param message 状态说明
-	 * @param data    数据内容,可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
+	 * @param requestEntity 请求相关信息
+	 * @param code          状态码
+	 * @param message       状态说明
+	 * @param data          数据内容,可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
 	 */
-	Object buildResult(ApiInfo apiInfo, HttpServletRequest request, HttpServletResponse response, int code, String message, Object data, long requestTime);
+	Object buildResult(RequestEntity requestEntity, int code, String message, Object data);
 
 	/**
 	 * @param total 总数

+ 5 - 4
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -3,6 +3,7 @@ package org.ssssssss.magicapi.provider.impl;
 import org.ssssssss.magicapi.config.MappingHandlerMapping;
 import org.ssssssss.magicapi.exception.MagicServiceException;
 import org.ssssssss.magicapi.model.ApiInfo;
+import org.ssssssss.magicapi.model.RequestEntity;
 import org.ssssssss.magicapi.provider.MagicAPIService;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.magicapi.script.ScriptManager;
@@ -59,7 +60,7 @@ public class DefaultMagicAPIService implements MagicAPIService {
 		simpleScriptContext.setAttribute(MagicScript.CONTEXT_ROOT, scriptContext, ScriptContext.ENGINE_SCOPE);
 		final Object evalVal;
 		try {
-			evalVal = ((MagicScript)ScriptManager.compile("MagicScript", info.getScript())).eval(simpleScriptContext);
+			evalVal = ((MagicScript) ScriptManager.compile("MagicScript", info.getScript())).eval(simpleScriptContext);
 		} finally {
 			// 恢复原接口上下文,修复当前调完其它接口后原接口上下文丢失的问题
 			MagicScriptContext.set(magicScriptContext);
@@ -78,16 +79,16 @@ public class DefaultMagicAPIService implements MagicAPIService {
 
 	@Override
 	public Object call(String method, String path, Map<String, Object> context) {
-		long requestTime = System.currentTimeMillis();
+		RequestEntity requestEntity = RequestEntity.empty();
 		try {
-			return resultProvider.buildResult(null, null, null, execute(method, path, context), requestTime);
+			return resultProvider.buildResult(requestEntity, execute(method, path, context));
 		} catch (MagicServiceException e) {
 			return null;    //找不到对应接口
 		} catch (Throwable root) {
 			if (throwException) {
 				throw root;
 			}
-			return resultProvider.buildResult(null, null, null, root, requestTime);
+			return resultProvider.buildResult(requestEntity, root);
 		}
 	}
 

+ 8 - 15
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultResultProvider.java

@@ -1,43 +1,36 @@
 package org.ssssssss.magicapi.provider.impl;
 
-import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.model.JsonBean;
+import org.ssssssss.magicapi.model.RequestEntity;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.magicapi.script.ScriptManager;
 import org.ssssssss.script.MagicScriptContext;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 public class DefaultResultProvider implements ResultProvider {
 
 	private final String responseScript;
 
-	public DefaultResultProvider() {
-		this.responseScript = null;
-	}
-
 	public DefaultResultProvider(String responseScript) {
 		this.responseScript = responseScript;
 	}
 
 	@Override
-	public Object buildResult(ApiInfo apiInfo, HttpServletRequest request, HttpServletResponse response, int code, String message, Object data, long requestTime) {
+	public Object buildResult(RequestEntity requestEntity, int code, String message, Object data) {
 		long timestamp = System.currentTimeMillis();
 		if (this.responseScript != null) {
 			MagicScriptContext context = new MagicScriptContext();
 			context.set("code", code);
 			context.set("message", message);
 			context.set("data", data);
-			context.set("apiInfo", apiInfo);
-			context.set("request", request);
-			context.set("response", response);
+			context.set("apiInfo", requestEntity.getApiInfo());
+			context.set("request", requestEntity.getRequest());
+			context.set("response", requestEntity.getResponse());
 			context.set("timestamp", timestamp);
-			context.set("requestTime", requestTime);
-			context.set("executeTime", timestamp - requestTime);
+			context.set("requestTime", requestEntity.getRequestTime());
+			context.set("executeTime", timestamp - requestEntity.getRequestTime());
 			return ScriptManager.executeExpression(responseScript, context);
 		} else {
-			return new JsonBean<>(code, message, data, (int) (timestamp - requestTime));
+			return new JsonBean<>(code, message, data, (int) (timestamp - requestEntity.getRequestTime()));
 		}
 	}
 }