2013-10-08 13 views
112

Ich möchte den Wert der Accept: in einer Anfrage, die ich unter Verwendung von Spring RestTemplate machen.Wie setze ich einen "Accept:" Header auf Spring RestTemplate Anfrage?

Hier ist mein Frühling Anfrage Behandlungscode

@RequestMapping(
    value= "/uom_matrix_save_or_edit", 
    method = RequestMethod.POST, 
    produces="application/json" 
) 
public @ResponseBody ModelMap uomMatrixSaveOrEdit(
    ModelMap model, 
    @RequestParam("parentId") String parentId 
){ 
    model.addAttribute("attributeValues",parentId); 
    return model; 
} 

und hier ist mein Java REST-Client:

public void post(){ 
    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); 
    params.add("parentId", "parentId"); 
    String result = rest.postForObject(url, params, String.class) ; 
    System.out.println(result); 
} 

Dies funktioniert für mich; Ich bekomme eine JSON-Zeichenfolge von der Serverseite.

Meine Frage ist: Wie kann ich die Accept: Header angeben (z application/json, application/xml, ...) und Anforderungsmethode (z GET, POST, ...), wenn ich RestTemplate verwenden?

Antwort

215

Ich empfehle die Verwendung einer der exchange Methoden, die eine HttpEntity akzeptiert, für die Sie auch die HttpHeaders festlegen können. (Sie können auch die HTTP-Methode angeben, die Sie verwenden möchten.)

Zum Beispiel

RestTemplate restTemplate = new RestTemplate(); 
HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); 

HttpEntity<String> entity = new HttpEntity<>("parameters", headers); 

restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 

Ich ziehe es diese Lösung, weil sie stark typisiert ist, dh. exchange erwartet eine HttpEntity.

Sie können jedoch auch HttpEntity als request Argument zu postForObject übergeben.

HttpEntity<String> entity = new HttpEntity<>("parameters", headers); 
restTemplate.postForObject(url, entity, String.class); 

Dies wird in der RestTemplate#postForObject Javadoc erwähnt.

Der request Parameter kann auf die Anfrage ein HttpEntity um fügen Sie zusätzliche HTTP-Header sein.

+0

Wenn Sie die Annahme-Header nicht festlegen, wird MediaType.APPLICATION_JSON standardmäßig in restTemplate.exchange() festgelegt. –

75

Sie könnten in Ihrer RestTemplate einen Interceptor "ClientHttpRequestInterceptor" setzen, um zu verhindern, dass die Header bei jedem Senden einer Anfrage gesetzt werden.

public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { 

     private final String headerName; 

     private final String headerValue; 

     public HeaderRequestInterceptor(String headerName, String headerValue) { 
      this.headerName = headerName; 
      this.headerValue = headerValue; 
     } 

     @Override 
     public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 
      request.getHeaders().set(headerName, headerValue); 
      return execution.execute(request, body); 
     } 
    } 

Dann

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); 

RestTemplate restTemplate = new RestTemplate(); 
restTemplate.setInterceptors(interceptors); 
+5

Warum brauchen Sie HttpRequestWrapper hier? – nahab

+2

Ich akzeptiere Ihren Ansatz besser, weil Sie Spring auf eine wirklich springende Weise verwenden können, indem Sie spezielle Methoden 'postForObject' usw. anstelle von' exchange' verwenden. Vielen Dank! – Daria

+0

Spring Boot 1.3 hat einen HttpHeaderInterceptor, so dass wir keine eigene Implementierung von ClientHttpRequestInterceptor erstellen müssen. –

7

Wenn, wie ich, Sie kämpfen um ein Beispiel zu finden, die Header mit Standardauthentifizierung und der Rest-Vorlagen-Austausch-API verwendet, ist das, was ich endlich geklappt ...

private HttpHeaders createHttpHeaders(String user, String password) 
{ 
    String notEncoded = user + ":" + password; 
    String encodedAuth = Base64.getEncoder().encodeToString(notEncoded.getBytes()); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    headers.add("Authorization", "Basic " + encodedAuth); 
    return headers; 
} 

private void doYourThing() 
{ 
    String theUrl = "http://blah.blah.com:8080/rest/api/blah"; 
    RestTemplate restTemplate = new RestTemplate(); 
    try { 
     HttpHeaders headers = createHttpHeaders("fred","1234"); 
     HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); 
     ResponseEntity<String> response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, String.class); 
     System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody()); 
    } 
    catch (Exception eek) { 
     System.out.println("** Exception: "+ eek.getMessage()); 
    } 
} 
Verwandte Themen