You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:54:16