实现swagger的代理请求和数据的格式化展示开发
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user