mkyong headers getforobject example cliente spring rest resttemplate

headers - ¿Cómo establecer un encabezado "Aceptar:" en la solicitud Spring RestTemplate?



resttemplate timeout (3)

Quiero establecer el valor de Accept: en una solicitud que estoy haciendo usando Spring''s RestTemplate .

Aquí está mi código de manejo de solicitud de primavera

@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; }

y aquí está mi cliente Java REST:

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); }

Esto funciona para mí; Obtengo una cadena JSON del lado del servidor.

Mi pregunta es: ¿cómo puedo especificar el encabezado Accept: (por ejemplo, application/json , application/xml , ...) y el método de solicitud (por ejemplo, GET , POST , ...) cuando uso RestTemplate?


Puede establecer un interceptor "ClientHttpRequestInterceptor" en su RestTemplate para evitar establecer el encabezado cada vez que envíe una solicitud.

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); } }

Entonces

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


Si, como yo, luchaste por encontrar un ejemplo que use encabezados con autenticación básica y la API de intercambio de plantilla de descanso, esto es lo que finalmente resolví ...

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()); } }


Sugiero usar uno de los métodos de exchange que acepte una HttpEntity para la cual también puede establecer HttpHeaders . (También puede especificar el método HTTP que desea usar).

Por ejemplo,

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

Prefiero esta solución porque está muy tipada, es decir. exchange espera una HttpEntity .

Sin embargo, también puede pasar esa HttpEntity como argumento de request a postForObject .

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

Esto se menciona en RestTemplate#postForObject Javadoc .

El parámetro de request puede ser una HttpEntity para agregar encabezados HTTP adicionales a la solicitud .