Java >> Java tutorial >  >> Tag >> Spring

Java Spring RestTemplate sætter uønskede overskrifter

Problemet er, at du bruger en standard konfigureret RestTemplate og skriver en String legeme. Denne kombination fører til en standard konfigureret StringHttpMessageConverter bliver brugt, som har writeAcceptCharset indstillet til true . Hvilket vil føre til, at alle tilgængelige tegnsæt tilføjes som en header.

Nu har du 2 måder at løse dette på.

  1. Skriv ikke en almindelig String men skriv et andet objekt, som vil samle objektet til en String omgå StringHttpMessageConverter .
  2. Genkonfigurer StringHttpMessageConverter og indstil writeAcceptCharset til false .

Brug af Marshalling

public class Message {
    private String message;
    Message() {}
    public String getMessage() { this.message;}
    public void setMessage(String message) { this.message=message;}
}

Brug derefter denne Message klasse i stedet for den almindelige String JSON brødtekst.

Message msg = new Message();
msg.setMessage("I am very frustrated.");
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
List<Charset> acceptCharset = Collections.singletonList(StandardCharsets.UTF_8);
headers.setAcceptCharset(acceptCharset);
log.info(headers.toString());

HttpEntity<Message> entity = new HttpEntity<>(msg, headers);
ResponseEntity<String> res = restTemplate.exchange("http://httpbin.org/post", HttpMethod.POST, entity, String.class);
String httpbin = res.getBody();

log.info("httpbin result: " + httpbin);

Der er dog en lille ændring i anmodningen, Content-Type overskriftsændringer fra text/plain til application/json . Ikke sikker på, om det er det, du vil have (selvom du faktisk sender JSON og ikke almindelig tekst).

Genkonfigurer StringHttpMessageConverter

 RestTemplate restTemplate = new RestTemplate();
 for (HttpMessageConverter converter : restTemplate.getMessageConverters) {
     if (converter instanceof StringHttpMessageConverter) {
         ((StringHttpMessageConverter) converter).setWriteAcceptCharset(false);
     }
 }

Dette vil kun skrive de konfigurerede tegnsæt til svaret.


Disse værdier tilføjes med StringHttpMessageConverter klasse. For at løse dit problem skal du tilføje følgende kode:

List<HttpMessageConverter<?>> converters = new ArrayList<>();
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setWriteAcceptCharset(false);
converters.add(stringConverter);
restTemplate.setMessageConverters(converters);

Java tag