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 unaHttpEntity
para agregar encabezados HTTP adicionales a la solicitud .