From 3a5702c6765f2d6906136e6cbd5cd56de28c6214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9A=AE=E5=85=89=EF=BC=9A=E5=9F=8E=E4=B8=AD=E5=9F=8E?= <806783409@qq.com> Date: Sun, 16 Dec 2018 22:20:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91=EF=BC=8C?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BA=86=E6=98=A8=E6=99=9A=E5=A4=B1=E7=9C=A0?= =?UTF-8?q?=E5=88=B02=E7=82=B9=E6=83=B3=E5=88=B0=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E6=96=87=E6=A1=A3=E5=A4=A7=E4=B8=80=E7=BB=9F?= =?UTF-8?q?=E6=8C=87=E6=97=A5=E5=8F=AF=E5=BE=85~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zyplayer-doc-manage/pom.xml | 18 + .../com/zyplayer/doc/manage/Application.java | 13 +- .../config/SwaggerConfiguration.java | 4 +- .../config/security/WebSecurityConfig.java | 4 +- .../interceptor/RequestInfoInterceptor.java | 20 +- zyplayer-doc-swagger/README.md | 4 +- zyplayer-doc-swagger/pom.xml | 443 +++++++++--------- .../controller/MgDocumentController.java | 23 +- .../controller/ZyplayerSwaggerController.java | 67 +++ .../controller/param/HttpRequestParam.java | 393 ++++++++-------- .../controller/vo/SwaggerResourcesInfoVo.java | 54 ++- .../configuration/EnableSwaggerMgUi.java | 55 ++- .../SwaggerCommonConfiguration.java | 50 +- .../swagger/framework/constant/Consts.java | 8 + ...Filter.java => ZyplayerApiTestFilter.java} | 8 +- .../framework/filter/ZyplayerProxyFilter.java | 166 +++++++ .../src/main/resources/document.html | 4 +- .../main/resources/webjars/mg-ui/js/mg-ui.js | 4 +- 18 files changed, 821 insertions(+), 517 deletions(-) create mode 100644 zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/ZyplayerSwaggerController.java create mode 100644 zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/constant/Consts.java rename zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/{MgUiTestFilter.java => ZyplayerApiTestFilter.java} (92%) create mode 100644 zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerProxyFilter.java diff --git a/zyplayer-doc-manage/pom.xml b/zyplayer-doc-manage/pom.xml index ad930ce5..11ac0bed 100644 --- a/zyplayer-doc-manage/pom.xml +++ b/zyplayer-doc-manage/pom.xml @@ -27,6 +27,9 @@ 2.0 6.1.0 1.1.9 + 1.8.7 + 2.9.2 + 2.9.2 @@ -72,6 +75,11 @@ dozer-core ${dozer.core.version} + + io.springfox + springfox-swagger2 + ${springfox.swagger.version} + com.zyplayer @@ -83,6 +91,16 @@ zyplayer-doc-core ${zyplayer.doc.core.version} + + com.github.xiaoymin + swagger-bootstrap-ui + ${swagger.bootstrap.ui.version} + + + io.springfox + springfox-swagger-ui + ${springfox.swagger.ui.version} + org.apache.velocity diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java index 7c9ab575..351878a5 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java @@ -33,14 +33,17 @@ public class Application extends SpringBootServletInitializer { contextPath = (contextPath.length() <= 0 || contextPath.endsWith("/")) ? contextPath : contextPath + "/"; String hostAddress = InetAddress.getLocalHost().getHostAddress(); String serverPort = env.getProperty("server.port"); + String urlCtx = hostAddress + ":" + serverPort + "/" + contextPath; + // 三个UI的名字长度惊人的一致!肯定是知道我有强迫症! logger.info("\n----------------------------------------------------------\n\t" + "\t\t地址列表\n\t" + - "文档地址:http://{}:{}/{}document.html\n\t" + - //"数据库地址:http://{}:{}/{}document.html\n " + - "管理地址:http://{}:{}/{}statics/manage/home.html\n" + + "zyplayer-doc-swagger:http://{}document.html\n\t" + + "swagger-bootstrap-ui:http://{}doc.html\n\t" + + "springfox-swagger-ui:http://{}swagger-ui.html\n\t" + + //"数据库地址:http://{}document.html\n " + + "管理地址:http://{}statics/manage/home.html\n" + "----------------------------------------------------------", - hostAddress, serverPort, contextPath, - hostAddress, serverPort, contextPath + urlCtx, urlCtx, urlCtx, urlCtx ); } } diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/SwaggerConfiguration.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/SwaggerConfiguration.java index 2c0a801b..4a345b7c 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/SwaggerConfiguration.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/SwaggerConfiguration.java @@ -23,9 +23,9 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; * @since 2018年11月11日 */ @Configuration -@EnableSwagger2 +//@EnableSwagger2 @EnableSwaggerMgUi( - selfDoc = true,// 是否开启自身的文档 + selfDoc = false,// 是否开启自身的文档 defaultResources = {// 启动后第一次访问没有数据情况下需要加载进来的swagger-resources地址 //"http://localhost:8080/swagger-resources" } diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/security/WebSecurityConfig.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/security/WebSecurityConfig.java index 76803226..810fd275 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/security/WebSecurityConfig.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/security/WebSecurityConfig.java @@ -39,7 +39,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { */ @Override public void configure(WebSecurity web) throws Exception { - web.ignoring().antMatchers("/statics/lib/**", "/css/**", "/js/**", "/img/**", "/swagger-resources", "/v2/api-docs"); + web.ignoring().antMatchers("/statics/lib/**", "/css/**", "/js/**", "/img/**"); } @Override @@ -47,7 +47,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { String loginPage = "/statics/manage/login.html"; http.authorizeRequests().antMatchers("/login/**").permitAll()//为了测试其他功能,设置“ /** ”允许所有请求 - .antMatchers("/document.html").hasAuthority("DOC_ALL") + .antMatchers("/document.html", "/doc.html").hasAuthority("DOC_ALL") // 其他地址的访问均需登录 .anyRequest().authenticated().and() // 添加验证码验证 diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/interceptor/RequestInfoInterceptor.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/interceptor/RequestInfoInterceptor.java index b0f88842..49ddfbb6 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/interceptor/RequestInfoInterceptor.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/interceptor/RequestInfoInterceptor.java @@ -15,32 +15,30 @@ import javax.servlet.http.HttpServletResponse; @Component public class RequestInfoInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(RequestInfoInterceptor.class); - + private ThreadLocal startTimeThreadLocal = new ThreadLocal<>(); - + /** * 把当前请求记录到下来 */ @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) - throws Exception { + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) { long startTime = startTimeThreadLocal.get(); long totalTime = System.currentTimeMillis() - startTime;// 结束时间 - logger.error("总耗时:{}ms URI:{}", totalTime, request.getRequestURI()); + logger.error("总耗时:{}ms,URI:{}", totalTime, request.getRequestURI()); } - + @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object haddler, - ModelAndView modelAndView) throws Exception { + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object haddler, ModelAndView modelAndView) { } - + /** * 记录请求信息 */ @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) { startTimeThreadLocal.set(System.currentTimeMillis()); return true; } - + } diff --git a/zyplayer-doc-swagger/README.md b/zyplayer-doc-swagger/README.md index fd49c22f..29dd1a82 100644 --- a/zyplayer-doc-swagger/README.md +++ b/zyplayer-doc-swagger/README.md @@ -38,8 +38,8 @@ demo代码地址: #### 模拟请求拦截 功能: 判断是否是模拟请求,功能需求: 很多时候后端定义好了接口,但还未实现,这时前端已经需要数据调试了,这时就需要用到这个过滤器了! -在页面上先配置好模拟返回的数据,然后在url上加入参数:mgUiTestFlag=1 -例:http://192.168.0.249:8082/openApi/case/info?mgUiTestFlag=1 +在页面上先配置好模拟返回的数据,然后在url上加入参数:zyplayerApiTest=1 +例:http://192.168.0.249:8082/openApi/case/info?zyplayerApiTest=1 本过滤器就直接返回了之前配置的模拟数据,而不用等到后端必须把接口实现之后才能调试,或者在前端写一大段测试数据。也可以只复制本项目里的MgUiTestFilter.java代码到被访问的项目里 例:笔者的公司后端人较少,一个需求需要10个接口,需求分析完后首先就把接口、参数、返回值定义好,然后一个个的去实现。 diff --git a/zyplayer-doc-swagger/pom.xml b/zyplayer-doc-swagger/pom.xml index e53ab999..eeb5add0 100644 --- a/zyplayer-doc-swagger/pom.xml +++ b/zyplayer-doc-swagger/pom.xml @@ -1,220 +1,225 @@ - - - 4.0.0 - - com.zyplayer - zyplayer-doc-swagger - 2.0.1 - jar - zyplayer-doc-swagger - zyplayer-doc-swagger是swagger-ui的一个前端实现,使用简单、解析速度快、走心的设计,支持多项目同时展示,多种文档目录的展示方案,多种自定义配置,满足各种使用习惯 - https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc-swagger - - - zyplayer - 暮光:城中城 - 806783409@qq.com - - Java Development Engineer - - 2018-05-22 16:06:06 - - - - - org.springframework.boot - spring-boot-starter-parent - 1.4.2.RELEASE - - - - UTF-8 - UTF-8 - 1.8 - - true - ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} - 1.0.0 - - - - - org.springframework.boot - spring-boot-starter-web - - - io.springfox - springfox-swagger2 - 2.7.0 - - - com.alibaba - fastjson - 1.2.44 - - - cn.hutool - hutool-http - 4.1.8 - - - commons-lang - commons-lang - 2.6 - - - com.zyplayer - zyplayer-doc-core - ${zyplayer.doc.core.version} - - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - scm:git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git - scm:git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git - git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git - - - - - snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - snapshots - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - - - src/main/resources - META-INF/resources/ - - - src/main/java - - **/* - - - **/*.java - - false - - - src/main/webapp - - **/* - - false - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.2 - - true - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - UTF-8 - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - ${skipTests} - - - - - - - release - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - package - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.2 - - true - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - verify - - sign - - - - - - - - + + + 4.0.0 + + com.zyplayer + zyplayer-doc-swagger + 2.0.1 + jar + zyplayer-doc-swagger + zyplayer-doc-swagger是swagger-ui的一个前端实现,使用简单、解析速度快、走心的设计,支持多项目同时展示,多种文档目录的展示方案,多种自定义配置,满足各种使用习惯 + https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc-swagger + + + zyplayer + 暮光:城中城 + 806783409@qq.com + + Java Development Engineer + + 2018-05-22 16:06:06 + + + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + + true + ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} + 1.0.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + io.springfox + springfox-swagger2 + 2.7.0 + + + com.alibaba + fastjson + 1.2.44 + + + cn.hutool + hutool-http + 4.1.8 + + + commons-lang + commons-lang + 2.6 + + + commons-io + commons-io + 2.4 + + + com.zyplayer + zyplayer-doc-core + ${zyplayer.doc.core.version} + + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + scm:git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git + scm:git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git + git@git.oschina.net:zyplayer/zyplayer-doc-swagger.git + + + + + snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + + snapshots + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + src/main/resources + META-INF/resources/ + + + src/main/java + + **/* + + + **/*.java + + false + + + src/main/webapp + + **/* + + false + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.2 + + true + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + ${skipTests} + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + package + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.2 + + true + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + verify + + sign + + + + + + + + \ No newline at end of file diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java index 23da38d1..40f1313f 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java @@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; /** * 文档控制器 @@ -71,13 +72,13 @@ public class MgDocumentController { @PostMapping(value = "/docs") public void docs(HttpServletRequest request, HttpServletResponse response) { boolean needRestorage = true; - String choiseDocList = request.getParameter("choiseDocList"); + String choiceDocList = request.getParameter("choiseDocList"); // 转成set,防止重复 - Set resourcesSet = new HashSet<>(); + List resourcesSet = new LinkedList<>(); Set swaggerDocsDeleteSet = new HashSet<>(); - if (StringUtils.isNotBlank(choiseDocList)) { + if (StringUtils.isNotBlank(choiceDocList)) { needRestorage = false;// 选择的则不再存入 - for (String url : choiseDocList.split(",")) { + for (String url : choiceDocList.split(",")) { resourcesSet.add(new SwaggerResourcesInfoVo(url)); } } else { @@ -142,6 +143,7 @@ public class MgDocumentController { if (resourceList == null || resourceList.isEmpty()) { continue; } + resourcesInfoVo.setResourceList(resourceList); resourcesUrl = resourcesUrl.substring(0, resourcesUrl.lastIndexOf("/") + 1); for (SwaggerResource resource : resourceList) { String location = resource.getLocation(); @@ -181,6 +183,8 @@ public class MgDocumentController { } } if (needRestorage) { + AtomicInteger idIndex = new AtomicInteger(1); + resourcesSet.forEach(val -> val.setId(idIndex.getAndIncrement())); storageService.put(StorageKeys.SWAGGER_RESOURCES_LIST, JSON.toJSONString(resourcesSet)); } // 用默认的json解析要内存溢出,解析不了JSONObject、、就只有这样写了~ @@ -205,10 +209,9 @@ public class MgDocumentController { swaggerDocsDeleteSet.addAll(swaggerDocsDeleteList); } // 转成set,防止重复 - Set resourcesSet = new HashSet<>(); + List resourcesList = null; if (StringUtils.isNotBlank(swaggerResourcesStr)) { - List resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); - resourcesSet.addAll(resourcesList); + resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); } try { String resourcesStr = HttpRequest.get(resourcesUrl).timeout(3000).execute().body(); @@ -233,7 +236,9 @@ public class MgDocumentController { location = resourcesDomain + location; swaggerDocsDeleteSet.remove(location); } - resourcesSet.add(new SwaggerResourcesInfoVo(resourcesUrl)); + resourcesList.add(new SwaggerResourcesInfoVo(resourcesUrl, resourceList)); + AtomicInteger idIndex = new AtomicInteger(1); + resourcesList.forEach(val -> val.setId(idIndex.getAndIncrement())); } catch (Exception e) { // 暂不想支持直接添加地址 // try { @@ -254,7 +259,7 @@ public class MgDocumentController { return DocResponseJson.warn("该地址查找文档失败"); // } } - storageService.put(StorageKeys.SWAGGER_RESOURCES_LIST, JSON.toJSONString(resourcesSet)); + storageService.put(StorageKeys.SWAGGER_RESOURCES_LIST, JSON.toJSONString(resourcesList)); storageService.put(StorageKeys.SWAGGER_DOCS_DELETE_LIST, JSON.toJSONString(swaggerDocsDeleteSet)); return DocResponseJson.ok(); } diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/ZyplayerSwaggerController.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/ZyplayerSwaggerController.java new file mode 100644 index 00000000..93c83638 --- /dev/null +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/ZyplayerSwaggerController.java @@ -0,0 +1,67 @@ +package com.zyplayer.doc.swagger.controller; + +import com.alibaba.fastjson.JSON; +import com.zyplayer.doc.swagger.controller.vo.SwaggerResourcesInfoVo; +import com.zyplayer.doc.swagger.framework.constant.Consts; +import com.zyplayer.doc.swagger.framework.constant.StorageKeys; +import com.zyplayer.doc.swagger.framework.service.MgStorageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.swagger.web.ApiKeyVehicle; +import springfox.documentation.swagger.web.SecurityConfiguration; +import springfox.documentation.swagger.web.SwaggerResource; +import springfox.documentation.swagger.web.UiConfiguration; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * 承接了所有的ApiResourceController的接口 + * + * @author 暮光:城中城 + * @since 2018年12月16日 + */ +@RestController +public class ZyplayerSwaggerController { + + @Autowired + private MgStorageService storageService; + + @RequestMapping("/swagger-resources") + public List swaggerResources() { + String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); + List resourcesInfoVoList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); + if (resourcesInfoVoList == null || resourcesInfoVoList.isEmpty()) { + return Collections.emptyList(); + } + List resourceList = new LinkedList<>(); + resourcesInfoVoList.forEach(resource -> { + resource.getResourceList().forEach(val -> { + String location = val.getLocation(); + val.setLocation(Consts.ZYPLAYER_PROXY + resource.getId() + location); + }); + resourceList.addAll(resource.getResourceList()); + }); + return resourceList; + } + + @ResponseBody + @RequestMapping(value = "/swagger-resources/configuration/security") + public ResponseEntity securityConfiguration() { + SecurityConfiguration securityConfiguration = new SecurityConfiguration(null, null, null, null, null, ApiKeyVehicle.HEADER, "api_key", ","); + return new ResponseEntity<>(securityConfiguration, HttpStatus.OK); + } + + @ResponseBody + @RequestMapping(value = "/swagger-resources/configuration/ui") + public ResponseEntity uiConfiguration() { + UiConfiguration uiConfiguration = new UiConfiguration(null); + return new ResponseEntity<>(uiConfiguration, HttpStatus.OK); + } +} + diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java index 1337af41..5a6c7f6a 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java @@ -1,197 +1,196 @@ -package com.zyplayer.doc.swagger.controller.param; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.lang.StringUtils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; - -import cn.hutool.http.HttpRequest; -import cn.hutool.http.Method; - -/** - * 请求参数对象 - * - * @author 暮光:城中城 - * @since 2018年8月21日 - */ -public class HttpRequestParam { - private String url; - private String method; - private String header; - private String form; - private String body; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getHeader() { - return header; - } - - public void setHeader(String header) { - this.header = header; - } - - public String getForm() { - return form; - } - - public void setForm(String form) { - this.form = form; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - - public Map getHeaderMap() { - if (StringUtils.isBlank(header)) { - return null; - } - Map headerMap = JSON.parseObject(header, new TypeReference>() { - }); - return headerMap; - } - - public Map getFormMap() { - if (StringUtils.isBlank(form)) { - return null; - } - Map formMap = JSON.parseObject(form, new TypeReference>() {}); - return formMap; - } - - public void createHttpRequest(HttpRequest request) { - Map headerMap = this.getHeaderMap(); - if (headerMap != null) { - request.addHeaders(headerMap); - if (headerMap.containsKey("Content-Type")) { - request.contentType(headerMap.get("Content-Type")); - } - } - Map formMap = this.getFormMap(); - if (formMap != null) { - request.form(formMap); - } - if (StringUtils.isNotBlank(body) && request.getMethod() != Method.GET) { - request.body(body); - } - } - - /** - * 组装请求 - * @return HttpRequest - */ - public HttpRequest createRequest() { - if("get".equalsIgnoreCase(this.method)) return get(); - if("post".equalsIgnoreCase(this.method)) return post(); - if("head".equalsIgnoreCase(this.method)) return head(); - if("options".equalsIgnoreCase(this.method)) return options(); - if("put".equalsIgnoreCase(this.method)) return put(); - if("patch".equalsIgnoreCase(this.method)) return patch(); - if("delete".equalsIgnoreCase(this.method)) return delete(); - if("trace".equalsIgnoreCase(this.method)) return trace(); - return get(); - } - - /** - * POST请求 - * @return HttpRequest - */ - public HttpRequest post() { - HttpRequest request = HttpRequest.post(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * GET请求 - * @return HttpRequest - */ - public HttpRequest get() { - HttpRequest request = HttpRequest.get(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * HEAD请求 - * @return HttpRequest - */ - public HttpRequest head() { - HttpRequest request = HttpRequest.head(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * OPTIONS请求 - * @return HttpRequest - */ - public HttpRequest options() { - HttpRequest request = HttpRequest.options(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * PUT请求 - * @return HttpRequest - */ - public HttpRequest put() { - HttpRequest request = HttpRequest.put(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * PATCH请求 - * @return HttpRequest - */ - public HttpRequest patch() { - HttpRequest request = HttpRequest.patch(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * DELETE请求 - * @return HttpRequest - */ - public HttpRequest delete() { - HttpRequest request = HttpRequest.delete(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - /** - * TRACE请求 - * @return HttpRequest - */ - public HttpRequest trace() { - HttpRequest request = HttpRequest.trace(this.getUrl()); - this.createHttpRequest(request); - return request; - } - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - -} +package com.zyplayer.doc.swagger.controller.param; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.Method; + +/** + * 请求参数对象 + * + * @author 暮光:城中城 + * @since 2018年8月21日 + */ +public class HttpRequestParam { + private String url; + private String method; + private String header; + private String form; + private String body; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getHeader() { + return header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getForm() { + return form; + } + + public void setForm(String form) { + this.form = form; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Map getHeaderMap() { + if (StringUtils.isBlank(header)) { + return null; + } + Map headerMap = JSON.parseObject(header, new TypeReference>() {}); + return headerMap; + } + + public Map getFormMap() { + if (StringUtils.isBlank(form)) { + return null; + } + Map formMap = JSON.parseObject(form, new TypeReference>() {}); + return formMap; + } + + public void createHttpRequest(HttpRequest request) { + Map headerMap = this.getHeaderMap(); + if (headerMap != null) { + request.addHeaders(headerMap); + if (headerMap.containsKey("Content-Type")) { + request.contentType(headerMap.get("Content-Type")); + } + } + Map formMap = this.getFormMap(); + if (formMap != null) { + request.form(formMap); + } + if (StringUtils.isNotBlank(body) && request.getMethod() != Method.GET) { + request.body(body); + } + } + + /** + * 组装请求 + * @return HttpRequest + */ + public HttpRequest createRequest() { + if("get".equalsIgnoreCase(this.method)) return get(); + if("post".equalsIgnoreCase(this.method)) return post(); + if("head".equalsIgnoreCase(this.method)) return head(); + if("options".equalsIgnoreCase(this.method)) return options(); + if("put".equalsIgnoreCase(this.method)) return put(); + if("patch".equalsIgnoreCase(this.method)) return patch(); + if("delete".equalsIgnoreCase(this.method)) return delete(); + if("trace".equalsIgnoreCase(this.method)) return trace(); + return get(); + } + + /** + * POST请求 + * @return HttpRequest + */ + public HttpRequest post() { + HttpRequest request = HttpRequest.post(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * GET请求 + * @return HttpRequest + */ + public HttpRequest get() { + HttpRequest request = HttpRequest.get(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * HEAD请求 + * @return HttpRequest + */ + public HttpRequest head() { + HttpRequest request = HttpRequest.head(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * OPTIONS请求 + * @return HttpRequest + */ + public HttpRequest options() { + HttpRequest request = HttpRequest.options(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * PUT请求 + * @return HttpRequest + */ + public HttpRequest put() { + HttpRequest request = HttpRequest.put(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * PATCH请求 + * @return HttpRequest + */ + public HttpRequest patch() { + HttpRequest request = HttpRequest.patch(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * DELETE请求 + * @return HttpRequest + */ + public HttpRequest delete() { + HttpRequest request = HttpRequest.delete(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + /** + * TRACE请求 + * @return HttpRequest + */ + public HttpRequest trace() { + HttpRequest request = HttpRequest.trace(this.getUrl()); + this.createHttpRequest(request); + return request; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + +} diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java index ac9a60eb..e71a1814 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java @@ -2,50 +2,82 @@ package com.zyplayer.doc.swagger.controller.vo; import cn.hutool.core.util.RandomUtil; import com.zyplayer.doc.swagger.framework.constant.StorageKeys; +import springfox.documentation.swagger.web.SwaggerResource; +import java.io.Serializable; import java.util.Date; +import java.util.List; -public class SwaggerResourcesInfoVo { +public class SwaggerResourcesInfoVo implements Serializable { + private Integer id; private String url; private String storageKey; + private List resourceList; private Date creationTime; private Date lastSync; - - public SwaggerResourcesInfoVo(String url){ + + public SwaggerResourcesInfoVo() { + + } + + public SwaggerResourcesInfoVo(String url) { this.url = url; this.storageKey = StorageKeys.SWAGGER_OFFLINE_DOC_START + RandomUtil.simpleUUID(); this.creationTime = new Date(); } - + + public SwaggerResourcesInfoVo(String url, List resourceList) { + this.url = url; + this.resourceList = resourceList; + this.storageKey = StorageKeys.SWAGGER_OFFLINE_DOC_START + RandomUtil.simpleUUID(); + this.creationTime = new Date(); + } + public String getUrl() { return url; } - + public void setUrl(String url) { this.url = url; } - + public String getStorageKey() { return storageKey; } - + public void setStorageKey(String storageKey) { this.storageKey = storageKey; } - + public Date getCreationTime() { return creationTime; } - + public void setCreationTime(Date creationTime) { this.creationTime = creationTime; } - + public Date getLastSync() { return lastSync; } - + public void setLastSync(Date lastSync) { this.lastSync = lastSync; } + + public List getResourceList() { + return resourceList; + } + + public void setResourceList(List resourceList) { + this.resourceList = resourceList; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } } diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/EnableSwaggerMgUi.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/EnableSwaggerMgUi.java index 4b2563bb..21adfe14 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/EnableSwaggerMgUi.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/EnableSwaggerMgUi.java @@ -1,26 +1,29 @@ -package com.zyplayer.doc.swagger.framework.configuration; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import org.springframework.context.annotation.Import; - -@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) -@Target(value = { java.lang.annotation.ElementType.TYPE }) -@Documented -@Import({ SwaggerCommonConfiguration.class, SpringContextUtil.class }) -public @interface EnableSwaggerMgUi { - - /** - * 是否自动把自身的swagger-resources加进来 - * @return 配置 - */ - boolean selfDoc() default true; - - /** - * 启动后第一次访问没有数据情况下需要加载进来的swagger-resources地址 - * @return swagger-resources地址 - */ - String[] defaultResources() default {}; -} +package com.zyplayer.doc.swagger.framework.configuration; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import com.zyplayer.doc.swagger.framework.filter.ZyplayerProxyFilter; +import org.springframework.context.annotation.Import; + +@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@Target(value = {java.lang.annotation.ElementType.TYPE}) +@Documented +@Import({SwaggerCommonConfiguration.class, SpringContextUtil.class, ZyplayerProxyFilter.class}) +public @interface EnableSwaggerMgUi { + + /** + * 是否自动把自身的swagger-resources加进来 + * + * @return 配置 + */ + boolean selfDoc() default true; + + /** + * 启动后第一次访问没有数据情况下需要加载进来的swagger-resources地址 + * + * @return swagger-resources地址 + */ + String[] defaultResources() default {}; +} diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/SwaggerCommonConfiguration.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/SwaggerCommonConfiguration.java index 0817e4ae..e68e4c58 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/SwaggerCommonConfiguration.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/configuration/SwaggerCommonConfiguration.java @@ -1,25 +1,25 @@ -package com.zyplayer.doc.swagger.framework.configuration; - -import org.springframework.context.annotation.ComponentScan; - -//@EnableAutoConfiguration -@ComponentScan(basePackages = { - "com.zyplayer.doc.swagger.controller", - "com.zyplayer.doc.swagger.framework.service", -}) -public class SwaggerCommonConfiguration { - -// 不再默认开启拦截 -// @Autowired -// private MgUiTestFilter mgUiTestFilter; -// -// @Bean -// public FilterRegistrationBean mockTestFilter() { -// FilterRegistrationBean registration = new FilterRegistrationBean(); -// registration.setFilter(mgUiTestFilter); -// registration.addUrlPatterns("/*"); -// registration.setName("mgUiTestFilter"); -// registration.setOrder(2); -// return registration; -// } -} +package com.zyplayer.doc.swagger.framework.configuration; + +import org.springframework.context.annotation.ComponentScan; + +//@EnableAutoConfiguration +@ComponentScan(basePackages = { + "com.zyplayer.doc.swagger.controller", + "com.zyplayer.doc.swagger.framework.service", +}) +public class SwaggerCommonConfiguration { + +// 不再默认开启拦截 +// @Autowired +// private ZyplayerApiTestFilter mgUiTestFilter; +// +// @Bean +// public FilterRegistrationBean mockTestFilter() { +// FilterRegistrationBean registration = new FilterRegistrationBean(); +// registration.setFilter(mgUiTestFilter); +// registration.addUrlPatterns("/*"); +// registration.setName("mgUiTestFilter"); +// registration.setOrder(2); +// return registration; +// } +} diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/constant/Consts.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/constant/Consts.java new file mode 100644 index 00000000..44be0bef --- /dev/null +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/constant/Consts.java @@ -0,0 +1,8 @@ +package com.zyplayer.doc.swagger.framework.constant; + +public class Consts { + + public static final String ZYPLAYER_PROXY = "/zyplayer-proxy/"; + public static final String V2_API_DOCS = "/v2/api-docs"; + public static final String SWAGGER_RESOURCES = "/swagger-resources"; +} diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/MgUiTestFilter.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerApiTestFilter.java similarity index 92% rename from zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/MgUiTestFilter.java rename to zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerApiTestFilter.java index 62594356..19d69f3e 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/MgUiTestFilter.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerApiTestFilter.java @@ -19,8 +19,8 @@ import com.zyplayer.doc.swagger.framework.service.MgStorageService; * 有需要此拦截器的请自行拷贝至自身项目,需要使过滤器生效,文档不再开启@Component
* 判断是否是模拟请求,功能需求:
* 很多时候后端定义好了接口,但还未实现,这时前端已经需要数据调试了,这时就需要用到这个过滤器了!
- * 在页面上先配置好模拟返回的数据,然后在url上加入参数:mgUiTestFlag=1
- * 例:http://192.168.0.249:8082/openApi/case/info?mgUiTestFlag=1
+ * 在页面上先配置好模拟返回的数据,然后在url上加入参数:zyplayerApiTest=1
+ * 例:http://192.168.0.249:8082/openApi/case/info?zyplayerApiTest=1
* 本过滤器就直接返回了之前配置的模拟数据,而不用等到后端必须把接口实现之后才能调试,或者在前端写一大段测试数据。
*

* 例:笔者的公司后端人较少,一个需求需要10个接口,需求分析完后首先就把接口、参数、返回值定义好,然后一个个的去实现。 @@ -28,7 +28,7 @@ import com.zyplayer.doc.swagger.framework.service.MgStorageService; * 而不是一味的催后台,把各种锅丢给后端,然后玩自己的去了,浪费各环节等待时间。 */ //@Component -public class MgUiTestFilter implements Filter { +public class ZyplayerApiTestFilter implements Filter { @Autowired private MgStorageService mgStorageService; @@ -41,7 +41,7 @@ public class MgUiTestFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 需要使用模拟值返回的标记 - String mockTestFlag = request.getParameter("mgUiTestFlag"); + String mockTestFlag = request.getParameter("zyplayerApiTest"); if (!"1".equals(mockTestFlag)) { // 未开启直接跳过 chain.doFilter(request, response); diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerProxyFilter.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerProxyFilter.java new file mode 100644 index 00000000..b2090546 --- /dev/null +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/framework/filter/ZyplayerProxyFilter.java @@ -0,0 +1,166 @@ +package com.zyplayer.doc.swagger.framework.filter; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.zyplayer.doc.swagger.controller.param.HttpRequestParam; +import com.zyplayer.doc.swagger.controller.vo.SwaggerResourcesInfoVo; +import com.zyplayer.doc.swagger.framework.constant.Consts; +import com.zyplayer.doc.swagger.framework.constant.StorageKeys; +import com.zyplayer.doc.swagger.framework.service.MgStorageService; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.HttpCookie; +import java.util.*; + +/** + * 请求代理过滤器 + * 使得所有的swagger-ui都可以查看所有的文档,目标是:文档大一统~ + * + * @author 暮光:城中城 + * @since 2019年12月16日 + */ +@Component +public class ZyplayerProxyFilter implements Filter { + + private static final Logger logger = LoggerFactory.getLogger(ZyplayerProxyFilter.class); + + @Autowired + private MgStorageService mgStorageService; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void destroy() { + + } + + public static void main(String[] args) { +// String requestUrl = "http://192.168.0.249:8082/zyplayer-doc-manage/zyplayer-proxy/1/v2/api-docs"; +// int proxyIndex = requestUrl.indexOf(Consts.ZYPLAYER_PROXY); +// if (proxyIndex < 0) { +// return; +// } +// String requestUrlEnd = requestUrl.substring(proxyIndex + Consts.ZYPLAYER_PROXY.length()); +// int idIndex = requestUrlEnd.indexOf("/"); +// String idStr = requestUrlEnd.substring(0, idIndex); + + String resource = "{\"swagger\":\"2.0\",\"host\":\"127.0.0.1:8999\",\"basePath\":\"/\",\"tags\":"; + resource = resource.replaceFirst("\"basePath\":\".*?\"", "\"basePath\":\"/xxxxx\""); + System.out.println(resource); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse servletResponse = (HttpServletResponse) response; + String method = httpServletRequest.getMethod(); + String requestUrl = httpServletRequest.getRequestURL().toString(); + String bodyStr = IOUtils.toString(httpServletRequest.getInputStream(), "utf-8"); + + int proxyIndex = requestUrl.indexOf(Consts.ZYPLAYER_PROXY); + if (proxyIndex < 0) { + // 不是拦截接口直接跳过 + chain.doFilter(request, response); + return; + } + long startTime = System.currentTimeMillis(); + String requestUrlEnd = requestUrl.substring(proxyIndex + Consts.ZYPLAYER_PROXY.length()); + int idIndex = requestUrlEnd.indexOf("/"); + String proxyUrlEnd = requestUrlEnd.substring(idIndex); + String idStr = requestUrlEnd.substring(0, idIndex); + Integer docId = Integer.valueOf(idStr); + + String swaggerResourcesStr = mgStorageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); + List resourcesInfoVoList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); + if (resourcesInfoVoList == null || resourcesInfoVoList.isEmpty()) { + this.send(startTime, requestUrl, servletResponse, "文档为空,请刷新重试"); + return; + } + // 找到真正被代理的对象 + String proxyUrl = null; + for (SwaggerResourcesInfoVo swaggerResourcesInfoVo : resourcesInfoVoList) { + if (Objects.equals(swaggerResourcesInfoVo.getId(), docId)) { + proxyUrl = swaggerResourcesInfoVo.getUrl(); + break; + } + } + if (StringUtils.isBlank(proxyUrl)) { + this.send(startTime, requestUrl, servletResponse, "未找到对应文档,请刷新重试"); + return; + } + // 组装URL + proxyUrl = proxyUrl.replace(Consts.SWAGGER_RESOURCES, proxyUrlEnd); + HttpRequestParam param = new HttpRequestParam(); + param.setUrl(proxyUrl); + param.setMethod(method); + HttpRequest httpRequest = param.createRequest(); + // 组装参数 + Map parameterMap = httpServletRequest.getParameterMap(); + if (parameterMap != null && parameterMap.size() > 0) { + for (Map.Entry entry : parameterMap.entrySet()) { + httpRequest.form(entry.getKey(), entry.getValue()); + } + } + // 请求体 + if (StringUtils.isNotBlank(bodyStr)) { + httpRequest.body(bodyStr); + } + // header + Enumeration headerNames = httpServletRequest.getHeaderNames(); + if (headerNames != null) { + while (headerNames.hasMoreElements()) { + String element = headerNames.nextElement(); + httpRequest.header(element, httpServletRequest.getHeader(element)); + } + } + // cookies + Cookie[] cookies = httpServletRequest.getCookies(); + if (cookies != null && cookies.length > 0) { + List httpCookieList = new LinkedList<>(); + for (int i = 0; i < cookies.length; i++) { + HttpCookie httpCookie = new HttpCookie(cookies[i].getName(), cookies[i].getValue()); + httpCookieList.add(httpCookie); + } + httpRequest.cookie(httpCookieList.toArray(new HttpCookie[]{})); + } + String resultStr = httpRequest.execute().body(); + if (proxyUrl.indexOf(Consts.V2_API_DOCS) >= 0) { + // "basePath":"/" 替换成 "basePath":"/zyplayer-doc-manage/zyplayer-proxy/2/",使其走代理接口 + ServletContext servletContext = httpServletRequest.getServletContext(); + Object ctx = servletContext.getAttribute("ctx"); + ctx = (ctx + Consts.ZYPLAYER_PROXY + idStr).replaceAll("//", "/"); + resultStr = resultStr.replaceFirst("\"basePath\":\".*?\"", "\"basePath\":\"" + ctx + "\""); + // 替换host为当前项目的 + String requestUrlHost = requestUrl.substring(0, proxyIndex + Consts.ZYPLAYER_PROXY.length()); + requestUrlHost = requestUrlHost.replace("http://", ""); + requestUrlHost = requestUrlHost.substring(0, requestUrlHost.indexOf("/")); + resultStr = resultStr.replaceFirst("\"host\":\".*?\"", "\"host\":\"" + requestUrlHost + "\""); + } + this.send(startTime, proxyUrl, servletResponse, resultStr); + } + + public void send(Long startTime, String requestUrl, HttpServletResponse response, String result) throws IOException { + response.setStatus(200); + // response.setContentType("application/json"); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Cache-Control", "no-cache, must-revalidate"); + response.getWriter().write(result); + Long totalTime = System.currentTimeMillis() - startTime; + logger.error("代理请求结束,总耗时:{}ms,URI:{}", totalTime, requestUrl); + } +} diff --git a/zyplayer-doc-swagger/src/main/resources/document.html b/zyplayer-doc-swagger/src/main/resources/document.html index 20925aea..09d8a365 100644 --- a/zyplayer-doc-swagger/src/main/resources/document.html +++ b/zyplayer-doc-swagger/src/main/resources/document.html @@ -300,8 +300,8 @@ 功能说明 - 访问接口时增加参数:mgUiTestFlag=1,即可返回下面提交的模拟返回值
- 需要被访问项目增加 MgUiTestFilter.java + 访问接口时增加参数:zyplayerApiTest=1,即可返回下面提交的模拟返回值
+ 需要被访问项目增加 ZyplayerApiTestFilter.java 过滤器才能使用,里面逻辑很简单,一看就懂~ diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js index a663915c..0a8798a5 100644 --- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js +++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js @@ -334,8 +334,8 @@ $("#apiPathTree").on("click", ".show-doc", function(){ $("#postUrlInput").val(data.domain + docUrl); // 处理模拟返回 $("#simulationResultUrl").text(docUrl); - $("#simulationResultUrlTest").text(data.domain + docUrl + "?mgUiTestFlag=1"); - $("#simulationResultUrlTest").attr("href", data.domain + docUrl + "?mgUiTestFlag=1"); + $("#simulationResultUrlTest").text(data.domain + docUrl + "?zyplayerApiTest=1"); + $("#simulationResultUrlTest").attr("href", data.domain + docUrl + "?zyplayerApiTest=1"); $("#simulationResultText").val(""); getStorage('p-simulation-response-' + docUrl, function(data){ var resultText = getNotEmptyStr(data);