2010-09-03 71 views
1

我想創建一個小的java應用程序,將一些wiki內容從一臺服務器複製到另一臺服務器。 API是based on the XML-RPChttpclient - 使用帶POST消息的cookie

基本上我有三種方法,logingetPageputPage。我使用Apache HttpClient 3.x併成功地使用login登錄成功,並使用getPage正確獲取舊wiki的頁面。

使用cookie處理認證:我登錄到新的wiki並在相應的httpclient上設置了一些cookie。 doku告訴我,其中一個cookie用於驗證。

然後我在同一個httpclient上用另一個POST方法執行putPage,並且服務器響應一個認證失敗消息。

的代碼序列是這樣的(非常小):

HttpClient client = new HttpClient(); 
PostMethod postLogin = createNewPostMethod("login", "user", "pw"); 
client.executeMethod(postLogin); 
// Now I'm logged in and the client definitly has stored the cookies 
PostMethod postPutPage = createNewPostMethod("putPage", getPage()); 
client.executeMethod(postPutPage); // the server won't let me put the page 

它應該工作一樣,或者我需要手動添加餅乾到第二post方法,如果是,如何?


編輯/解決方案

隨着這個問題的答案,我能夠發現和解決問題,這是的HttpClient的使用之外的幫助。最後,這是目標wiki端的配置問題。這裏的答案幫助我在另一個論壇上提出正確的問題。

回答

5

默認情況下,Cookie由HTTPClient處理。你不應該做任何事情來讓cookies正常工作。

來源: http://www.innovation.ch/java/HTTPClient/getting_started.html#cookies


編輯爲Apache HTTP客戶端:

Apache的HTTP客戶端相同的行爲:-)

這裏是源: http://hc.apache.org/httpclient-3.x/cookies.html

+0

對不起,剛剛意識到,有太多'httpclients'了。我使用Apache HttpClient,引用的頁面讓我感到緊張,但它描述了一個HTTPClient,這是一個不同的東西。編輯我的問題,使其更清晰一點。 – 2010-09-03 15:16:43

+0

我編輯了我的答案,以匹配Apache HTTP客戶端,但行爲是完全相同的:-) – 2010-09-03 15:20:46

1

你可以使用HTTP客戶端手動設置cookie,但它會正確處理cookie在您的連接期間創建。

HttpClient支持cookie的自動管理,包括允許服務器設置cookie並在需要時自動將它們返回給服務器。也可以手動將Cookie發送到服務器。


資源:

+0

它說*當需要時*,HttpClient如何知道第二個POST方法需要cookie?或者與服務器有一些握手協議 - 就像服務器接收到POST,然後請求cookies一樣? – 2010-09-03 15:22:54

+0

當HTTPClient連接到您的服務器時,我認爲* cookie協議*會告訴(取決於協議)是否需要cookie。但我必須說,我甚至都不知道cookie上有RFC。 無論如何,HTTPClient會爲您處理。 – 2010-09-03 15:33:19

1

我歷來用這個當我想接受Cookie與HttpClient的

postPutPage.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); 
+0

嘗試過一個也沒有成功 - 更糟糕的是,通過這個設置,我的cookie在第二個'executeMethod'調用後被覆蓋/部分刪除... – 2010-09-03 15:27:00