2012-10-01 18 views
6

Sto comunicando con un servizio Web che si aspetta un parametro POST e si aspetta anche il corpo della richiesta. Ho confermato che una tale richiesta POST può essere eseguita utilizzando una console REST che ho, ma non riesco a fare una tale richiesta in Java usando le librerie Apache.Come posso POST utilizzare Java e includere parametri e un corpo di richiesta non elaborato?

Nel codice seguente, sono in grado di inviare POST al servizio Web e riceve correttamente il contenuto della variabile raw_body. Se rimuovi il commento dalla prima delle due righe commentate, il servizio web riceve il parametro "fname", ma non riceve più il corpo del POST.

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.commons.httpclient.methods.RequestEntity; 
... 

HttpClient httpClient = new HttpClient(); 
String urlStr = "http://localhost:8080/MyRestWebService/save"; 
PostMethod method = new PostMethod(urlStr); 
String raw_body = "This is a very long string, much too long to be just another parameter"; 
RequestEntity re = new StringRequestEntity(raw_body, "text/xml", "UTF-16"); 
//method.addParameter("fname", "test.txt"); 
//httpClient.getParams().setParameter("fname", "test.txt"); 
method.setRequestEntity(re); 

Come è possibile trasmettere sia il parametro che il corpo?

risposta

3

È possibile utilizzare il metodo setQueryString per aggiungere i parametri all'URL in cui viene eseguito il POST. Da una prospettiva REST, direi che normalmente non dovresti farlo, dal momento che un POST dovrebbe rappresentare una chiamata a una risorsa e qualsiasi cosa che potrebbe qualificarsi per un parametro di query dovrebbe essere inclusa nella rappresentazione che viene trasferita nella richiesta body ... o dovrebbe rappresentare la qualificazione della risorsa stessa, nel qual caso dovrebbe essere parte del percorso che è pubblicato su cui potrebbe essere estratto dal controller usando @ PathVariable/@ PathParam o qualcosa di simile. Quindi nel tuo caso potresti anche cercare qualcosa come POST /MyRestWebService/files/test.txt o più convenientemente un PUT se stai salvando la risorsa e conosci l'URI. Il codice sul server potrebbe estrarre il nome file da un pattern URL.

+0

Ah, questo è perfetto. setQueryString è ** esattamente ** ciò di cui avevo bisogno. I tuoi commenti su questo non essere molto Riposo e anche che probabilmente dovrebbe essere una richiesta PUT sono ben presi. Grazie per avermi guidato nella giusta direzione. –

3

È necessario effettuare una richiesta POST utilizzando il modulo multipart. Ecco l'esempio:

Apache HttpClient making multipart form post

In alternativa, è possibile effettuare una richiesta POST con il contenuto (parametri e file) codificati utilizzando application/x-www-form-urlencoded ma non è consigliato quando si vuole fare una richiesta POST con i contenuti di grandi dimensioni, come i file.

+0

Questo mi mostra come creare un post in più parti se avessi diversi oggetti di grandi dimensioni da inviare (che non è applicabile al mio problema) e non mi fornisce alcuna informazione su come includere il parametro che ho bisogno di passaggio. –

+0

non è vero. è anche applicato a piccoli parametri. non è consigliabile aggiungere una stringa di query a una richiesta POST. alcuni software di gestione HTTP potrebbero non analizzare la parte di query di una richiesta POST in quanto non se lo aspetta. se non funziona sul tuo server, questa potrebbe essere la causa. Finché funziona sul tuo server, usi quello che funziona meglio per te. ma dal punto di vista del design, non è raccomandato. – gigadot