我在使用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);
RestTemplate
以使用字符集(在FormHttp和StringHttp消息转换器上)初始化此MyRestTemplate
并在执行doPost
时使用它,只是为了清晰起见并将REST详细信息保留在其他地方。以防万一有人发现这很有用...对于@dune76,仅添加新转换器似乎没有效果,因为处理似乎使用它找到的第一个转换器。此外,转换器列表的顺序很重要:如果您在末尾添加并删除相同类别的其他转换器,则会尝试使用其他转换器O_O - Alfabravo