2010-11-02 37 views
81

No encontré ningún ejemplo de cómo resolver mi problema, por lo tanto, quiero pedirle ayuda. No puedo simplemente enviar solicitud POST usando el objeto RestTemplate en JSONSolicitud POST a través de RestTemplate en JSON

Cada vez que tengo org.springframework.web.client.HttpClientErrorException: 415 Tipo de papel no compatible

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

¿Cuál es mi error?

+1

@troyfolger la dirección de Internet ya no es válida – Noremac

+0

Gracias - este enlace está funcionando como de este escrito: https: // primavera .io/guides/gs/consuming-rest/ – troyfolger

+0

Para abordar el problema específico de OP, anteriormente, es probable que le falte un encabezado HTTP con el tipo de contenido apropiado, consulte la respuesta de morganw09dev a continuación. – troyfolger

Respuesta

6

El error "Tipo de medio no admitido 415" le 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 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.

9

Tal como se define here Creo que se necesita añadir un messageConverter para MappingJacksonHttpMessageConverter

5

Si está utilizando Spring 3.0, una forma fácil de evitar la org.springframework.web.client.HttpClientErrorException: 415 Tipo de papel no compatible excepción, es incluir los archivos jar de jackson en su classpath, y usar el elemento de configuración mvc:annotation-driven. As specified here.

Estaba tirando de mi cabello tratando de averiguar por qué la aplicación mvc-ajax funcionó sin ninguna configuración especial para el MappingJacksonHttpMessageConverter. Si usted lee el artículo he vinculado estrechamente anterior:

Debajo de las cubiertas, Spring MVC delegados a una HttpMessageConverter a realizar la serialización. En este caso , Spring MVC invoca un MappingJacksonHttpMessageConverter basado en el procesador Jackson JSON. Esta aplicación se habilita automáticamente cuando se utiliza el MVC: anotación impulsada elemento de configuración con Jackson presentes en su ruta de clase .

105

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 a

KD

+3

por favor explique qué fila debe devolver el resultado de la solicitud http – gstackoverflow

+0

Para mí no fue necesario especificar ningún encabezado. He usado el HttpEntity que toma un solo parámetro. –

+0

¡Probablemente una de las soluciones más simples que he visto hasta ahora! – JavaTec

53

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 
} 
+0

Gracias - el método JSONObject toString fue útil para mí, me ayudó a obtener mi JSONString precisa. – Simon

+1

Cómo se desarrolló el código anterior para esto: curl -vvv -X POST "http: // localhost: 8080/SillyService_SRC/oauth/token?grant_type = password & client_id = my-trusted-client & username = admin & password = password "? – Prateek

+0

@Mikael Lepistö ¿Cómo puedo recuperar estos parámetros de json en el servidor? – KJEjava48

0

Para mí el error ocurrió con esta configuración :

AndroidAnnotations Spring Android RestTemplate Module y ...

GsonHttpMessageConverter

anotaciones Android tiene algunos problemas con este convertidos para generar POST solicitud sin parámetros. Simplemente el parámetro new Object() lo resolvió por mí.

58

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 reposo punto final estaba utilizando comillas dobles se necesitan alrededor de nombres de campo y por eso me he escapado de las comillas dobles en mi cadena requestJson.

+0

¿pueden ayudarme en este http://stackoverflow.com/questions/42240927/how-to-search-via-json-in-elastic-search -using-spring-resttemplate-in-android – FaisalAhmed

+0

¿Puede Spring utilizar los conversores de mensajes para convertir automáticamente el objeto Java a json como lo hizo en Restful API con RestTemplate? – fall

+0

Esto funcionó para mí. – bynu022

2

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, me di cuenta de 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.

2

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

Lo estoy haciendo de esta manera y funciona.

HttpHeaders headers = createHttpHeaders (map);

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

// cabeceras pasar por 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()); 

Esperanza esto ayuda

Cuestiones relacionadas