Prechádzať zdrojové kódy

请求拦截器新增`afterCompletion`方法

mxd 3 rokov pred
rodič
commit
55de0464fd

+ 27 - 12
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -75,7 +75,7 @@ public class RequestHandler extends MagicController {
 		RequestEntity requestEntity = new RequestEntity(request, response, requestedFromTest, parameters, pathVariables);
 		if (requestEntity.getApiInfo() == null) {
 			logger.error("{}找不到对应接口", request.getRequestURI());
-			return buildResult(requestEntity, API_NOT_FOUND, "接口不存在");
+			return afterCompletion(requestEntity, buildResult(requestEntity, API_NOT_FOUND, "接口不存在"));
 		}
 		Map<String, Object> headers = new HashMap<String, Object>() {
 			@Override
@@ -106,9 +106,9 @@ public class RequestHandler extends MagicController {
 				}}, BODY_INVALID);
 			}
 		} catch (ValidateException e) {
-			return resultProvider.buildResult(requestEntity, RESPONSE_CODE_INVALID, e.getMessage());
+			return afterCompletion(requestEntity, resultProvider.buildResult(requestEntity, RESPONSE_CODE_INVALID, e.getMessage()));
 		} catch (Throwable root) {
-			return processException(requestEntity, root);
+			return afterCompletion(requestEntity, processException(requestEntity, root), root);
 		}
 		MagicScriptContext context = createMagicScriptContext(requestEntity, bodyValue);
 		requestEntity.setMagicScriptContext(context);
@@ -116,7 +116,7 @@ public class RequestHandler extends MagicController {
 		Object value;
 		// 执行前置拦截器
 		if ((value = doPreHandle(requestEntity)) != null) {
-			return value;
+			return afterCompletion(requestEntity, value);
 		}
 		if (requestedFromTest) {
 			try {
@@ -152,7 +152,7 @@ public class RequestHandler extends MagicController {
 
 	private <T extends BaseDefinition> Map<String, Object> doValidate(String comment, List<T> validateParameters, Map<String, Object> parameters, JsonCode jsonCode) {
 		parameters = parameters != null ? parameters : EMPTY_MAP;
-		if(CollectionUtils.isEmpty(validateParameters)){
+		if (CollectionUtils.isEmpty(validateParameters)) {
 			return parameters;
 		}
 		for (BaseDefinition parameter : validateParameters) {
@@ -265,12 +265,12 @@ public class RequestHandler extends MagicController {
 			Object value = result;
 			// 执行后置拦截器
 			if ((value = doPostHandle(requestEntity, value)) != null) {
-				return value;
+				return afterCompletion(requestEntity, value);
 			}
 			// 对返回结果包装处理
-			return response(requestEntity, result);
+			return afterCompletion(requestEntity, response(requestEntity, result));
 		} catch (Throwable root) {
-			return processException(requestEntity, root);
+			return afterCompletion(requestEntity, processException(requestEntity, root), root);
 		} finally {
 			RequestContext.remove();
 			MagicScriptContext.remove();
@@ -289,7 +289,7 @@ public class RequestHandler extends MagicController {
 				se = (MagicScriptException) parent;
 			}
 		} while ((parent = parent.getCause()) != null);
-		if(se != null && requestEntity.isRequestedFromTest()){
+		if (se != null && requestEntity.isRequestedFromTest()) {
 			Span.Line line = se.getLine();
 			WebSocketSessionManager.sendBySessionId(requestEntity.getRequestedSessionId(), EXCEPTION, Arrays.asList(
 					requestEntity.getRequestedSessionId(),
@@ -372,10 +372,10 @@ public class RequestHandler extends MagicController {
 	 */
 	private Object response(RequestEntity requestEntity, Object value) {
 		if (value instanceof ResponseEntity) {
-			if(requestEntity.isRequestedFromTest()){
+			if (requestEntity.isRequestedFromTest()) {
 				ResponseEntity<?> entity = (ResponseEntity<?>) value;
 				Set<String> headerKeys = entity.getHeaders().keySet();
-				if(!headerKeys.isEmpty()){
+				if (!headerKeys.isEmpty()) {
 					// 允许前端读取自定义的header(跨域情况)。
 					requestEntity.getResponse().setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, String.join(",", headerKeys));
 				}
@@ -394,12 +394,27 @@ public class RequestHandler extends MagicController {
 		for (RequestInterceptor requestInterceptor : configuration.getRequestInterceptors()) {
 			Object target = requestInterceptor.postHandle(requestEntity, value);
 			if (target != null) {
-				return target;
+				return afterCompletion(requestEntity, target);
 			}
 		}
 		return null;
 	}
 
+	private Object afterCompletion(RequestEntity requestEntity, Object returnValue) {
+		return afterCompletion(requestEntity, returnValue, null);
+	}
+
+	private Object afterCompletion(RequestEntity requestEntity, Object returnValue, Throwable throwable) {
+		for (RequestInterceptor requestInterceptor : configuration.getRequestInterceptors()) {
+			try {
+				requestInterceptor.afterCompletion(requestEntity, returnValue, throwable);
+			} catch (Exception e) {
+				logger.warn("执行afterCompletion出现出错", e);
+			}
+		}
+		return returnValue;
+	}
+
 	/**
 	 * 执行前置拦截器
 	 */

+ 19 - 5
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/RequestInterceptor.java

@@ -34,21 +34,35 @@ public interface RequestInterceptor {
 	/**
 	 * 执行完毕之后执行
 	 *
-	 * @param value 即将要返回到页面的值
+	 * @param returnValue 即将要返回到页面的值
 	 * @return 返回到页面的对象, 当返回null时执行后续拦截器,否则直接返回该值,不执行后续拦截器
 	 */
-	default Object postHandle(ApiInfo info, MagicScriptContext context, Object value, HttpServletRequest request, HttpServletResponse response) throws Exception {
+	default Object postHandle(ApiInfo info, MagicScriptContext context, Object returnValue, HttpServletRequest request, HttpServletResponse response) throws Exception {
 		return null;
 	}
 
 	/**
 	 * 执行完毕之后执行
 	 *
-	 * @param value 即将要返回到页面的值
+	 * @param returnValue 即将要返回到页面的值
 	 * @return 返回到页面的对象, 当返回null时执行后续拦截器,否则直接返回该值,不执行后续拦截器
 	 */
-	default Object postHandle(RequestEntity requestEntity, Object value) throws Exception {
-		return postHandle(requestEntity.getApiInfo(), requestEntity.getMagicScriptContext(), value, requestEntity.getRequest(), requestEntity.getResponse());
+	default Object postHandle(RequestEntity requestEntity, Object returnValue) throws Exception {
+		return postHandle(requestEntity.getApiInfo(), requestEntity.getMagicScriptContext(), returnValue, requestEntity.getRequest(), requestEntity.getResponse());
+	}
+
+	/**
+	 * 接口执行完毕之后执行
+	 */
+	default void afterCompletion(RequestEntity requestEntity, Object returnValue, Throwable throwable){
+		afterCompletion(requestEntity.getApiInfo(), requestEntity.getMagicScriptContext(), returnValue, requestEntity.getRequest(), requestEntity.getResponse(), throwable);
+	}
+
+	/**
+	 * 接口执行完毕之后执行
+	 */
+	default void afterCompletion(ApiInfo info, MagicScriptContext context, Object returnValue, HttpServletRequest request, HttpServletResponse response, Throwable throwable){
+
 	}
 
 }