【问题标题】:How to force RestTemplate to send multipart/form-data with UTF-8 encoding如何强制 RestTemplate 使用 UTF-8 编码发送多部分/表单数据
【发布时间】:2016-09-22 14:46:05
【问题描述】:

我正在努力让我的 multipart/form-data 在 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);

当我在文本参数中插入任何波兰字母时,例如:“ł” 其余模板将其作为“?”发送。您可以在下面看到它,实际上正文看起来像这样并且“ł”被转换为“?”:

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 但这没有效果。
  • 我没有在它们上迭代删除/添加 messageConverters,而是扩展了默认 RestTemplate 以使用字符集(在 FormHttp 和 StringHttp messageConverters 上)初始化此 MyRestTemplate 并将其用于执行 doPost,只是为了为了清楚起见并将 REST 详细的内容保存在其他地方。以防万一有人发现有用...对于@dune76,仅添加新转换器似乎没有任何效果,因为处理似乎使用了第一个发现。此外,转换器列表的顺序很重要:如果您在最后添加并删除同一类的另一个,它将尝试使用其他转换器 O_O
  • 你会把解决方案作为答案并接受它:)

标签: spring utf-8 multipartform-data resttemplate multipartentity


【解决方案1】:

请参阅此处提供的答案Spring RestTemplate Charset UTF-8 does not work

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

【讨论】:

  • 在我的情况下(与 Twitter 通信)编码我的数据不是一个好主意。我已经有了 UTF-8 字符串,所以再编码一次没有任何意义。在这种特定情况下,问题是 AsyncRestTemplate 丢失了 UTF-8 编码,因为在内部定义的所有 HttpMessageConverters 默认使用 ISO-8859-1。
  • OP 提供的有问题的解决方案无需显式编码数据即可工作。只需设置 messageConverters 即可。
猜你喜欢
  • 2014-03-28
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多