UTF-8 인코딩을 사용하여 RestTemplate에 POST를 지시하려면 어떻게 해야 합니까?
RestTemplate를 사용하여 UTF-8 인코딩으로 JSON을 게시하는 데 문제가 있습니다.JSON의 기본 인코딩은 UTF-8이므로 미디어 유형에 문자 집합도 포함할 수 없습니다.Media Type에 charset을 넣으려고 했는데, 그래도 안 되는 것 같아요.
내 코드:
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);
stringHttpMessageConverter를 추가하여 템플릿의 메시지컨버터를 charset UTF-8로 설정해야 합니다.이렇게 하면
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
(mushfek0001 및 zhouji에 의한 솔루션 추가)
기본적으로는 RestTemplate에는 ISO-8859-1 StringHttpMessageConverter가 있습니다.이거는 JAVA 객체를 payload 요구로 변환하기 위해 사용됩니다.
UTF-8과 ISO-8859의 차이:
UTF-8은 임의의 Unicode 문자를 나타낼 수 있는 멀티바이트 부호화입니다.ISO 8859-1은 첫 번째 256개의 Unicode 문자를 나타낼 수 있는 싱글바이트 부호화입니다.양쪽 모두, ASCII 를 완전하게 같은 방법으로 부호화합니다.
솔루션 1(mushfek001에서 복사):
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
해결책 2:
위의 솔루션은 동작하지만, Zhouji가 지적한 바와 같이 2개의 문자열 변환기가 추가되어 회귀 문제가 발생할 수 있습니다.
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);
@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;
}
}
새로운 StringHttpMessageConverter를 추가해도 도움이 되지 않습니다.기존 StringHttpMessageConverter에서는 writeAcceptCharset을 false로 설정하고 원하는 charset을 사용하여 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);
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_16LE));
String response = restTemplate.getForObject(url, String.class);
기존 컨버터를 제거하고 Java 8을 사용하는 경우(왜 사람들은 여전히 Java 7 Code를 쓰는가?)
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
새로 추가하기 전에 먼저 StringHttpMessageConverter를 삭제해야 합니다.이렇게 하면 MessageConverters 목록에 StringHttpMessageConverter 인스턴스가 1개 표시됩니다.
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")));
이거 드셔보세요
restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(Charsets.UTF_8));
Spring Boot을 사용하는 경우 RestTemplate는 우선순위가 높은 UTF-8 문자셋 StringHttpMessageConverter를 사용하여 자동으로 설정됩니다.RestTemplateBuilder를 사용하여 RestTemplate 인스턴스를 만듭니다.예.restTemplateBuilder.build()
할 수도 있습니다.
HttpHeaders attachmentHeader = new HttpHeaders();
attachmentHeader.setContentType(MediaType.valueOf("text/csv; charset=UTF-8"));
또는
attachmentHeader.set("Content-Type", "text/csv; charset=UTF-8");
언급URL : https://stackoverflow.com/questions/29392422/how-can-i-tell-resttemplate-to-post-with-utf-8-encoding
'it-source' 카테고리의 다른 글
Karma+Angular 내에서 모의 JSON 파일 로드JS 테스트 (0) | 2023.02.08 |
---|---|
이미 선언된 JSON 개체에 키 값 쌍을 추가하는 방법 (0) | 2023.02.08 |
ng-class 조건은 변경되지만 클래스는 갱신되지 않음 (0) | 2023.02.08 |
숫자인 PHP 개체 속성을 가져옵니다. (0) | 2023.02.08 |
firebase.firebase는 함수가 아닙니다. (0) | 2023.02.08 |