deason 5 anni fa
parent
commit
b6af1f40bf

+ 5 - 0
src/main/java/cn/com/qmth/examcloud/app/core/SysProperty.java

@@ -7,6 +7,7 @@
 
 package cn.com.qmth.examcloud.app.core;
 
+import cn.com.qmth.examcloud.app.core.router.Server;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +35,10 @@ public class SysProperty {
     @Value("${examcloud.sms.template}")
     private String smsTemplate;//短信模板Code
 
+    public String getProxyUrl(Server server) {
+        return discoveryClient.getInstanceUrl(server.getInstanceName());
+    }
+
     public String getCoreBasicUrl() {
         return discoveryClient.getInstanceUrl(Constants.EC_CORE_BASIC);
     }

+ 6 - 6
src/main/java/cn/com/qmth/examcloud/app/core/router/Router.java

@@ -17,10 +17,10 @@ public class Router implements Serializable {
     private Method method;
 
     @ApiModelProperty(value = "请求Headers", required = false)
-    private Map<String, Object> headers;
+    private Map<String, String> headers;
 
     @ApiModelProperty(value = "请求Params", required = false)
-    private Map<String, Object> params;
+    private Map<String, String> params;
 
     @ApiModelProperty(value = "请求Body", required = false)
     private String body;
@@ -55,19 +55,19 @@ public class Router implements Serializable {
         this.method = method;
     }
 
-    public Map<String, Object> getHeaders() {
+    public Map<String, String> getHeaders() {
         return headers;
     }
 
-    public void setHeaders(Map<String, Object> headers) {
+    public void setHeaders(Map<String, String> headers) {
         this.headers = headers;
     }
 
-    public Map<String, Object> getParams() {
+    public Map<String, String> getParams() {
         return params;
     }
 
-    public void setParams(Map<String, Object> params) {
+    public void setParams(Map<String, String> params) {
         this.params = params;
     }
 

+ 90 - 1
src/main/java/cn/com/qmth/examcloud/app/service/RouterService.java

@@ -2,13 +2,25 @@ package cn.com.qmth.examcloud.app.service;
 
 import cn.com.qmth.examcloud.app.core.SysProperty;
 import cn.com.qmth.examcloud.app.core.router.Router;
+import cn.com.qmth.examcloud.app.model.Constants;
 import cn.com.qmth.examcloud.app.model.Result;
+import okhttp3.*;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import static cn.com.qmth.examcloud.app.model.Constants.*;
+
 @Component
 public class RouterService {
     private static Logger log = LoggerFactory.getLogger(RouterService.class);
@@ -16,14 +28,91 @@ public class RouterService {
     private SysProperty sysProperty;
 
     public Result execute(Router router) {
+        //校验参数
         Assert.notNull(router, "参数“router”不能为空!");
         Assert.notNull(router.getServer(), "参数“server”不能为空!");
         Assert.hasLength(router.getUrl(), "参数“url”不能为空!");
         Assert.notNull(router.getMethod(), "参数“method”不能为空!");
-        log.info(String.format("Router:[%s][%s]-%s ", router.getServer().getInstanceName(), router.getMethod().name(), router.getUrl()));
 
+        //处理请求Headers
+        Map<String, String> requestHeaders;
+        if (MapUtils.isEmpty(router.getHeaders())) {
+            requestHeaders = new HashMap<>();
+        } else {
+            requestHeaders = router.getHeaders();
+        }
+        requestHeaders.put(PARAM_KEY, router.getKey());
+        requestHeaders.put(PARAM_TOKEN, router.getToken());
+        requestHeaders.put(PARAM_TRACE_ID, this.getRandomTraceId());
+        requestHeaders.put(PARAM_CLIENT, PARAM_CLIENT_VALUE);
+
+        //处理请求Params
+        String requestParams = this.appendParams(router.getParams());
+
+        //处理请求Body
+        RequestBody requestBody = this.appendBody(router.getBody());
+
+        //处理请求地址
+        final String requestUrl = sysProperty.getProxyUrl(router.getServer()) + "/" + router.getUrl() + "?" + requestParams;
+        log.info(String.format("Router:[%s][%s]-%s ", router.getServer().getInstanceName(), router.getMethod().name(), requestUrl));
 
+        //封装请求
+        Request.Builder request = new Request.Builder()
+                .url(requestUrl)
+                .headers(Headers.of(requestHeaders));
+
+        switch (router.getMethod()) {
+            case GET:
+                return this.call(request.get().build());
+            case POST:
+                return this.call(request.post(requestBody).build());
+            case PUT:
+                return this.call(request.put(requestBody).build());
+            case DELETE:
+                return this.call(request.delete(requestBody).build());
+        }
+
+        return new Result().error();
+    }
+
+    private Result call(Request request) {
+        //todo
         return new Result().success();
     }
 
+    private RequestBody appendBody(String body) {
+        if (StringUtils.isBlank(body)) {
+            body = "{}";
+        }
+
+        return FormBody.create(MediaType.parse(Constants.CHARSET_JSON_UTF8), body);
+    }
+
+    private String appendParams(Map<String, String> params) {
+        StringBuilder result = new StringBuilder();
+
+        if (MapUtils.isNotEmpty(params)) {
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                result.append(entry.getKey()).append("=").append(strEncode(entry.getValue())).append("&");
+            }
+        }
+
+        return result.toString();
+    }
+
+    private String strEncode(String str) {
+        try {
+            if (StringUtils.isNotBlank(str)) {
+                return URLEncoder.encode(str, "UTF-8");
+            }
+        } catch (UnsupportedEncodingException e) {
+            //ignore
+        }
+        return "";
+    }
+
+    private String getRandomTraceId() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+
 }