Spring框架中RestTemplate发起接口请求返回的响应始终为null
RestTemplate调用第三方接口返回null排查方案
- 第一步:排查自定义RestTemplate配置
你注入的是名为NewsApi的自定义RestTemplate实例,优先检查该实例的配置是否存在异常:- 是否配置了自定义
ResponseErrorHandler,在遇到非2xx状态码时直接吞掉异常、返回null - 是否移除了默认的
StringHttpMessageConverter,导致String类型的响应无法正常序列化
- 是否配置了自定义
- 第二步:获取完整响应上下文
将getForObject替换为getForEntity,拿到完整的响应状态码、头信息、响应体,确认请求的实际执行结果:
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class); System.out.println("响应状态码:" + response.getStatusCode()); System.out.println("响应头:" + response.getHeaders()); System.out.println("响应体:" + response.getBody());
若状态码为3xx重定向,说明默认RestTemplate未开启自动跟随重定向,浏览器访问时会自动跳转所以能拿到结果,RestTemplate需要手动配置开启重定向支持
- 第三步:检查请求头差异
第三方接口通常会校验请求头参数,浏览器直接访问时会自动携带User-Agent、Accept等标准头,RestTemplate默认请求头可能被接口拦截返回空结果,可手动模拟浏览器请求头调用测试:
HttpHeaders headers = new HttpHeaders(); headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); headers.set("Accept", "*/*"); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class);
- 第四步:排查SSL/代理问题
- 若接口为HTTPS协议,确认JDK信任库中是否包含该站点的SSL证书,可临时使用关闭SSL校验的RestTemplate测试验证
- 确认RestTemplate是否配置了错误的代理,导致请求被拦截、无响应返回
- 第五步:添加请求拦截器打印全量日志
给RestTemplate添加拦截器,打印请求的全量参数、响应的全量数据,确认请求链路是否存在异常:
restTemplate.setInterceptors(Collections.singletonList((request, body, execution) -> { System.out.println("请求地址:" + request.getURI()); System.out.println("请求方法:" + request.getMethod()); System.out.println("请求头:" + request.getHeaders()); ClientHttpResponse response = execution.execute(request, body); System.out.println("响应状态码:" + response.getStatusCode()); System.out.println("响应头:" + response.getHeaders()); return response; }));
内容的提问来源于stack exchange,提问作者Manas Singh
相关产品推荐
相关产品推荐

