【问题标题】:How to remove charset from Spring RestTemplate?如何从 Spring RestTemplate 中删除字符集?
【发布时间】:2019-09-27 23:37:36
【问题描述】:

当我发布表单请求时,spring 正在添加像application/x-www-form-urlencoded; charset=UTF-8 这样的字符集,这会导致消耗宁静服务的问题。如何从 RestTemplate 中删除字符集以使内容类型恰好是 application/x-www-form-urlencoded

【问题讨论】:

  • 问题不清楚,能否提供更多数据,如日志、示例代码等? .这似乎是这篇文章中的一个问题:stackoverflow.com/questions/33796218/…
  • 您使用哪种方法发送请求?您的请求正文是如何定义的(字符串、地图)?因此,使用什么转换器对您的请求正文进行编码?
  • FormMessage 转换器,我实际上是通过代码。似乎 spring 在该转换器中明确设置了字符集。没有办法。顺便说一句,我使用 multivaluemap 并同时使用了 postforentity 和 exchange。

标签: spring spring-boot http resttemplate


【解决方案1】:

FormHttpMessageConverter 进行大量验证以确保您使用的 MediaType 具有有效的字符集。我会尝试将其子类化并注册一个新的转换器(尽管有很多私有方法),或者手动将您的 MultiValueMap 转换为字符串有效负载(StringHttpMessageConverter 对媒体类型的限制要少得多)

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<String> entity = new HttpEntity<>("param1=value1", headers);
String result = restTemplate.postForObject( url, entity, String.class);

【讨论】:

  • 我最终继承了 MediaType、HttpHeaders 来解决它。但是,我认为应该有一种方法可以排除添加到实际请求中的 contentType。
【解决方案2】:

我遇到了同样的问题。添加后,我通过从标题中的内容类型中删除字符集来解决它。

class MyFormHttpMessageConverter extends FormHttpMessageConverter {


  @Override
  public void write(final MultiValueMap<String, ?> map, final MediaType contentType, final HttpOutputMessage outputMessage) throws IOException,
                                                                                                                                   HttpMessageNotWritableException {
    super.write(map, contentType, outputMessage);

    HttpHeaders headers = outputMessage.getHeaders();
    MediaType mediaType = headers.getContentType();
    if(Objects.nonNull(mediaType) && MapUtils.isNotEmpty(mediaType.getParameters())){
      Map<String, String> filteredParams =  mediaType.getParameters()
                                                     .entrySet()
                                                     .stream()
                                                     .filter(entry -> !entry.getKey().equals("charset"))
                                                     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
      headers.setContentType(new MediaType(mediaType, filteredParams));
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2019-12-04
    • 1970-01-01
    • 2015-02-20
    • 2021-10-01
    相关资源
    最近更新 更多