Spring 如何强制RestTemplate使用UTF-8编码发送多部分/表单数据

Spring 如何强制RestTemplate使用UTF-8编码发送多部分/表单数据,spring,utf-8,multipartform-data,resttemplate,multipartentity,Spring,Utf 8,Multipartform Data,Resttemplate,Multipartentity,我正在努力将我的多部分/表单数据编码为RestTemplate实体中的UTF-8。我不知道我做错了什么。下面是我的代码 LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("text", text); map.add("id", id); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("Co

我正在努力将我的多部分/表单数据编码为RestTemplate实体中的UTF-8。我不知道我做错了什么。下面是我的代码

LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("text", text);
map.add("id", id);

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type","multipart/form-data;charset=UTF-8");

HttpEntity<LinkedMultiValueMap<String, String>> entity = new HttpEntity<>(map, httpHeaders);

ListenableFuture<ResponseEntity<String>> response = asyncRestOperations
                .postForEntity(url, entity, String.class);
我不知道为什么它不能正常工作。如何将默认ISO-8859-1编码更改为UTF-8?非常感谢您的帮助

干杯

找到的解决方案:

我稍微修改了AsyncRestTemplate,它不再丢失UTF-8编码。我的工作代码:

AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
List<HttpMessageConverter<?>> messageConverters = asyncRestTemplate.getMessageConverters();

StringHttpMessageConverter stringMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
AllEncompassingFormHttpMessageConverter allEncompassingConverter = new AllEncompassingFormHttpMessageConverter();
allEncompassingConverter.setCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setMultipartCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setPartConverters(Collections.singletonList(stringMessageConverter));

for (Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator(); iterator.hasNext(); ) {
    HttpMessageConverter conv = iterator.next();
    if (conv instanceof AllEncompassingFormHttpMessageConverter) {
        iterator.remove();
    }
}
messageConverters.add(allEncompassingConverter);
asyncRestTemplate.setMessageConverters(messageConverters);
AsyncRestTemplate AsyncRestTemplate=新建AsyncRestTemplate();

列表参考此处提供的答案


对于特殊字符支持,您需要对数据进行编码

我尝试将新的StringHttpMessageConverter(Charset.forName(“UTF-8”))添加到RestTemplate,但没有效果。我没有在RestTemplate上迭代删除/添加MessageConverter,而是扩展了default
RestTemplate
以使用字符集(在FormHttp和StringHttp messageConverters上)初始化此
MyRestTemplate
并将其用于制作
doPost
,只是为了清晰起见,并将其余的详细信息保存在其他地方。以防万一有人觉得有用。。。对于@dune76,仅仅添加新的转换器似乎没有任何效果,因为处理似乎使用了第一个是finds。此外,转换器的顺序也很重要:如果您在最后添加并删除同一类的另一个转换器,它将尝试使用其他转换器,或者您将解决方案作为答案并接受它:)在我的情况下(与Twitter通信),对我的数据进行编码不是一个好主意。我已经有了UTF-8字符串,所以再编码一次没有任何意义。在这种特定情况下,问题在于AsyncRestTemplate丢失UTF-8编码,因为其中定义的所有HttpMessageConverter默认使用ISO-8859-1。OP提供的有问题的解决方案在不显式编码数据的情况下工作。只需设置MessageConverter就可以了。
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
List<HttpMessageConverter<?>> messageConverters = asyncRestTemplate.getMessageConverters();

StringHttpMessageConverter stringMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
AllEncompassingFormHttpMessageConverter allEncompassingConverter = new AllEncompassingFormHttpMessageConverter();
allEncompassingConverter.setCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setMultipartCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setPartConverters(Collections.singletonList(stringMessageConverter));

for (Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator(); iterator.hasNext(); ) {
    HttpMessageConverter conv = iterator.next();
    if (conv instanceof AllEncompassingFormHttpMessageConverter) {
        iterator.remove();
    }
}
messageConverters.add(allEncompassingConverter);
asyncRestTemplate.setMessageConverters(messageConverters);