如何强制RestTemplate使用UTF-8编码发送multipart/form-data请求

3

我在使用RestTemplate实体编码multipart/form-data为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);

当我在文本参数中插入任何波兰字母,例如:"ł"时,rest模板将其发送为"?"。如下所示,实际上消息主体看起来像这样,并且"ł"被转换为"?":
Content-Disposition: form-data; name="text"
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 1
?

我不知道为什么它不能正常工作。如何将默认的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);

我尝试将新的StringHttpMessageConverter(Charset.forName("UTF-8"))添加到RestTemplate中,但没有任何效果。 - dune76
不是在迭代删除/添加消息转换器,而是我扩展了默认的RestTemplate以使用字符集(在FormHttp和StringHttp消息转换器上)初始化此MyRestTemplate并在执行doPost时使用它,只是为了清晰起见并将REST详细信息保留在其他地方。以防万一有人发现这很有用...对于@dune76,仅添加新转换器似乎没有效果,因为处理似乎使用它找到的第一个转换器。此外,转换器列表的顺序很重要:如果您在末尾添加并删除相同类别的其他转换器,则会尝试使用其他转换器O_O - Alfabravo
你应该将解决方案作为答案并接受它 :) - Alfabravo
1个回答

0

1
在我的情况下(与Twitter的通信),对我的数据进行编码不是一个好主意。我已经有了UTF-8字符串,因此再次对其进行编码没有任何意义。在这种特定情况下,问题在于AsyncRestTemplate会丢失UTF-8编码,因为默认情况下定义的所有HttpMessageConverters都使用ISO-8859-1。 - dune76
OP在问题中提供的解决方案可以在不显式编码数据的情况下工作。只需设置消息转换器即可正常工作。 - Alfabravo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接