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校验验证问题:
关闭后请求恢复正常即可确认是CSRF问题,正式测试时可以在Rest Assured中先调用GET接口获取CSRF令牌,再带到POST请求头中即可。@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(); } } - 排查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
相关产品推荐
相关产品推荐

