From 95072a02f6c6e3680e0b52ada60c945005b18641 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com>
Date: Thu, 12 Sep 2024 21:52:54 +0800
Subject: [PATCH] 5.0
---
.../storyweb/SopStoryApplicationTests.java | 17 --
sop-index/sop-index-service/pom.xml | 11 ++
.../com/gitee/sop/index/common/FileInfo.java | 21 ---
.../gitee/sop/index/common/RouteContext.java | 1 +
.../sop/index/controller/IndexController.java | 5 +-
.../index/exception/ExceptionExecutor.java | 2 +-
.../exception/impl/ExceptionExecutorImpl.java | 2 +-
.../index/{common => request}/ApiRequest.java | 2 +-
.../ApiRequestContext.java | 5 +-
.../request/ApiRequestContextFactory.java | 73 +++++++++
.../sop/index/request/ApiUploadContext.java | 46 ++++++
.../sop/index/request/UploadContext.java | 36 +++++
.../gitee/sop/index/service/RouteService.java | 2 +-
.../sop/index/service/RouteServiceImpl.java | 42 +++--
.../service/validate/AbstractSigner.java | 4 +-
.../index/service/validate/ApiValidator.java | 47 +++++-
.../sop/index/service/validate/Signer.java | 2 +-
.../sop/index/service/validate/Validator.java | 2 +-
.../service/validate/alipay/AlipaySigner.java | 4 +-
.../com/gitee/sop/index/util/RequestUtil.java | 152 ++++++++++++++++--
.../src/main/resources/application.properties | 15 ++
.../support/config/SopAutoConfiguration.java | 7 +
.../gitee/sop/support/request/FileData.java | 34 ++++
.../sop/support/request/OpenRequest.java | 92 -----------
24 files changed, 442 insertions(+), 182 deletions(-)
delete mode 100644 sop-example/sop-story/src/test/java/com/gitee/sop/storyweb/SopStoryApplicationTests.java
delete mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/FileInfo.java
rename sop-index/sop-index-service/src/main/java/com/gitee/sop/index/{common => request}/ApiRequest.java (99%)
rename sop-index/sop-index-service/src/main/java/com/gitee/sop/index/{common => request}/ApiRequestContext.java (79%)
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContextFactory.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiUploadContext.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/UploadContext.java
create mode 100644 sop-spring-boot-starter/src/main/java/com/gitee/sop/support/request/FileData.java
delete mode 100644 sop-spring-boot-starter/src/main/java/com/gitee/sop/support/request/OpenRequest.java
diff --git a/sop-example/sop-story/src/test/java/com/gitee/sop/storyweb/SopStoryApplicationTests.java b/sop-example/sop-story/src/test/java/com/gitee/sop/storyweb/SopStoryApplicationTests.java
deleted file mode 100644
index 8602a36d..00000000
--- a/sop-example/sop-story/src/test/java/com/gitee/sop/storyweb/SopStoryApplicationTests.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.gitee.sop.storyweb;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SopStoryApplicationTests {
-
- @Test
- public void contextLoads() {
- }
-
-}
-
diff --git a/sop-index/sop-index-service/pom.xml b/sop-index/sop-index-service/pom.xml
index 3cc1a793..ddd25c61 100644
--- a/sop-index/sop-index-service/pom.xml
+++ b/sop-index/sop-index-service/pom.xml
@@ -23,6 +23,13 @@
sop-index-api
5.0.0-SNAPSHOT
+
+ com.gitee.sop
+ sop-spring-boot-starter
+ 5.0.0-SNAPSHOT
+
+
+
org.springframework.boot
spring-boot-starter
@@ -67,6 +74,10 @@
org.apache.commons
commons-lang3
+
+ commons-fileupload
+ commons-fileupload
+
org.hibernate
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/FileInfo.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/FileInfo.java
deleted file mode 100644
index fd6772ca..00000000
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/FileInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.gitee.sop.index.common;
-
-import lombok.Data;
-
-/**
- * @author 六如
- */
-@Data
-public class FileInfo {
-
- /**
- * 文件名,包含后缀,如:aa.jpg
- */
- private String filename;
-
- /**
- * 文件内容
- */
- private byte[] content;
-
-}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/RouteContext.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/RouteContext.java
index 8cc20fc1..8fd9b2d3 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/RouteContext.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/RouteContext.java
@@ -1,5 +1,6 @@
package com.gitee.sop.index.common;
+import com.gitee.sop.index.request.ApiRequestContext;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
index 21374335..ea4bac79 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
@@ -1,13 +1,12 @@
package com.gitee.sop.index.controller;
-import com.gitee.sop.index.common.ApiRequest;
-import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.request.ApiRequest;
+import com.gitee.sop.index.request.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
import com.gitee.sop.index.service.RouteService;
import com.gitee.sop.index.util.RequestUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/ExceptionExecutor.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/ExceptionExecutor.java
index 82bc68b0..58a0c282 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/ExceptionExecutor.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/ExceptionExecutor.java
@@ -1,6 +1,6 @@
package com.gitee.sop.index.exception;
-import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.request.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
/**
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/impl/ExceptionExecutorImpl.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/impl/ExceptionExecutorImpl.java
index 3833b176..a74db615 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/impl/ExceptionExecutorImpl.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/exception/impl/ExceptionExecutorImpl.java
@@ -1,6 +1,6 @@
package com.gitee.sop.index.exception.impl;
-import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.request.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
import com.gitee.sop.index.exception.ApiException;
import com.gitee.sop.index.exception.ExceptionExecutor;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequest.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequest.java
similarity index 99%
rename from sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequest.java
rename to sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequest.java
index b098334c..dc1097ff 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequest.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequest.java
@@ -1,4 +1,4 @@
-package com.gitee.sop.index.common;
+package com.gitee.sop.index.request;
import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequestContext.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContext.java
similarity index 79%
rename from sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequestContext.java
rename to sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContext.java
index 2bd3078c..c277ef27 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiRequestContext.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContext.java
@@ -1,5 +1,6 @@
-package com.gitee.sop.index.common;
+package com.gitee.sop.index.request;
+import com.gitee.sop.support.request.FileData;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -33,5 +34,5 @@ public class ApiRequestContext {
/**
* 上传文件
*/
- private List files;
+ private UploadContext uploadContext;
}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContextFactory.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContextFactory.java
new file mode 100644
index 00000000..5448358a
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiRequestContextFactory.java
@@ -0,0 +1,73 @@
+package com.gitee.sop.index.request;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.gitee.sop.index.common.SopConstants;
+import com.gitee.sop.index.util.RequestUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.MediaType;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * @author 六如
+ */
+@Slf4j
+public class ApiRequestContextFactory {
+
+ private static final String CONTENT_TYPE = "content-type";
+ private static final String JSON_NAME = "json";
+ private static final String TEXT_NAME = "text";
+ private static final String MULTIPART = "multipart";
+ public static final String FORM = "form";
+
+ public static ApiRequestContext build(HttpServletRequest request) {
+ String contentType = request.getHeader(CONTENT_TYPE);
+ if (contentType == null) {
+ contentType = MediaType.APPLICATION_FORM_URLENCODED_VALUE;
+ }
+ ApiRequest apiRequest = new ApiRequest();
+ String ip = RequestUtil.getIP(request);
+ byte[] body;
+ try {
+ body = IOUtils.toByteArray(request.getInputStream());
+ } catch (IOException e) {
+ log.error("获取请求体失败", e);
+ body = new byte[0];
+ }
+ JSONObject params = null;
+ UploadContext uploadContext = null;
+ String contentTypeStr = contentType.toLowerCase();
+ // 如果是json方式提交
+ if (StringUtils.containsAny(contentTypeStr, JSON_NAME, TEXT_NAME)) {
+ apiRequest = JSON.parseObject(body, ApiRequest.class);
+ } else if (StringUtils.containsIgnoreCase(contentTypeStr, MULTIPART)) {
+ // 如果是文件上传请求
+ RequestUtil.UploadInfo uploadInfo = RequestUtil.getUploadInfo(request);
+ params = uploadInfo.getApiParam();
+ uploadContext = uploadInfo.getUploadContext();
+ } else if (StringUtils.containsIgnoreCase(contentTypeStr, FORM)) {
+ // APPLICATION_FORM_URLENCODED请求
+ params = RequestUtil.parseQuerystring(new String(body, SopConstants.CHARSET_UTF8));
+ } else {
+ // get请求,参数跟在url后面
+ params = RequestUtil.parseParameterMap(request.getParameterMap());
+ }
+ if (params != null) {
+ apiRequest = params.toJavaObject(ApiRequest.class);
+ }
+
+ return ApiRequestContext.builder()
+ .apiRequest(apiRequest)
+ .locale(request.getLocale())
+ .ip(ip)
+ .uploadContext(uploadContext)
+ .traceId(UUID.randomUUID().toString().replace("-", ""))
+ .build();
+ }
+
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiUploadContext.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiUploadContext.java
new file mode 100644
index 00000000..361ed72b
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/ApiUploadContext.java
@@ -0,0 +1,46 @@
+package com.gitee.sop.index.request;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 存放上传文件
+ *
+ * @author tanghc
+ */
+public class ApiUploadContext implements UploadContext {
+
+ /**
+ * key: 表单name
+ */
+ private Map> fileMap;
+ private List allFile;
+
+ public ApiUploadContext(Map> map) {
+ if (map == null) {
+ map = Collections.emptyMap();
+ }
+ this.fileMap = map;
+ this.allFile = new ArrayList<>();
+ map.values().forEach(list -> this.allFile.addAll(list));
+ }
+
+ @Override
+ public MultipartFile getFile(int index) {
+ return this.allFile.get(index);
+ }
+
+ @Override
+ public List getFile(String name) {
+ return fileMap.get(name);
+ }
+
+ @Override
+ public List getAllFile() {
+ return this.allFile;
+ }
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/UploadContext.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/UploadContext.java
new file mode 100644
index 00000000..cc1a68ce
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/request/UploadContext.java
@@ -0,0 +1,36 @@
+package com.gitee.sop.index.request;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 获取上传文件
+ *
+ * @author tanghc
+ */
+public interface UploadContext {
+ /**
+ * 根据索引获取上传文件,从0开始
+ *
+ * @param index
+ * @return 返回上传文件信息
+ */
+ MultipartFile getFile(int index);
+
+ /**
+ * 根据表单名获取上传文件
+ *
+ * @param name
+ * 表单名称
+ * @return 返回上传文件信息
+ */
+ List getFile(String name);
+
+ /**
+ * 获取所有的上传文件
+ *
+ * @return 返回所有的上传文件
+ */
+ List getAllFile();
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
index d06121db..c6cceaf3 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
@@ -1,6 +1,6 @@
package com.gitee.sop.index.service;
-import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.request.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
/**
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
index be01461c..8f847d9c 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
@@ -3,15 +3,16 @@ package com.gitee.sop.index.service;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.gitee.sop.index.common.ApiInfoDTO;
-import com.gitee.sop.index.common.ApiRequest;
-import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.request.ApiRequest;
+import com.gitee.sop.index.request.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
import com.gitee.sop.index.common.AttachmentNames;
import com.gitee.sop.index.common.ParamInfoDTO;
-import com.gitee.sop.index.common.ParamNames;
import com.gitee.sop.index.exception.ExceptionExecutor;
+import com.gitee.sop.index.request.UploadContext;
import com.gitee.sop.index.service.validate.Validator;
import com.gitee.sop.index.util.ClassUtil;
+import com.gitee.sop.support.request.FileData;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.rpc.RpcContext;
@@ -23,6 +24,7 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
/**
* 接口路由
@@ -69,7 +71,7 @@ public class RouteServiceImpl implements RouteService {
apiInfo.getInterfaceClassName(),
apiInfo.getMethodName(),
buildParamType(paramInfoList),
- buildInvokeParam(apiRequest, paramInfoList)
+ buildInvokeParam(apiRequestContext, paramInfoList)
);
if (result instanceof Map) {
((Map, ?>) result).remove(CLASS);
@@ -98,26 +100,36 @@ public class RouteServiceImpl implements RouteService {
.toArray(String[]::new);
}
- protected Object[] buildInvokeParam(ApiRequest apiRequest, List paramInfoList) {
+ protected Object[] buildInvokeParam(ApiRequestContext apiRequestContext, List paramInfoList) {
if (ObjectUtils.isEmpty(paramInfoList)) {
return new Object[0];
}
+ ApiRequest apiRequest = apiRequestContext.getApiRequest();
String bizContent = apiRequest.getBiz_content();
JSONObject jsonObject = JSON.parseObject(bizContent);
List