utf8_encode tipos codificaciones codificacion caracteres acentos json spring resttemplate

json - tipos - utf-8 html



¿Cómo puedo decirle a RestTemplate que haga POST con codificación UTF-8? (6)

Agregar un nuevo StringHttpMessageConverter no ayudará. En el StringHttpMessageConverter existente, debemos establecer writeAcceptCharset en falso y compilar httpheader con el conjunto de caracteres que queramos.

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);

Estoy teniendo problemas para publicar JSON con codificación UTF-8 usando RestTemplate. La codificación predeterminada para JSON es UTF-8, por lo que el tipo de medio ni siquiera debería contener el conjunto de caracteres. He intentado poner charset en el MediaType pero no parece funcionar de todos modos.

Mi código:

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);


Debe agregar StringHttpMessageConverter para descansar el convertidor de mensajes de la plantilla con el conjunto de caracteres UTF-8. Me gusta esto

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


La respuesta de @ mushfek0001 produce dos StringHttpMessageConverter que enviarán dos text/plain y */* , como la imagen de depuración.

Incluso el encabezado Accept del cliente será:

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

Por lo tanto, lo mejor es quitar el ISO-8859-1 StringHttpMessageConverter y usar el único UTF-8 StringHttpMessageConverter .

Utilizar esta:

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; } }


Mejor debes eliminar el StringHttpMessageConverter antes de agregar nuevo. De esta manera, tendrá una instancia de StringHttpMessageConverter en nuestra lista de 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")));


(Agregando soluciones por mushfek0001 y zhouji)

Por defecto, RestTemplate tiene ISO-8859-1 StringHttpMessageConverter que se utiliza para convertir un objeto JAVA para solicitar una carga útil.

Diferencia entre UTF-8 y ISO-8859:

UTF-8 es una codificación multibyte que puede representar cualquier carácter Unicode. ISO 8859-1 es una codificación de un solo byte que puede representar los primeros 256 caracteres Unicode. Ambos codifican ASCII exactamente de la misma manera.

Solución 1 (copiada de mushfek001):

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

Solución 2:

Aunque la solución anterior funciona, pero como señaló zhouji, agregará dos convertidores de cadena y puede llevar a algunos problemas de regresión.

Si establece el tipo de contenido correcto en el encabezado http, entonces ISO 8859 se encargará de cambiar los caracteres UTF.

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

o

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


restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_16LE)); String response = restTemplate.getForObject(url, String.class);