Angular调用Spring Boot网关报Unknown Error,请求直达服务正常
问题排查:Angular向Spring Cloud Gateway发送POST请求报0 Unknown Error
Angular应用向Spring Boot API Gateway发送POST请求时,收到错误提示:Http failure response for http://localhost:8080/api/user/auth/login: 0 Unknown Error。直接调用user-service接口正常,但走网关就报错,网关日志无错误,浏览器控制台也无更多有效信息,相关配置如下:
API Gateway application.properties配置
eureka.client.register-with-eureka=true eureka.client.fetch-registry=true spring.application.name=api-gateway eureka.client.service-url.defaultZone= http://localhost:8761/eureka server.port=8080 ## LOGS logging.level.root=INFO #class responsible for defining and identifying routes logging.level.org.springframework.cloud.gateway.route.RouteDefinitionLocator = INFO logging.level.org.springframework.cloud.gateway = TRACE ## END LOGS ## Routes spring.cloud.gateway.routes[0].id=user-service spring.cloud.gateway.routes[0].uri = lb://user-service spring.cloud.gateway.routes[0].predicates[0]=Path=/api/user/**
控制台错误截图

API Gateway当前CORS配置
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") // Replace with your Angular application's URL .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("Content-Type", "Authorization"); } }
补充说明:修改Angular请求URL直接调用user-service时,一切运行正常。
排查及解决步骤
1. 替换Gateway的CORS配置方式
Spring Cloud Gateway基于WebFlux,原WebMvcConfigurer的CORS配置对网关完全无效,这是导致浏览器拦截请求、报0 Unknown Error的核心原因之一。请替换为Gateway专属配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; @Configuration public class GatewayCorsConfig { @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
2. 验证网关路由转发有效性
- 用Postman直接请求网关地址
http://localhost:8080/api/user/auth/login:- 若Postman也报错,说明路由匹配、服务发现或转发逻辑存在问题
- 若Postman正常响应,可确认问题仍聚焦在浏览器跨域规则
- 打开Eureka控制台
http://localhost:8761,确认user-service已正常注册,且网关能拉取到服务实例
3. 分析网关TRACE日志
重点查看以下日志内容:
- 路由匹配日志:确认请求是否命中了
user-service的路由规则 - 请求转发日志:检查网关是否将请求转发到了正确的user-service实例地址
- 响应日志:确认网关是否收到user-service的响应,以及响应头是否包含合法的CORS字段
4. 对比请求差异
对比Angular直接调用和通过网关调用的请求细节:
- 检查请求头(如
Content-Type、Authorization)是否完全一致 - 检查请求体是否完整,确认网关未修改或丢失请求内容
5. 检查服务健康状态
在Eureka控制台确认user-service实例状态为UP,网关无法转发到不健康的实例也会导致这类无响应错误
内容的提问来源于stack exchange,提问作者ahdy kefi
相关产品推荐
相关产品推荐

