2016-07-09 28 views
1

Ich muss eine GET-Anfrage mit einem Header senden: Content-Type: application/camiant-msr-v2.0+xml. Ich erwarte eine XML-Antwort vom Server. Ich habe die Anfrage und Antwort mit Postman getestet und alles ist gut. Aber wenn ich es im Frühling mit RestTemplate versuche, bekomme ich immer eine 400 schlechte Anfrage. Die Ausnahmen von spring sind:Resttemplate GET Anfrage mit benutzerdefinierten Kopfzeilen

Jul 09, 2016 12:53:38 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/smp] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request] with root cause 
org.springframework.web.client.HttpClientErrorException: 400 Bad Request 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475) 

Mein Code:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); 
headers.add("Content-Type", "application/camiant-msr-v2.0+xml"); 

HttpEntity<?> entity = new HttpEntity<Object>(headers); 
log.debug("request headers: " + entity.getHeaders()); 
ResponseEntity<String> response = restTemplate.exchange(queryUrl, HttpMethod.GET, entity, String.class); 

Die Debug-Meldung zeigt den Header als {Content-Type=[application/camiant-msr-v2.0+xml]}, die korrekt zu sein scheint. Ich frage mich, was ist falsch mit meiner Anfrage und wenn es eine Möglichkeit gibt, die Anfragen auf der Leitung zu debuggen zu sehen.

+1

Wenn Sie ein GET senden, warum stellen Sie einen Header "Content-Type" zur Verfügung? Möchtest du, dass es stattdessen 'Accept' ist? –

+0

@ nicholas.hauschild Da der Server dies erwartet, kann ich nur eine XML-Antwort erhalten, wenn ich diesen Header zur Verfügung stelle. –

+0

@ nicholas.hauschild Ich verstehe irgendwie, was du meinst, aber die API-Spezifikation sagt das, und auch Postman funktioniert gut. –

Antwort

0

Eigentlich sollte der zu übergebende Header Accept statt Content-Type heißen, da es eine GET-Methode ist. Aber das Server-API-Dokument sagt irgendwie, dass es Content-Type erwartet, und die API von der Befehlszeile/Postman arbeitete gut auf beiden Content-Type und Accept. Ich denke, es ist die Java-Bibliothek, die verhindert Content-Type Header an GET-Anforderungen übergeben werden.

1

Die möglichen Interpretationen von 400 sind der Inhaltstyp ist nicht akzeptabel für eine Anfrage oder URL stimmt nicht überein.

Aus meiner persönlichen Erfahrung habe ich das starke Gefühl, dass Sie die queryUrl vermasseln, also um die Dinge hier fein abzustimmen, würde ich Ihnen empfehlen, Spring's UriComponentsBuilder Klasse zu verwenden.

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) 
     .queryParam("data", data); 

HttpEntity<?> entity = new HttpEntity<>(headers); 

HttpEntity<String> response = restTemplate.exchange(
     builder.build().encode().toUri(), 
     HttpMethod.GET, 
     entity, 
     String.class); 

Bitte lassen Sie mich wissen, wenn es immer noch nicht funktioniert.

+0

vielen Dank für Ihre Antwort. Aber ich bekomme immer noch den schlechten Anfragefehler mit Ihrer Methode. Ich habe die URL ausgedruckt, es ist genau das gleiche wie das, das ich in Postman verwendet habe, was gut funktioniert hat. –