Comment définir un en-tête «Accepter:» sur la demande Spring RestTemplate?

Je veux définir la valeur de Accept: dans une requête que je fais avec Spring’s RestTemplate .

Voici mon code de traitement des demandes Spring

 @RequestMapping( value= "/uom_masortingx_save_or_edit", method = RequestMethod.POST, produces="application/json" ) public @ResponseBody ModelMap uomMasortingxSaveOrEdit( ModelMap model, @RequestParam("parentId") Ssortingng parentId ){ model.addAtsortingbute("atsortingbuteValues",parentId); return model; } 

et voici mon client Java REST:

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

Cela fonctionne pour moi; Je reçois une chaîne JSON du côté serveur.

Ma question est la suivante: comment puis-je spécifier l’en Accept: tête Accept: (par exemple application/json , application/xml , …) et la méthode de requête (par exemple GET , POST , …) lorsque j’utilise RestTemplate?

Je suggère d’utiliser l’une des méthodes d’ exchange qui accepte une HttpEntity pour laquelle vous pouvez également définir les HttpHeaders . (Vous pouvez également spécifier la méthode HTTP que vous souhaitez utiliser.)

Par exemple,

 RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity entity = new HttpEntity<>("parameters", headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 

Je préfère cette solution car elle est fortement typée, c.-à-d. exchange attend une HttpEntity .

Cependant, vous pouvez également transmettre cette HttpEntity tant HttpEntity de request à postForObject .

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

Ceci est mentionné dans le Javadoc RestTemplate#postForObject .

Le paramètre request peut être une HttpEntity afin d’ append des en-têtes HTTP supplémentaires à la requête .

Vous pouvez définir un intercepteur “ClientHttpRequestInterceptor” dans votre RestTemplate pour éviter de définir l’en-tête chaque fois que vous envoyez une requête.

 public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { private final Ssortingng headerName; private final Ssortingng headerValue; public HeaderRequestInterceptor(Ssortingng headerName, Ssortingng 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); } } 

alors

 List interceptors = new ArrayList(); interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(interceptors); 

Si, comme moi, vous avez eu du mal à trouver un exemple qui utilise des en-têtes avec une authentification de base et l’autre API d’échange de modèles, voici ce que j’ai finalement mis au point …

 private HttpHeaders createHttpHeaders(Ssortingng user, Ssortingng password) { Ssortingng notEncoded = user + ":" + password; Ssortingng encodedAuth = Base64.getEncoder().encodeToSsortingng(notEncoded.getBytes()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.add("Authorization", "Basic " + encodedAuth); return headers; } private void doYourThing() { Ssortingng theUrl = "http://blah.blah.com:8080/rest/api/blah"; RestTemplate restTemplate = new RestTemplate(); try { HttpHeaders headers = createHttpHeaders("fred","1234"); HttpEntity entity = new HttpEntity("parameters", headers); ResponseEntity response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, Ssortingng.class); System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody()); } catch (Exception eek) { System.out.println("** Exception: "+ eek.getMessage()); } } 

Voici une réponse simple. J’espère que ça aide quelqu’un.

 import org.springframework.boot.devtools.remote.client.HttpHeaderInterceptor; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; public Ssortingng post(SomeRequest someRequest) { // create a list the headers List interceptors = new ArrayList<>(); interceptors.add(new HttpHeaderInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); interceptors.add(new HttpHeaderInterceptor("ContentType", MediaType.APPLICATION_JSON_VALUE)); interceptors.add(new HttpHeaderInterceptor("username", "user123")); interceptors.add(new HttpHeaderInterceptor("customHeader1", "c1")); interceptors.add(new HttpHeaderInterceptor("customHeader2", "c2")); // initialize RestTemplate RestTemplate restTemplate = new RestTemplate(); // set header interceptors here restTemplate.setInterceptors(interceptors); // post the request. The response should be JSON string String response = restTemplate.postForObject(Url, someRequest, String.class); return response; } 

Code: appel api rest en utilisant modèle

1)

  RestTemplate restTemplate = new RestTemplate(); // Add the Jackson message converter restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Basic XXXXXXXXXXXXXXXX="); HttpEntity entity = new HttpEntity("parameters", headers); restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(USERID, PWORD)); Ssortingng requestJson = getRequetJson(Code, emailAddr, firstName, lastName); // response = restTemplate.postForObject(URL, requestJson, MYObject.class); 

ou

2)

  RestTemplate restTemplate = new RestTemplate(); Ssortingng requestJson = getRequetJson(code, emil, name, lastName); // HttpHeaders headers = new HttpHeaders(); Ssortingng userPass = USERID + ":" + PWORD; Ssortingng authHeaderValue = "Basic " + Base64.getEncoder().encodeToSsortingng(userPass.getBytes()); headers.set(HttpHeaders.AUTHORIZATION, authHeaderValue); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity request = new HttpEntity(requestJson, headers); // ResponseEntity responseEntity =this.restTemplate.exchange(URI, HttpMethod.POST, request, MyObject.class); responseEntity.getBody() 

Méthode créant un object json

  private Ssortingng getRequetJson(Ssortingng Code, Ssortingng emailAddr, Ssortingng firstName, Ssortingng lastName) { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.createObjectNode(); ((ObjectNode) rootNode).put("code", Code); ((ObjectNode) rootNode).put("email", emailAdd); ((ObjectNode) rootNode).put("firstName", firstname); ((ObjectNode) rootNode).put("lastName", lastname); Ssortingng jsonSsortingng = null; try { jsonSsortingng = mapper.writerWithDefaultPrettyPrinter().writeValueAsSsortingng(rootNode); } catch (JsonProcessingException e) { e.printStackTrace(); } return jsonSsortingng; }