web-dev-qa-db-ja.com

RestTemplateにUTF-8エンコーディングでPOSTと伝えるにはどうすればよいですか?

RestTemplateを使用してUTF-8エンコードでJSONを送信するときに問題が発生します。 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);
34
anssias

StringHttpMessageConverterを、文字セットUTF-8を使用して残りのテンプレートのメッセージコンバーターに追加する必要があります。このような

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

(mushfek0001およびzhoujiによるソリューションへの追加)

デフォルトでは、RestTemplateにはISO-8859-1StringHttpMessageConverterがあり、Javaオブジェクトをペイロードに変換するために使用されます。

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

@ mushfek0001による回答は、2つのStringHttpMessageConverterを生成し、2つのtext/plainおよび*/*(デバッグ画像など)。

enter image description here

クライアントのAcceptヘッダーも次のようになります。

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

したがって、より良いのは、ISO-8859-1 StringHttpMessageConverterremoveにして、単一の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;
    }
}
6
zhouji
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_16LE));

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

既存のコンバーターを削除しますが、Java 8を使用します(なぜ人々はまだJava 7コードとにかく書くのですか?)

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

これを試して

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

新規を追加する前に、まず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")));
0
pankaj desai

新しい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);
0
Sandesh