Spring Boot中RestTemplate调用GET接口遇308重定向及消息转换器问题
解决RestTemplate调用接口遇到308 Permanent Redirect及消息转换错误问题
核心问题分析
- RestTemplate默认不自动处理308永久重定向,而Postman会自动跟随重定向,这是本地调用和Postman结果不一致的根本原因。你拿到的text/html内容是nginx返回的重定向页面,并非目标接口的JSON响应。
- 你添加
MappingJackson2HttpMessageConverter处理text/html的操作方向错误:这个转换器用于解析JSON,无法处理HTML内容,反而会和默认的StringHttpMessageConverter冲突,导致String类型也无法正常解析。
解决步骤
1. 配置RestTemplate支持308重定向
RestTemplate默认的SimpleClientHttpRequestFactory不支持308重定向,需要改用HttpComponentsClientHttpRequestFactory,结合Apache HttpClient处理所有3xx重定向:
首先添加HttpClient依赖(Maven):
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
然后配置RestTemplate:
@Bean public RestTemplate restTemplate() { // 创建HttpClient实例,启用全量重定向支持 HttpClient httpClient = HttpClientBuilder.create() .setRedirectStrategy(new LaxRedirectStrategy()) // 支持所有3xx重定向,包括308、307 .build(); // 绑定HttpRequestFactory HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); // 初始化RestTemplate RestTemplate restTemplate = new RestTemplate(factory); return restTemplate; }
LaxRedirectStrategy会自动跟随所有符合HTTP规范的重定向状态码,解决308无法跳转的问题。
2. 正常调用接口映射POJO
配置完成后,直接调用接口并指定你的POJO类型NetworksResponse即可:
ResponseEntity<NetworksResponse> response = restTemplate.getForEntity("http://xxxxxx/api/xx/xx", NetworksResponse.class); NetworksResponse result = response.getBody();
此时RestTemplate会自动跟随308重定向,拿到目标接口返回的JSON响应,默认的Jackson转换器会自动完成JSON到POJO的映射,无需额外处理text/html类型。
关于之前转换器操作报错的原因
你添加的MappingJackson2HttpMessageConverter被设置为支持text/html,但它只能解析JSON格式内容,无法处理nginx返回的HTML重定向页面。同时RestTemplate默认的StringHttpMessageConverter也支持text/html,两个转换器同时尝试处理同一响应类型,导致解析逻辑冲突,最终出现字符串解析错误。
额外注意事项
- 若重定向目标是HTTPS地址,需确保HttpClient配置了正确的SSL证书处理逻辑(自签名证书需额外配置信任策略)。
- 检查POJO字段名、数据类型是否与JSON响应完全匹配,避免后续出现字段映射失败的问题。
内容的提问来源于stack exchange,提问作者spatil
相关产品推荐
相关产品推荐

