2012-07-26 652 views
1

我想使用Apache HTTP客戶端發出Http POST請求。我試圖將HTTP POST請求的內容(在我的應用程序中接收)複製到另一個HTTP POST請求(從我的應用程序發起到另一個URL)。代碼如下所示:設置HTTP POST請求的內容長度

httpPost = new HttpPost(inputURL); 
// copy headers 
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) { 
     String headerName = e.nextElement().toString(); 
     httpPost.setHeader(headerName, request.getHeader(headerName)); 
} 

BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream()); 
BasicHttpEntity basicHttpEntity = new BasicHttpEntity(); 
basicHttpEntity.setContent(clientToProxyBuf); 
basicHttpEntity.setContentLength(clientToProxyBuf.available()); 

httpPost.setEntity(basicHttpEntity); 

HttpResponse responseFromWeb = httpclient.execute(httpPost); 

基本上,我想實現的代理應用程序,它會得到一個URL作爲參數,剛愎請求的URL,然後服務於個性化的外觀網頁等和感覺。

這裏request是HttpServletRequest。我在設置內容長度時遇到問題。通過調試,我發現clientToProxyBuf.available()沒有給我正確的輸入流長度,我得到了Http error 400 IE和Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection

我做錯了嗎?有沒有其他方法可以實現它?

回答

1

這很簡單,非常明顯。我只需要從頭文件獲取內容長度爲:

basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length"))); 
+0

我在我的應用程序中使用StringEntity類。我們應該如何在StringEntity中設置內容長度? – 2015-12-10 09:51:18

0

available()功能不提供流的內容的實際長度,而

返回可以從該輸入流無阻塞讀取的字節數。 (From javadoc

我建議您先從流中讀取整個內容,然後將其設置爲內容而不是傳遞流對象。這樣,你也將擁有實際的內容長度。

+0

是的,但它會消耗我的輸入流,使它無用,以供進一步使用?從流中讀取內容的 – 2012-07-26 06:45:54

+0

確實使其用於更少的請求。我不認爲這會奏效。感謝您的幫助:) – 2012-07-26 07:15:28

+0

我的意思是說,而不是傳遞流,傳遞內容。 – 2012-07-26 13:21:24