RouterService.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package cn.com.qmth.examcloud.app.service;
  2. import cn.com.qmth.examcloud.app.core.SysProperty;
  3. import cn.com.qmth.examcloud.app.core.router.Router;
  4. import cn.com.qmth.examcloud.app.core.utils.HttpClientBuilder;
  5. import cn.com.qmth.examcloud.app.model.Constants;
  6. import cn.com.qmth.examcloud.app.model.Result;
  7. import okhttp3.*;
  8. import org.apache.commons.collections.MapUtils;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.Assert;
  15. import java.io.UnsupportedEncodingException;
  16. import java.net.ConnectException;
  17. import java.net.URLEncoder;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20. import java.util.Random;
  21. import java.util.UUID;
  22. import static cn.com.qmth.examcloud.app.model.Constants.*;
  23. @Component
  24. public class RouterService {
  25. private static Logger log = LoggerFactory.getLogger(RouterService.class);
  26. private Random random = new Random();
  27. @Autowired
  28. private SysProperty sysProperty;
  29. public Result execute(Router router) {
  30. //校验参数
  31. Assert.notNull(router, "参数“router”不能为空!");
  32. Assert.notNull(router.getServer(), "参数“server”不能为空!");
  33. Assert.hasLength(router.getUrl(), "参数“url”不能为空!");
  34. Assert.notNull(router.getMethod(), "参数“method”不能为空!");
  35. //处理请求Headers
  36. Map<String, String> requestHeaders;
  37. if (MapUtils.isEmpty(router.getHeaders())) {
  38. requestHeaders = new HashMap<>();
  39. } else {
  40. requestHeaders = router.getHeaders();
  41. }
  42. String traceId = this.getRandomTraceId();
  43. requestHeaders.put(PARAM_KEY, router.getKey());
  44. requestHeaders.put(PARAM_TOKEN, router.getToken());
  45. requestHeaders.put(PARAM_TRACE_ID, traceId);
  46. requestHeaders.put(PARAM_CLIENT, PARAM_CLIENT_VALUE);
  47. //处理请求Params
  48. String requestParams = this.appendParams(router.getParams());
  49. //处理请求Body
  50. RequestBody requestBody = this.appendBody(router.getBody());
  51. //处理请求地址
  52. final String requestUrl = sysProperty.getProxyUrl(router.getServer()) + "/" + router.getUrl() + requestParams;
  53. log.info(String.format("[%s][%s][%s]%s ", traceId, router.getServer().getInstanceName(), router.getMethod().name(), requestUrl));
  54. //封装请求
  55. Request.Builder request = new Request.Builder()
  56. .url(requestUrl)
  57. .headers(Headers.of(requestHeaders));
  58. switch (router.getMethod()) {
  59. case GET:
  60. return this.call(request.get().build(), traceId);
  61. case POST:
  62. return this.call(request.post(requestBody).build(), traceId);
  63. case PUT:
  64. return this.call(request.put(requestBody).build(), traceId);
  65. case DELETE:
  66. return this.call(request.delete(requestBody).build(), traceId);
  67. default:
  68. return new Result().error("请求方式错误!");
  69. }
  70. }
  71. private Result call(Request request, String traceId) {
  72. OkHttpClient client = HttpClientBuilder.getClient();
  73. try (Response response = client.newCall(request).execute();
  74. ResponseBody body = response.body();) {
  75. String bodyStr = body.string();
  76. if (response.isSuccessful()) {
  77. return new Result().success(bodyStr);
  78. }
  79. log.warn(String.format("[%s][response] code:%s body:%s", traceId, response.code(), bodyStr));
  80. return new Result().error(bodyStr);
  81. } catch (Exception e) {
  82. log.error(e.getMessage(), e);
  83. if (e instanceof ConnectException) {
  84. return new Result().error("服务访问失败!");
  85. }
  86. }
  87. return new Result().error("请求异常!");
  88. }
  89. private RequestBody appendBody(String body) {
  90. if (StringUtils.isBlank(body)) {
  91. body = "";
  92. }
  93. return FormBody.create(MediaType.parse(Constants.CHARSET_JSON_UTF8), body);
  94. }
  95. private String appendParams(Map<String, String> params) {
  96. StringBuilder result = new StringBuilder();
  97. result.append("?r=").append(random.nextInt(10000));
  98. if (MapUtils.isNotEmpty(params)) {
  99. for (Map.Entry<String, String> entry : params.entrySet()) {
  100. if (StringUtils.isBlank(entry.getKey())) {
  101. continue;
  102. }
  103. result.append("&").append(entry.getKey()).append("=").append(strEncode(entry.getValue()));
  104. }
  105. }
  106. return result.toString();
  107. }
  108. private String strEncode(String str) {
  109. try {
  110. if (StringUtils.isNotBlank(str)) {
  111. return URLEncoder.encode(str, "UTF-8");
  112. }
  113. } catch (UnsupportedEncodingException e) {
  114. //ignore
  115. }
  116. return "";
  117. }
  118. private String getRandomTraceId() {
  119. return UUID.randomUUID().toString().replace("-", "");
  120. }
  121. }