带有 springdoc-openapi-ui (Swagger UI) 的 Spring Boot 2.2 应用程序运行 HTTP 端口。 应用程序部署到 Kubernetes,Ingress 将 HTTPS 请求从集群外部路由到服务。
在这种情况下,
https://example.com/api/swagger-ui.html
提供的 Swagger UI 有错误的“生成的服务器 url”-http://example.com/api
。虽然它应该是https://example.com/api
.
虽然 Swagger UI 通过 HTTPS 访问,但生成的服务器 URL 仍然使用 HTTP。
我有同样的问题。下面为我工作。
@OpenAPIDefinition(
servers = {
@Server(url = "/", description = "Default Server URL")
}
)
@SpringBootApplication
public class App {
// ...
}
如果接受的解决方案不适合您,那么您始终可以通过定义一个 bean 来手动设置 url。
@Bean
public OpenAPI customOpenAPI() {
Server server = new Server();
server.setUrl("https://example.com/api");
return new OpenAPI().servers(List.of(server));
}
并且可以通过属性定义 url 并在此处注入。
springdoc-openapi
常见问题解答有一个部分我如何部署Doployspringdoc-openapi-ui
,在反向代理后面?.
常见问题解答部分可以扩展。
确保 X-Forwarded 标头由您的代理发送(
X-Forwarded-For
、X-Forwarded-Proto
和其他)。
如果您使用的是 Undertow (
spring-boot-starter-undertow
),请设置属性 server.forward-headers-strategy=NATIVE
以使 Web 服务器本地处理 X-Forwarded 标头。另外,如果您不使用它,请考虑切换到 Undertow。
如果您使用的是 Tomcat (
spring-boot-starter-tomcat
),请设置属性 server.forward-headers-strategy=NATIVE
并确保列出所有内部代理的 IP 地址以信任属性 server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
。默认情况下,10/8、192.168/16、169.254/16 和 127/8 中的 IP 地址是受信任的。
或者,对于 Tomcat 设置属性
server.forward-headers-strategy=FRAMEWORK
.
有用的链接:
如果你有非默认上下文路径
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI openAPI(ServletContext servletContext) {
Server server = new Server().url(servletContext.getContextPath());
return new OpenAPI()
.servers(List.of(server))
// ...
}
}
使用@Server 注释使其默认为“/”。这将使 swagger API 使用
https
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.servers.Server;
@OpenAPIDefinition(servers = {@Server(url = "/", description = "Default Server URL")})
public class FormService implements ApplicationRunner {
....
}
下面为我工作。
@OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@SpringBootApplication
class App{
// ...
}
或
@OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@Configuration
public class OpenAPIConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info().title("App name")
.termsOfService("http://swagger.io/terms/")
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
}
}