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

Rest Assured请求本地Spring Boot接口报404/403 但Postman、浏览器可访问

Spring Boot Data JPA本地接口调用异常修复方案

问题1:GET请求Rest Assured/curl返回404,浏览器/Postman直接调用正常

排查与修复

这类问题本质是实际发起的请求和肉眼看到的URL不一致,不要仅凭URL字符串相同就判定请求完全一致,按以下步骤定位:

  • 开启Spring Boot路径匹配日志,拿到服务端实际收到的请求路径
    在application.properties/application.yml中添加配置,打印请求映射匹配的全量日志:
    logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG
    logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=TRACE
    
    触发异常请求后,对照日志里服务端实际接收到的请求路径,和接口上@GetMapping/@RequestMapping定义的路径逐字符对比,重点排查三个高频问题:
    • 漏加上下文路径:如果配置了server.servlet.context-path,Rest Assured的basePath、curl的请求地址必须带上该前缀;浏览器点日志里的URL是完整带前缀的所以能访问,Postman如果保存过历史请求会自动拼接前缀,很容易漏看该配置。
    • 尾部斜杠不匹配:Spring Boot 2.6+版本默认关闭尾部斜杠兼容,比如接口定义路径是/api/user/list,请求打到/api/user/list/就会直接返回404。需要兼容的话添加如下Web配置:
      @Configuration
      public class WebConfig implements WebMvcConfigurer {
          @Override
          public void configurePathMatch(PathMatchConfigurer configurer) {
              configurer.setUseTrailingSlashMatch(true);
          }
      }
      
    • 路径双重编码:如果URL带中文、特殊字符或路径参数,Rest Assured默认会自动做URL编码,如果你手动提前编码一次,会导致特殊字符被二次转义(比如%被转成%25),路径匹配失败。
  • 校验Postman导出的curl命令
    Postman自动生成的curl默认会带本地缓存的Cookie、环境变量占位符、--path-as-is等参数,先把所有非必须的请求头、Cookie、参数全删掉,只保留基础请求地址,逐段添加参数测试,定位是哪个字段导致的404。

问题2:POST请求Rest Assured返回403 Forbidden,Postman调用正常

排查与修复

90%以上的这类问题是Spring Security默认拦截规则导致,按以下顺序排查:

  • 优先排查CSRF校验拦截
    只要项目引入了Spring Security依赖,默认会开启CSRF防御,对所有非GET/HEAD/OPTIONS的请求校验CSRF令牌,无合法令牌直接返回403。Postman调用正常通常是因为之前的请求已经把Session中的CSRF令牌存在本地Cookie里,调用时自动带上了。
    本地测试阶段可以临时关闭CSRF校验验证问题:
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http
                // 仅本地调试使用,生产环境需根据安全需求配置CSRF规则
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
            return http.build();
        }
    }
    
    关闭后请求恢复正常即可确认是CSRF问题,正式测试时可以在Rest Assured中先调用GET接口获取CSRF令牌,再带到POST请求头中即可。
  • 排查CORS拦截
    如果关闭CSRF后仍返回403,检查CORS配置:Rest Assured发起请求时如果自动携带了Origin头,而服务端没配置对应源的允许规则,会被Spring Security拦截。本地测试可添加宽松CORS配置验证:
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOriginPatterns("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowCredentials(true);
        }
    }
    
  • 请求头差异对比
    把Postman正常请求的所有请求头、Cookie、请求体参数列出来,和Rest Assured日志中打印的实际发送请求逐行对比,重点检查Content-Type是否和接口消费类型匹配(比如接口要接收application/json,请求发成了application/x-www-form-urlencoded也可能被自定义拦截器拦截返回403)。

通用排查技巧:所有跨客户端调用结果不一致的问题,不要靠肉眼判断请求是否一致,直接抓包对比正常请求和异常请求的请求行、请求头、请求体全量信息,绝大多数问题都是没注意到的细节差异导致。

内容的提问来源于stack exchange,提问作者AFTAB MANNAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:42:28