SpringCloud Gateway 整合Springfox/SwaggerUI3 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题
写在前边
当你看到这篇文章时,默认已经整合好了Springcloud/gateway/springfox(swaggerui3), 仅仅是在进行测试服务时出现问题。
问题描述
通过swagger-ui页面访问时会忽略服务名直接访问swagger映射出的接口,但是我们是通过网关转发的,这么一访问就直接404;如下所示:
现在问题已经找到了,要么修改这个scan方法,要么在请求时构建默认的 Inferred Url 时做手脚,看代码后发现请求时改这个创建默认的Inferred Url 比较简便,就修改了这个创建方式;默认的调用和创建方式如下:
解决方案
那么这样就可以创建一个完整包路径与它一样的包,自己创建一个名字一样的类来覆盖框架中的类,然后在创建Inferred Url时添加上服务名,服务名Swagger已经放到请求头中了,取出来添加上就可以了。
SpecGeneration.java
package springfox.documentation.oas.web;
import io.swagger.v3.oas.models.servers.Server;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import static org.slf4j.LoggerFactory.getLogger;
/**
* 尝试用该类替换框架中的类
*
* @author vains
* @date 2021/4/6 11:21
*/
@Slf4j
public class SpecGeneration {
private static final String HEADER_NAME = "X-Forwarded-Prefix";
private static final Logger LOGGER = getLogger(SpecGeneration.class);
public static final String OPEN_API_SPECIFICATION_PATH
= "${springfox.documentation.open-api.v3.path:/v3/api-docs}";
protected static final String HAL_MEDIA_TYPE = "application/hal+json";
private SpecGeneration() {
throw new UnsupportedOperationException();
}
/**
* 创建一个默认的 swagger 的server
*
* @param requestPrefix /v3/api-docs
* @param requestUrl 请求的url
* @return Server
*/
public static Server inferredServer(String requestPrefix, String requestUrl) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String serverUrl = requestUrl.replace(requestPrefix, "");
String header = null;
try {
URI url = new URI(requestUrl);
serverUrl = String.format("%s://%s:%s", url.getScheme(), url.getHost(), url.getPort());
header = request.getHeader(HEADER_NAME);
if (!StringUtils.isEmpty(header)) {
log.info("当前的服务为:{}", header);
serverUrl += header;
}
} catch (URISyntaxException e) {
LOGGER.error("Unable to parse request url:" + requestUrl);
}
String description = "Inferred Url";
if (!StringUtils.isEmpty(header)) {
description += " For " + header.substring(1);
}
return new Server()
.url(serverUrl)
.description(description);
}
public static String decode(String requestURI) {
try {
return URLDecoder.decode(requestURI, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
return requestURI;
}
}
}
注意,包的路径一定不能错!!然后这个类只要保证配置swagger的项目能够访问就可以了
效果
然后打开/swagger-ui/页面,就发现服务名已经添加成功了。
尝试请求一个接口,路径也正确。
至此,问题解决。
如果有什么疑问或更好的解决方案可在评论区留言,谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。