You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:43:13