java - exchange - Solicitud POST a través de RestTemplate en JSON
resttemplate post json (10)
No encontré ningún ejemplo de cómo resolver mi problema, por lo que quiero pedirle ayuda. No puedo simplemente enviar una solicitud POST utilizando el objeto RestTemplate en JSON
Cada vez que obtengo org.springframework.web.client.HttpClientErrorException: 415 Tipo de medio no admitido
Yo uso RestTemplate de esta manera:
...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);
¿Qué es mi culpa?
Como se especifica here , supongo que debe agregar un MappingJacksonHttpMessageConverter
para MappingJacksonHttpMessageConverter
El error "415 Unsupported Media Type" indica que el servidor no aceptará su solicitud POST. Su solicitud está absolutamente bien, es el servidor que está mal configurado.
MappingJacksonHttpMessageConverter
configurará automáticamente el encabezado de tipo de contenido de la solicitud en application/json
, y supongo que su servidor está rechazando eso. Sin embargo, no nos ha dicho nada sobre la configuración de su servidor, así que no puedo aconsejarle sobre eso.
Esta técnica funcionó para mí:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);
espero que esto ayude
KD
Estaba obteniendo este problema y estoy usando Spring''s RestTemplate en el cliente y Spring Web en el servidor. Ambas API tienen informes de errores muy pobres, lo que los hace extremadamente difíciles de desarrollar.
Después de muchas horas de probar todo tipo de experimentos, descubrí que el problema estaba causado por pasar una referencia nula para el cuerpo POST en lugar de la Lista esperada. Supongo que RestTemplate no puede determinar el tipo de contenido de un objeto nulo, pero no se queja de él. Después de agregar los encabezados correctos, comencé a recibir una excepción del lado del servidor diferente en primavera antes de ingresar a mi método de servicio.
La solución era pasar una lista vacía del cliente en lugar de nulo. No se requieren encabezados ya que el tipo de contenido predeterminado se usa para objetos que no son nulos.
Este código funciona para mí;
RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);
Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);
He estado usando la plantilla de descanso con JSONObjects de la siguiente manera:
// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);
// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);
// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
.exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
// nono... bad credentials
}
Lo estoy haciendo de esta manera y funciona.
HttpHeaders headers = createHttpHeaders (mapa);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
for (Entry<String, String> entry : map.entrySet()) {
headers.add(entry.getKey(),entry.getValue());
}
return headers;
}
// Pase encabezados aquí
String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());
Espero que esto ayude
Me encontré con este problema al intentar depurar un punto final REST. Aquí hay un ejemplo básico que usa la clase SpringTemplate RestTemplate para hacer una solicitud POST que utilicé. Me tomó un tiempo bastante largo juntar código de diferentes lugares para obtener una versión funcional.
RestTemplate restTemplate = new RestTemplate();
String url = "endpoint url";
String requestJson = "{/"queriedQuestion/":/"Is there pain in your hand?/"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);
El analizador JSON particular, mi punto final de reposo, usaba las comillas dobles necesarias para los nombres de los campos, así que es por eso que he escapado de las comillas dobles en mi requestJson String.
Para mí, el error ocurrió con esta configuración:
AndroidAnnotations
Spring Android RestTemplate Module
y ...
GsonHttpMessageConverter
Las anotaciones de Android tienen algunos problemas con esta conversión para generar solicitud POST
sin parámetro. Simplemente el parámetro new Object()
resolvió por mí.
Si está utilizando Spring 3.0, una manera fácil de evitar la excepción org.springframework.web.client.HttpEdgeException: 415 Unsupported Media Type , es incluir los archivos jackson jar en su classpath, y usar el elemento de configuración mvc:annotation-driven
. Como se especifica aquí .
Me estaba tirando de los pelos tratando de descubrir por qué la aplicación mvc-ajax funcionaba sin ninguna configuración especial para el MappingJacksonHttpMessageConverter
. Si leíste de cerca el artículo que vinculé anteriormente:
Debajo de las cubiertas, Spring MVC delega en HttpMessageConverter para realizar la serialización. En este caso, Spring MVC invoca un MappingJacksonHttpMessageConverter basado en el procesador Jackson JSON. Esta implementación se habilita automáticamente cuando utiliza el elemento de configuración mvc: annotation-driven con Jackson presente en su classpath .