RestTemplate发送含俄文XML出现乱码问题求助
RestTemplate发送含俄文XML时接收端乱码的解决方案
问题原因
Postman发送正常但RestTemplate发送出现乱码,核心问题在于发送端未明确指定请求的UTF-8编码:
- RestTemplate默认的
TEXT_XML媒体类型未携带charset=UTF-8参数,导致请求体以ISO-8859-1(默认编码)发送,俄文字符无法正确编码。 - 接收端虽配置了
@Consumes(MediaType.TEXT_XML + "; charset=UTF-8"),但发送端未传递正确编码标识时,接收端可能无法自动识别UTF-8编码。
解决方案
1. 修正请求头,明确指定UTF-8编码
修改发送方法中的HttpHeaders配置,同时修正原代码中的变量冲突、参数错误等问题:
public <T> T sendPost(String url, String param, Object xml, Class<T> type) { try { // 修正变量名冲突,避免与参数xml重名 HttpHeaders headers = new HttpHeaders(); // 明确设置Content-Type为text/xml; charset=UTF-8 headers.setContentType(new MediaType("text", "xml", StandardCharsets.UTF_8)); // 正确构造HttpEntity,传入参数xml作为请求体 HttpEntity<Object> httpEntity = new HttpEntity<>(xml, headers); ResponseEntity<T> responseEntity = restTemplate.postForEntity(String.format("%s?%s", url, param), httpEntity, type); return responseEntity.getBody(); // 修正返回值类型,返回泛型T而非ResponseEntity } catch (Exception e) { throw new RuntimeException("请求发送失败", e); } }
2. 全局配置RestTemplate的字符串消息转换器
确保RestTemplate使用的StringHttpMessageConverter默认编码为UTF-8,避免所有字符串类型请求出现编码问题:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 修改StringHttpMessageConverter的默认编码为UTF-8 for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) { if (converter instanceof StringHttpMessageConverter) { ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); break; } } return restTemplate; }
3. 确认接收端编码配置(可选)
虽Postman发送正常,仍可确保接收端@Consumes配置明确:
@POST @Path("xml") @Consumes("text/xml; charset=UTF-8") @Produces("application/xml; charset=UTF-8") public Response xml(@QueryParam("id") BigDecimal id, String xml) throws IOException { // 业务逻辑实现 }
关键说明
- 原发送方法存在变量名冲突、HttpEntity构造参数错误、返回值类型不匹配等问题,需一并修正才能正常运行。
- 乱码本质是发送端编码与接收端编码不一致,只要确保发送端以UTF-8编码发送,接收端以UTF-8解码,即可解决俄文字符乱码问题。
内容的提问来源于stack exchange,提问作者Egor Tverkov
相关产品推荐
相关产品推荐

