使用 RestTemplate 发送请求时的编码问题

Posted

技术标签:

【中文标题】使用 RestTemplate 发送请求时的编码问题【英文标题】:Encoding problem when sending a request using RestTemplate 【发布时间】:2022-01-21 08:26:22 【问题描述】:

使用 RestTemplate 发送请求

var emailDto = new EmailDto();
email.setBody(DATA_TEXT);
HttpHeaders headers = new HttpHeaders();
Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType("text", "html", utf8);
headers.setContentType(mediaType);
var httpEntity = new HttpEntity<>(emailDto , headers);
//restTemplate.getMessageConverters()
//   .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
var response = restTemplate.exchange(
ResponseEntity<String> response= restTemplate.exchange(
        emailPath,
        HttpMethod.POST,
        httpEntity,
        String.class);

DATA_TEXT - 这是我尝试在请求中发送的一段 html 代码

public static final String DATA_TEXT =

            "<body style='margin:0;padding:0;'> " +
"<table role='table' style='width:100%%;border-collapse:collapse;border:0;border-spacing:0;background:#ffffff;'> " +
"<tr> <td align='center' style='padding:0;'> " +
"<table role='table' style='width:602px;border-collapse:collapse;border:1px solid #cccccc;border-spacing:0;text-align:left;'> " +
"<tr> <td align='center' style='padding:4px 0 4px;background:#FFFFFF;border:1px solid #cccccc;'> " +
"<img src='https://i.logo.co/redfggq7/logo.png' alt='my_logo' width='170' " +
"</td></tr><tr> <td style='padding:36px 30px 42px 30px;background:#F0F4F2;font-family:Roboto,sans-serif;'> " +
"<p style='font-family: Roboto, sans-serif;'>Текст авпвапва вар о пор ораоа про прп" +
"</p><p style='font-family: Roboto, sans-serif;'>" +
"</p>" +
"</td></tr><tr> <td style='padding:30px;background:#198754;text-align:center;border:1px solid #cccccc;'> " +
"<a style='text-decoration:none;color:#ffffff;opacity:50%%' href='#'>my.com</a> " +
"</td></tr></table></td></tr></table> </body>";

发送请求时,返回如下错误: org.springframework.web.client.RestClientException:ru.ocpiouserbacktest.model.EmailDto 和内容类型“text/html;charset=UTF-8”没有 HttpMessageConverter

在文件Pom.xml中指定

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

【问题讨论】:

【参考方案1】:

有了这个:

MediaType mediaType = new MediaType("text", "html", utf8);
headers.setContentType(mediaType);

您是在告诉 Spring 您的有效负载内容将是 text/html。

但是,有了这个:

var httpEntity = new HttpEntity<>(emailDto , headers);

您告诉 Spring 发送一个 EmailDto 对象 - 可以理解,Spring 不知道如何转换为 text/html 并且 Spring 不会知道 EmailDto 恰好包含一个带有 HTML 的字段。

【讨论】:

以上是关于使用 RestTemplate 发送请求时的编码问题的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 Wininet 发送 POST 请求时的编码问题

resttemplate发送请求无服务报错

使用RestTemplate发送post请求

RestTemplate工具类根据服务名发送请求

如何使用 RestTemplate 将 POST 请求发送到相对 URL?

如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?