2012-10-01 19 views
6

Komunikuję się z usługą sieciową, która oczekuje parametru POST, a także oczekuję treści żądania. Potwierdziłem, że takie żądanie POST można wykonać przy użyciu konsoli REST, którą mam, ale nie mogę wykonać takiego żądania w Javie przy użyciu bibliotek Apache.W jaki sposób mogę POST używać języka Java i dołączyć parametry oraz surową treść żądania?

W poniższym kodzie, jestem w stanie POST na usługę sieciową i poprawnie odbiera zawartość zmiennej raw_body. Jeśli odkomentuję pierwszą z dwóch skomentowanych linii, usługa internetowa otrzyma parametr "fname", ale nie będzie już odbierać treści 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); 

Jak mogę przesłać zarówno parametr, jak i treść?

Odpowiedz

3

Możesz użyć metody setQueryString, aby dodać parametry do adresu URL, do którego jest POST. Z perspektywy RESTful argumentowałbym, że normalnie nie powinno się tego robić, ponieważ POST powinien reprezentować wywołanie do zasobu i wszystko, co kwalifikuje się do parametru zapytania, powinno być zawarte w reprezentacji przesyłanej w żądaniu body ... lub powinien reprezentować kwalifikację samego zasobu, w którym to przypadku powinien być częścią ścieżki, która została wysłana, i która mogłaby zostać wyodrębniona przez kontroler za pomocą @ PathVariable/@ PathParam lub czegoś podobnego. Więc w twoim przypadku możesz również szukać czegoś takiego jak POST /MyRestWebService/files/test.txt lub dokładniej PUT, jeśli oszczędzasz zasób i znasz URI. Kod na serwerze może wyciągnąć nazwę pliku ze wzorca adresu URL.

+0

Ach, to jest idealne. setQueryString ** to dokładnie to, czego potrzebowałem. Twoje komentarze na ten temat, które nie są bardzo restful, a także, że prawdopodobnie powinna być prośba PUT są dobrze zrobione. Dziękuję za kierowanie mną we właściwym kierunku. –

3

Należy wysłać żądanie POST za pomocą formularza wieloczęściowego. Oto przykład:

Apache HttpClient making multipart form post

Alternatywnie, można wykonać żądania POST z treścią (parametry i plików) zakodowane przy użyciu application/x-www-form-urlencoded ale nie jest to zalecane, gdy chcesz, aby żądania POST z dużą zawartością, jak pliki.

+0

To pokazuje, jak utworzyć wieloczęściowy wpis, jeśli miałem kilka dużych obiektów do wysłania (co nie dotyczy mojego problemu), i nie daje mi żadnych informacji o tym, jak uwzględnić parametr, który muszę przechodzić. –

+0

to nieprawda. jest również stosowany do małych parametrów. dodanie ciągu zapytania do żądania POST nie jest zalecane. niektóre programy obsługi protokołu HTTP mogą nie parsować części zapytania żądania POST, ponieważ się tego nie spodziewają. jeśli nie działa na twoim serwerze, może to być przyczyną. tak długo, jak działa na twoim serwerze, używaj tego, co działa najlepiej dla ciebie. ale z punktu widzenia projektowania nie jest to zalecane. – gigadot

Powiązane problemy