SpringCloud Gateway 整合Springfox(SwaggerUI3) 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题
2021/4/9 10:57:09
本文主要是介绍SpringCloud Gateway 整合Springfox(SwaggerUI3) 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
SpringCloud Gateway 整合Springfox/SwaggerUI3 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题
- 写在前边
- 问题描述
- 解决方案
- 效果
写在前边
当你看到这篇文章时,默认已经整合好了Springcloud/gateway/springfox(swaggerui3), 仅仅是在进行测试服务时出现问题。
问题描述
通过swagger-ui页面访问时会忽略服务名直接访问swagger映射出的接口,但是我们是通过网关转发的,这么一访问就直接404;如下所示:
出现这个问题,就是Servers映射没有达到我们的要求,我需要的是加上服务名的servers,但是默认却只有网关的ip和端口,没有当前的服务名;如下图所示:
很奇怪,我尝试通过在swagger配置中添加servers来改变这个Inferred Url,但是一直无效,debug后发现在AbstractDocumentationPluginsBootstrapper类中第96行执行之后就没有了,导致在请求时没有servers,然后swagger会创建一个默认的servers,这个默认的就是网关的ip+端口。
现在问题已经找到了,要么修改这个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/页面,就发现服务名已经添加成功了。
尝试请求一个接口,路径也正确。
至此,问题解决。
如果有什么疑问或更好的解决方案可在评论区留言,谢谢。
这篇关于SpringCloud Gateway 整合Springfox(SwaggerUI3) 之后调用某一个服务的接口时,请求路径不会加上对应的服务名问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署