使用Spring RestTemplate发起GET请求访问网站报错排查
报错核心原因
你的代码存在几个逻辑错误直接导致响应解析失败:
- 替换了RestTemplate默认的全部消息转换器,仅保留用于JSON序列化/反序列化的
MappingJackson2HttpMessageConverter,这个组件无法解析text/html类型的文本响应,是报错的直接原因 - 给无请求体的GET请求强行设置了
application/x-www-form-urlencoded表单类型的Content-Type头,该头仅适用于带表单请求体的POST等请求方法,属于无效配置,部分站点会直接拦截这类不符合规范的请求 - 构造GET请求的HttpEntity时传入空的MultiValueMap请求体,属于冗余逻辑
最简可用实现
不需要额外配置转换器、请求头的场景下,几行代码就能实现GET请求拉取网页内容:
// 用默认构造方法初始化,自带支持解析文本响应的StringHttpMessageConverter RestTemplate restTemplate = new RestTemplate(); // 直接发起GET请求,响应自动映射为String类型 ResponseEntity<String> response = restTemplate.getForEntity("https://www.google.com", String.class); // 拿到网页HTML内容 String html = response.getBody();
自定义请求头的实现
如果需要加User-Agent等头避免被站点拦截,参考如下写法:
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); // 按需添加请求头,不要给GET请求设表单类型Content-Type headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"); // GET请求无请求体,泛型用Void即可 HttpEntity<Void> requestEntity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange( "https://www.google.com", HttpMethod.GET, requestEntity, String.class ); String html = response.getBody();
原代码修正方案
如果你确实需要自定义消息转换器列表,不要只加Jackson转换器,必须把处理文本响应的转换器加上,修正后的核心配置如下:
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); // 先加字符串响应转换器,指定UTF-8编码,支持解析text/html等文本类型 StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8); messageConverters.add(stringConverter); // 再加JSON转换器,不要给它设ALL媒体类型,仅处理JSON相关即可 MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); jacksonConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8)); messageConverters.add(jacksonConverter); restTemplate.setMessageConverters(messageConverters); // 构造GET请求实体时去掉无效的表单Content-Type头,不要传空的MultiValueMap HttpHeaders headers = new HttpHeaders(); HttpEntity<Void> entity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange("https://www.google.com", HttpMethod.GET, entity, String.class);
注意:如果本地网络无法直接访问google.com,会报连接超时错误,和代码逻辑无关,需要自行解决网络连通性问题。
内容的提问来源于stack exchange,提问作者sheenaLal
相关产品推荐
相关产品推荐

