实现swagger的代理请求和数据的格式化展示开发

This commit is contained in:
暮光:城中城
2021-11-06 22:55:10 +08:00
parent 339a29e739
commit 2f1770dcbc
12 changed files with 546 additions and 41 deletions

View File

@@ -75,7 +75,8 @@ public class SwaggerDocumentController {
// UI地址替换为文档json地址
String docUrl = SwaggerDocUtil.replaceSwaggerResources(swaggerDoc.getDocUrl());
if (SwaggerDocUtil.isSwaggerResources(docUrl)) {
String resourcesStr = swaggerHttpRequestService.requestSwaggerUrl(request, docUrl);
String swaggerDomain = SwaggerDocUtil.getSwaggerResourceDomain(docUrl);
String resourcesStr = swaggerHttpRequestService.requestSwaggerUrl(request, docUrl, swaggerDomain);
List<SwaggerResource> resourceList = JSON.parseArray(resourcesStr, SwaggerResource.class);
if (resourceList == null || resourceList.isEmpty()) {
return DocResponseJson.warn("该地址未找到文档");
@@ -85,7 +86,6 @@ public class SwaggerDocumentController {
swaggerDocService.removeById(swaggerDoc.getId());
}
// 存明细地址
String swaggerDomain = SwaggerDocUtil.getSwaggerResourceDomain(docUrl);
for (SwaggerResource resource : resourceList) {
swaggerDoc.setId(null);
swaggerDoc.setDocUrl(swaggerDomain + resource.getUrl());

View File

@@ -5,6 +5,7 @@ import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.repository.manage.entity.SwaggerDoc;
import com.zyplayer.doc.data.service.manage.SwaggerDocService;
import com.zyplayer.doc.swaggerplus.controller.vo.SwaggerResourceVo;
import com.zyplayer.doc.swaggerplus.framework.utils.SwaggerDocUtil;
import com.zyplayer.doc.swaggerplus.service.SwaggerHttpRequestService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -63,7 +64,8 @@ public class SwaggerProxyController {
throw new ConfirmException("文档不存在");
}
if (Objects.equals(swaggerDoc.getDocType(), 1)) {
String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, swaggerDoc.getDocUrl());
String docsDomain = SwaggerDocUtil.getV2ApiDocsDomain(swaggerDoc.getDocUrl());
String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, swaggerDoc.getDocUrl(), docsDomain);
return new ResponseEntity<>(new Json(contentStr), HttpStatus.OK);
}
return new ResponseEntity<>(new Json(swaggerDoc.getJsonContent()), HttpStatus.OK);

View File

@@ -12,6 +12,7 @@ import java.util.List;
*/
public class ProxyRequestParam {
private String url;
private String host;
private String method;
private String contentType;
private String headerParam;
@@ -99,4 +100,12 @@ public class ProxyRequestParam {
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}

View File

@@ -8,6 +8,7 @@ public class ProxyRequestResultVo {
private List<HttpHeaderVo> headers;
private Integer status;
private Long useTime;
private Integer bodyLength;
private String data;
private String errorMsg;
@@ -58,4 +59,12 @@ public class ProxyRequestResultVo {
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public Integer getBodyLength() {
return bodyLength;
}
public void setBodyLength(Integer bodyLength) {
this.bodyLength = bodyLength;
}
}

View File

@@ -22,6 +22,24 @@ public class SwaggerDocUtil {
return "";
}
public static String getV2ApiDocsDomain(String docUrl) {
int index = docUrl.indexOf("/v2/api-docs");
if (index >= 0) {
return docUrl.substring(0, index);
}
return "";
}
public static String getDomainHost(String domain) {
domain = domain.replace("http://", "");
domain = domain.replace("https://", "");
int index = domain.indexOf("/");
if (index >= 0) {
return domain.substring(0, index);
}
return domain;
}
public static boolean isSwaggerLocation(String docUrl) {
return docUrl.contains("/v2/api-docs");
}

View File

@@ -2,6 +2,7 @@ package com.zyplayer.doc.swaggerplus.service;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.repository.manage.entity.SwaggerGlobalParam;
@@ -10,9 +11,9 @@ import com.zyplayer.doc.swaggerplus.controller.param.ProxyRequestParam;
import com.zyplayer.doc.swaggerplus.controller.vo.HttpCookieVo;
import com.zyplayer.doc.swaggerplus.controller.vo.HttpHeaderVo;
import com.zyplayer.doc.swaggerplus.controller.vo.ProxyRequestResultVo;
import com.zyplayer.doc.swaggerplus.framework.utils.SwaggerDocUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
@@ -32,13 +33,16 @@ public class SwaggerHttpRequestService {
private static final Map<String, Method> requestMethodMap = Stream.of(Method.values()).collect(Collectors.toMap(val -> val.name().toLowerCase(), val -> val));
List<String> domainHeaderKeys = Arrays.asList("referer", "origin");
List<String> needRequestHeaderKeys = Arrays.asList("user-agent");
/**
* 请求真实的swagger文档内容
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public String requestSwaggerUrl(HttpServletRequest request, String docUrl) {
public String requestSwaggerUrl(HttpServletRequest request, String docUrl, String docDomain) {
List<SwaggerGlobalParam> globalParamList = swaggerGlobalParamService.getGlobalParamList();
Map<String, Object> globalFormParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 1))
.collect(Collectors.toMap(SwaggerGlobalParam::getParamKey, SwaggerGlobalParam::getParamValue));
@@ -46,10 +50,15 @@ public class SwaggerHttpRequestService {
.collect(Collectors.toMap(SwaggerGlobalParam::getParamKey, SwaggerGlobalParam::getParamValue));
Map<String, String> globalCookieParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 3))
.collect(Collectors.toMap(SwaggerGlobalParam::getParamKey, SwaggerGlobalParam::getParamValue));
Map<String, String> requestHeaders = this.getHttpHeader(request, globalHeaderParamMap);
if (StringUtils.isNotBlank(docDomain)) {
domainHeaderKeys.forEach(key -> requestHeaders.put(key, docDomain));
requestHeaders.put("host", SwaggerDocUtil.getDomainHost(docDomain));
}
// 执行请求
String resultStr = HttpRequest.get(docUrl)
.form(globalFormParamMap)
.addHeaders(this.getHttpHeader(request, globalHeaderParamMap))
.addHeaders(requestHeaders)
.header("Accept", "application/json, text/javascript, */*; q=0.01")
.cookie(this.getHttpCookie(request, globalCookieParamMap))
.timeout(10000).execute().body();
@@ -71,9 +80,15 @@ public class SwaggerHttpRequestService {
if (method == null) {
throw new ConfirmException("不支持的请求方式:" + requestParam.getMethod());
}
HttpRequest httpRequest = new HttpRequest(requestParam.getUrl()).setMethod(method);
HttpRequest httpRequest = HttpUtil.createRequest(method, requestParam.getUrl());
// header获取
Map<String, String> requestHeaders = this.getHttpHeader(request, Collections.emptyMap());
if (StringUtils.isNotBlank(requestParam.getHost())) {
domainHeaderKeys.forEach(key -> requestHeaders.put(key, requestParam.getHost()));
requestHeaders.put("host", SwaggerDocUtil.getDomainHost(requestParam.getHost()));
}
// http自带参数
httpRequest.addHeaders(this.getHttpHeader(request, Collections.emptyMap()));
httpRequest.addHeaders(requestHeaders);
httpRequest.cookie(this.getHttpCookie(request, Collections.emptyMap()));
// 用户输入的参数
requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
@@ -90,6 +105,7 @@ public class SwaggerHttpRequestService {
HttpResponse httpResponse = httpRequest.timeout(10000).execute();
resultVo.setData(httpResponse.body());
resultVo.setStatus(httpResponse.getStatus());
resultVo.setBodyLength(httpResponse.bodyBytes().length);
// 设置返回的cookies
List<HttpCookie> responseCookies = httpResponse.getCookies();
if (CollectionUtils.isNotEmpty(responseCookies)) {
@@ -141,13 +157,11 @@ public class SwaggerHttpRequestService {
private Map<String, String> getHttpHeader(HttpServletRequest request, Map<String, String> globalHeaderParamMap) {
Map<String, String> headerParamMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
String[] notNeedHeaders = new String[]{"referer", "origin", "host"};
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
if (ArrayUtils.contains(notNeedHeaders, headerName)) {
continue;
String headerName = StringUtils.lowerCase(headerNames.nextElement());
if (needRequestHeaderKeys.contains(headerName)) {
headerParamMap.put(headerName, request.getHeader(headerName));
}
// headerParamMap.put(headerName, request.getHeader(headerName));
}
if (MapUtils.isNotEmpty(globalHeaderParamMap)) {
headerParamMap.putAll(globalHeaderParamMap);