2012-10-01 131 views
6

我正在與期望POST參數的Web服務進行通信,並期望請求正文。我已經確認可以使用REST控制檯完成這樣的POST請求,但我無法使用Apache庫在Java中發出這樣的請求。如何使用Java進行POST幷包含參數和原始請求體?

在下面的代碼中,我能夠POST到Web服務,並且它正確地接收變量raw_body的內容。如果我取消註釋兩條註釋行中的第一行,則Web服務會收到「fname」參數,但它不再接收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); 

如何傳輸參數和正文?

回答

3

您可以使用setQueryString方法將參數添加到要發送到的URL。從RESTful的角度來看,我認爲你通常不應該那樣做,但是,由於POST應該表示對資源的調用,並且任何符合查詢參數的資格都應該包含在請求中傳輸的表示中body ...或者它應該代表資源本身的資格,在這種情況下,它應該是發佈的路徑的一部分,然後可以由控制器使用@ PathVariable/@ PathParam或類似的東西提取它。所以在你的情況下,你也可以尋找像POST /MyRestWebService/files/test.txt之類的東西,或者更適合的PUT,如果你保存資源並知道URI。服務器上的代碼可以從URL模式中拉出文件名。

+0

啊,這是完美的。 setQueryString是**完全**我需要的。您對此的評論不是非常安靜,也可能是PUT請求。感謝您指引正確的方向。 –

3

您需要使用multipart-form進行POST請求。這裏是例子:

Apache HttpClient making multipart form post

或者,你可以使用application/x-www-form-urlencoded編碼的內容(參數和文件)POST請求,但不建議當你想與大內容的POST請求,像文件。

+0

這顯示瞭如何創建一個多部分帖子,如果我有幾個大對象發送(這不適用於我的問題),並沒有給我任何關於如何包含我需要的參數的信息通過。 –

+0

這是不正確的。它也適用於小參數。不建議將查詢字符串添加到POST請求中。某些http處理程序軟件可能無法解析POST請求的查詢部分,因爲它並不期望這樣做。如果它不能在你的服務器上工作,那可能是原因。只要它在你的服務器上工作,那麼你可以使用最適合你的任何工具。但從設計角度來看,並不推薦。 – gigadot

相關問題