2010-11-02 30 views
81

Non ho trovato alcun esempio su come risolvere il mio problema, quindi voglio chiederti aiuto. Non posso semplicemente invia una richiesta POST utilizzando oggetto RestTemplate in JSONRichiesta POST tramite RestTemplate in JSON

Ogni volta che ho org.springframework.web.client.HttpClientErrorException: 415 Tipo di Supporto Non

Io uso RestTemplate in questo modo:

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

Qual è il mio errore?

+1

@troyfolger l'URL non è più valida – Noremac

+0

Grazie - questo collegamento funziona partire da questa scrittura: https: // primavera .io/guides/gs/eating-resto/ – troyfolger

+0

Per risolvere il problema specifico dell'OP, sopra, probabilmente manca un'intestazione HTTP con il tipo di contenuto appropriato, vedere la risposta di morganw09dev di seguito. – troyfolger

risposta

6

L'errore "415 Tipo di supporto non supportato" indica che il server non accetta la richiesta POST. La tua richiesta è assolutamente soddisfacente, è il server che è configurato male.

MappingJacksonHttpMessageConverter imposta automaticamente l'intestazione del tipo di contenuto della richiesta su application/json e suppongo che il server la stia rifiutando. Non ci hai ancora detto nulla sulla configurazione del tuo server, quindi non posso davvero consigliarti su questo.

9

come specificato here immagino è necessario aggiungere un messageConverter per MappingJacksonHttpMessageConverter

5

Se si utilizza Primavera 3.0, un modo semplice per evitare il org.springframework.web.client.HttpClientErrorException: 415 Tipo di Supporto Non l'eccezione è includere i file jar di jackson nel classpath e utilizzare l'elemento di configurazione mvc:annotation-driven. As specified here.

Mi stavo strappando i capelli cercando di capire perché l'app mvc-ajax funzionava senza alcuna configurazione speciale per lo MappingJacksonHttpMessageConverter. Se andate a leggere l'articolo che ho linkato sopra da vicino:

sotto le coperte, Spring MVC delegati ad un HttpMessageConverter per eseguire la serializzazione. In questo caso , Spring MVC richiama un MappingJacksonHttpMessageConverter costruito sul processore Jackson JSON. Questa implementazione viene attivata automaticamente quando si utilizza il MVC: annotazione-driven configurazione elemento con Jackson presente nel vostro classpath.

105

Questa tecnica ha funzionato per me:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers); 
ResponseEntity<String> response = restTemplate.put(url, entity); 

Spero che questo aiuta

KD

+3

per favore spiega quale riga deve restituire il risultato della richiesta http – gstackoverflow

+0

Per me non era necessario specificare alcuna intestazione. Ho usato l'HttpEntity che accetta un singolo parametro. –

+0

Probabilmente una delle soluzioni più semplici ma funzionanti che abbia mai visto! – JavaTec

53

Sto usando modello di riposo con JSONObjects come segue:

// 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

Grazie - il metodo JSONObject toString è stato utile per me, mi ha aiutato a ottenere il mio JSONString preciso. – Simon

+1

Come sviluppato sopra il codice per questo: 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ö Come posso recuperare questi parametri da json a fine server ?? – KJEjava48

0

Per me si è verificato un errore con questa configurazione :

AndroidAnnotations Spring Android RestTemplate Module e ...

GsonHttpMessageConverter

annotazioni Android ha alcuni problemi con questo convertiti per generare POST richiesta senza parametri. Semplicemente il parametro new Object() l'ha risolto per me.

58

Ho riscontrato questo problema durante il tentativo di eseguire il debug di un endpoint REST. Ecco un esempio di base che utilizza la classe RestTemplate di Spring per creare una richiesta POST che ho usato. Mi ci è voluto un po 'di tempo per mettere insieme il codice da diversi punti per ottenere una versione funzionante.

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

La particolare parser JSON mio riposo endpoint stava usando le virgolette necessarie intorno nomi dei campi è per questo che ho fuggito i doppi apici nel mio String requestJson.

+0

puoi aiutarmi per favore su questo http://stackoverflow.com/questions/42240927/how-to-search-via-json-in-elastic-search -using-spring-resttemplate-in-android – FaisalAhmed

+0

Può Spring utilizzare i convertitori di messaggi per convertire automaticamente Java Object in json come ha fatto in Restful API con RestTemplate? – fall

+0

Questo ha funzionato per me. – bynu022

2

Stavo ricevendo questo problema e sto usando Spring's RestTemplate sul client e Spring Web sul server. Entrambe le API presentano una segnalazione degli errori molto scarsa, che li rende estremamente difficili da sviluppare.

Dopo molte ore di tentativi di tutti i tipi di esperimenti, ho capito che il problema era causato dal passaggio di un riferimento null per il corpo POST invece dell'elenco previsto. Presumo che RestTemplate non possa determinare il tipo di contenuto da un oggetto nullo, ma non si lamenta di ciò. Dopo aver aggiunto le intestazioni corrette, ho iniziato a ricevere un'eccezione lato server diversa in primavera prima di immettere il mio metodo di servizio.

La correzione doveva passare in una lista vuota dal client anziché null. Non sono richieste intestazioni poiché il tipo di contenuto predefinito viene utilizzato per oggetti non nulli.

2

Questo codice funziona per me;

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

Sto facendo in questo modo e funziona.

intestazioni HttpHeaders = createHttpHeaders (mappa);

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

// intestazioni passate di qua

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

Spero che questo aiuti

Problemi correlati