RequestHandler.java 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package org.ssssssss.magicapi.config;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.ssssssss.magicapi.model.JsonBean;
  9. import org.ssssssss.script.MagicScriptContext;
  10. import org.ssssssss.script.MagicScriptEngine;
  11. import org.ssssssss.script.exception.ScriptException;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.Set;
  18. public class RequestHandler {
  19. private static Logger logger = LoggerFactory.getLogger(RequestHandler.class);
  20. private List<RequestInterceptor> requestInterceptors = new ArrayList<>();
  21. public void addRequestInterceptor(RequestInterceptor requestInterceptor) {
  22. requestInterceptors.add(requestInterceptor);
  23. }
  24. @ResponseBody
  25. public Object invoke(HttpServletRequest request, HttpServletResponse response,
  26. @PathVariable(required = false) Map<String, Object> pathVariables,
  27. @RequestParam(required = false) Map<String, Object> parameters,
  28. @RequestBody(required = false) Map<String, Object> requestBody) {
  29. ApiInfo info;
  30. try {
  31. info = MappingHandlerMapping.getMappingApiInfo(request);
  32. MagicScriptContext context = new MagicScriptContext();
  33. putMapIntoContext(parameters, context);
  34. putMapIntoContext(pathVariables, context);
  35. if (requestBody != null) {
  36. context.set("body", requestBody);
  37. }
  38. // 执行前置拦截器
  39. for (RequestInterceptor requestInterceptor : requestInterceptors) {
  40. Object value = requestInterceptor.preHandle(info, context);
  41. if (value != null) {
  42. return value;
  43. }
  44. }
  45. Object value = MagicScriptEngine.execute(info.getScript(), context);
  46. // 执行后置拦截器
  47. for (RequestInterceptor requestInterceptor : requestInterceptors) {
  48. Object target = requestInterceptor.postHandle(info, context, value);
  49. if (target != null) {
  50. return target;
  51. }
  52. }
  53. return new JsonBean<>(value);
  54. } catch (Throwable root) {
  55. ScriptException se = null;
  56. Throwable parent = root;
  57. do {
  58. if (parent instanceof ScriptException) {
  59. se = (ScriptException) parent;
  60. }
  61. } while ((parent = parent.getCause()) != null);
  62. logger.error("执行接口出错", root);
  63. if (se != null) {
  64. return new JsonBean<>(-1, se.getSimpleMessage());
  65. }
  66. return new JsonBean<>(-1, root.getMessage());
  67. }
  68. }
  69. private void putMapIntoContext(Map<String, Object> map, MagicScriptContext context) {
  70. if (map != null && !map.isEmpty()) {
  71. Set<Map.Entry<String, Object>> entries = map.entrySet();
  72. for (Map.Entry<String, Object> entry : entries) {
  73. context.set(entry.getKey(), entry.getValue());
  74. }
  75. }
  76. }
  77. }