Подтвердить что ты не робот

Как я могу указать RestTemplate на POST с кодировкой UTF-8?

У меня возникают проблемы с отправкой JSON с кодировкой UTF-8 с помощью RestTemplate. Кодировка по умолчанию для JSON - это UTF-8, поэтому тип носителя не должен содержать кодировку. Я попытался поместить кодировку в MediaType, но, похоже, она не работает.

Мой код:

String dataJson = "{\"food\": \"smörrebröd\"}";
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("application", "json", StandardCharsets.UTF_8);
headers.setContentType(mediaType);

HttpEntity<String> entity = new HttpEntity<String>(dataJson, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> formEntity = restTemplate.exchange(postUrl, HttpMethod.POST, entity, Boolean.class);
4b9b3361

Ответ 1

Вам нужно добавить StringHttpMessageConverter для размещения конвертера сообщений шаблонов с кодировкой UTF-8. Как этот

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
        .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

Ответ 2

(Добавление к решениям mushfek0001 и zhouji)

По умолчанию RestTemplate имеет ISO-8859-1 StringHttpMessageConverter, который используется для преобразования объекта JAVA для запроса полезной нагрузки.

Разница между UTF-8 и ISO-8859:

UTF-8 - многобайтовая кодировка, которая может представлять любой Unicode персонаж. ISO 8859-1 является однобайтовой кодировкой, которая может представлять собой первые 256 символов Юникода. Оба кодируют ASCII точно так же.

Решение 1 (скопировано из mushfek001):

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
        .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

Решение 2:

Хотя выше решение работает, но, как отметил zhouji, он добавит два строковых преобразователя, и это может привести к некоторым проблемам с регрессией.

Если вы установите правильный тип контента в заголовке http, тогда ISO 8859 позаботится об изменении символов UTF.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

или

// HttpUriRequest request
request.addHeader("Content-Type", MediaType.APPLICATION_JSON_UTF8_VALUE);

Ответ 3

Ответ @mushfek0001 выдает два StringHttpMessageConverter, которые отправят два text/plain и */*, например, отладочное изображение.

введите описание изображения здесь

Даже заголовок Accept клиента будет:

text/plain, text/plain, */*, */*

Итак, лучший удалить ISO-8859-1 StringHttpMessageConverter и использовать один UTF-8 StringHttpMessageConverter.

Используйте это:

RestTemplate restTemplate = new RestTemplate();
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
stringHttpMessageConverter.setWriteAcceptCharset(true);
for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {
    if (restTemplate.getMessageConverters().get(i) instanceof StringHttpMessageConverter) {
        restTemplate.getMessageConverters().remove(i);
        restTemplate.getMessageConverters().add(i, stringHttpMessageConverter);
        break;
    }
}

Ответ 4

restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_16LE));

String response = restTemplate.getForObject(url, String.class);

Ответ 5

Добавление нового StringHttpMessageConverter не поможет. В существующем StringHttpMessageConverter нам нужно установить writeAcceptCharset в false и создайте httpheader с кодировкой, которую мы хотим.

RestTemplate restTemplate = new RestTemplate();
   List<HttpMessageConverter<?>> c = restTemplate.getMessageConverters();
        for(HttpMessageConverter<?> mc :c){
            if (mc instanceof StringHttpMessageConverter) {
                StringHttpMessageConverter mcc = (StringHttpMessageConverter) mc;
                mcc.setWriteAcceptCharset(false);
            }
   }

  HttpHeaders headers = new HttpHeaders();
  headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
  headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8")));
  HttpEntity<String> entity = new HttpEntity<String>(jsonPayload, headers);

  restTemplate.postForEntity(postResourceUrl, entity, String.class);

Ответ 6

Лучше сначала удалить StringHttpMessageConverter перед добавлением нового. так что у вас будет один экземпляр StringHttpMessageConverter в нашем списке MessageConverters.

RestTemplate restTemplate = new RestTemplate();
        final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
        while (iterator.hasNext()) {
            final HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof StringHttpMessageConverter) {
                iterator.remove();
            }
        }


        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

Ответ 7

Удаление существующего конвертера, но с Java 8 (почему люди все еще пишут Java 7 Code в любом случае?)

List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters .removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
messageConverters
  .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

Ответ 8

Попробуй это

restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(Charsets.UTF_8));

Ответ 9

#can you help me#
##thanks##
System.out.println(writer.toString());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = generatePdf(writer.toString());
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; appointmentNo=" + medicalNo.replace(" ", "_"));
header.setContentLength(baos.toByteArray().length);
return new HttpEntity<byte[]>(baos.toByteArray(), header);