Spring Boot部署Railway后Swagger请求报错:Failed to Fetch
问题描述
本地环境通过Swagger调用Spring Boot API完全正常,但部署到Railway平台后,Swagger测试API时弹出报错:
Failed to fetch.
Possible Reasons:
CORS
Network Failure
URL scheme must be "http" or "https" for CORS request.
推测是本地用HTTP协议、Railway自动启用HTTPS导致的冲突,添加了以下CORS配置但无效:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*"); } }
另外,用Postman直接调用https://exciting-wonder-production.up.railway.app/country能正常获取响应,但Swagger依旧报错。
核心原因
问题并非单纯的CORS配置错误,而是Swagger UI未适配Railway的HTTPS环境:Swagger UI页面运行在HTTPS协议下,但内部发起的API请求可能仍使用HTTP地址,触发跨协议的同源策略限制,导致URL scheme报错。Postman不受浏览器CORS规则约束,所以能正常请求。
解决方案
1. 配置Swagger适配HTTPS地址
根据你使用的Swagger版本,强制指定API的HTTPS访问地址:
Springfox(Swagger 2):
添加Swagger配置类,指定Railway域名和HTTPS协议:@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.your.package")) .paths(PathSelectors.any()) .build() .host("exciting-wonder-production.up.railway.app") .protocols(new HashSet<>(Arrays.asList("https"))); } }Springdoc(OpenAPI 3):
在application.properties中配置:springdoc.swagger-ui.url=https://exciting-wonder-production.up.railway.app/v3/api-docs server.forward-headers-strategy=NATIVE或通过配置类指定:
@Configuration public class OpenApiConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .servers(List.of(new Server().url("https://exciting-wonder-production.up.railway.app"))); } }
2. 优化CORS配置
替换通配符*为明确的Railway域名,并开启凭证支持:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("https://exciting-wonder-production.up.railway.app") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } }
3. 配置Spring Boot识别转发协议
Railway会转发外部请求,需要让Spring Boot正确识别HTTPS协议,在application.properties中添加:
server.forward-headers-strategy=NATIVE server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto
4. 验证请求地址
部署后打开Swagger UI,检查每个API的Try it out按钮对应的请求URL是否为HTTPS开头,确保与页面协议一致。
内容的提问来源于stack exchange,提问作者Lungu Mihai

