postforentity getforobject getforentity java spring rest spring-mvc resttemplate

java - getforobject - Spring RestTemplate a la solicitud POST con encabezados personalizados y un objeto de solicitud



resttemplate postforentity (3)

  1. Intenta habilitar la depuración completa del paquete Spring. Estoy seguro de que obtendrás más información sobre tu "400 Solicitud incorrecta":

    <logger name="org.springframework"> <level value="DEBUG"/> </logger>

  2. Intente enviar la misma solicitud con cualquier herramienta de descanso (por ejemplo, el complemento Chrome de Rest Console).

  3. Vea lo que sucede en la consola de depuración del navegador (pestaña "Red" para Chrome, como ejemplo).

Esos pasos siempre me ayudan.

En Spring RestTemplate hay una forma de enviar encabezados personalizados junto con un objeto de solicitud POST. Ya he probado el método de exchange que está disponible. Parece que podemos enviar pares de valores clave junto con encabezados personalizados pero no un objeto de solicitud adjunto a HttpEntity. El siguiente código ilustra el intento y parece ser 400 BadRequest para el servidor.

HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.APPLICATION_JSON); HttpEntity<?> httpEntity = new HttpEntity<Object>(requestDTO, requestHeaders); RestTemplate restTemplate = new RestTemplate(); restTemplate.exchange(URL, HttpMethod.POST, httpEntity, SomeObject.class);

Alguien consciente de esta situación? ¿O es algo que no es posible que esté tratando de hacer?


Sí, es posible, si usa encabezados MultiValueMap en lugar de HttpHeaders

Ejemplo:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); headers.add("Authorization", "Basic " + base64Creds); headers.add("Content-Type", "application/json"); RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpEntity<ObjectToPass> request = new HttpEntity<ObjectToPass>(objectToPassInstance, headers); restTemplate.postForObject(urlPost, request, Boolean.class);

Boolean.class simplemente porque mi controlador devuelve booleano en este punto final (podría ser cualquier cosa)

¡Buena suerte con la codificación!


Si está utilizando HttpClient 3.x, active el registro siguiendo this . Si está utilizando HttpClient 4.x, active el registro siguiendo this . Eso debería decirle qué se está enviando a través del cable y ser un punto de inicio decente para la depuración.