2012-06-08 51 views
0

使用帶Cookie的AndroidHttpClient可以讓200 OK和403禁止的響應混合在一起。我不知道我做錯了什麼。AndroidHttpClient和Cookies

我使用AndroidHttpClient以下方式:

我有好幾個後臺線程類,而且每一個執行以下操作:

HttpGet get... 
HttpClient client = AndroidHttpClient.newInstance("Android"); 
HttpContext http_context = HttpSupport.getHttpContextInstance(); 
CookieStore cookie_store = HttpSupport.getCookieStoreInstance(); 
http_context.setAttribute(ClientContext.COOKIE_STORE, cookie_store); 
client.execute(

HttpSupport是有兩個靜態字段的類; CookieStore和HttpContext:

public class HttpSupport { 

private static HttpContext _context; 
private static CookieStore _cookieStore; 

public static synchronized HttpContext getHttpContextInstance() { 
    if (_context == null) { 
     _context = new BasicHttpContext(); 
    } 
    return _context; 
} 

public static synchronized CookieStore getCookieStoreInstance() { 
    if (_cookieStore == null) { 
     _cookieStore = new BasicCookieStore(); 
    } 
    return _cookieStore; 
} 

} 

可以在應用程序中有多個AndroidHttpClient實例嗎?我是否正確存儲了Cookie?

+0

您是否在整個代碼中使用客戶端的不同實例?你確定你的服務器沒有過期導致你的問題嗎? –

+0

我在整個代碼中使用客戶端的不同實例。我改爲使用單身DefaultHttpClient。 – benkdev

+0

你最終做了什麼? – amadib

回答

1

HttpClient自動存儲我找到的cookie,你應該在異步任務中完成所有這些(對於Android 3.0>需求)。

200響應是當一切都已經通過正確的發送和你想要的文件是可用的,這不是一個問題。

403錯誤非常明顯,此服務器是否需要某種類型的登錄才能獲取文件或網頁?這是你應該調查的,一種解決如何登錄的方法是使用諸如google chrome之類的東西,右鍵單擊網頁,查看檢查元素,然後觀察網絡文件,登錄,查看發佈的請求。瞭解該網站的工作原理。

看一看這裏的異步任務:HTTP POST request ANDROID 4 (working in 2.3)?

我相信你能得到的HttpClient的多個實例,但是要使用你應該使用一個連接

的一切同樣的Cookie例如:

你應該有一個HttpClient的登錄,然後用得到的,你需要做的等等什麼都請求一個頁面


對不起,我使用AndriodHttpClient而不是HttpClient,AndroidHttpClient默認不存儲cookie,所以是的,你爲什麼要使用AndroidHttpClient而不是HttpClient?

+0

我想使用HttpClient你需要導入Apache庫。我使用多個客戶端,因爲我有多個線程提出請求。 – benkdev

+0

我不需要導入Apache庫?難道你不能對客戶端進行靜態引用,並且從所有線程引用客戶端? – FabianCook

+0

http://developer.android.com/reference/org/apache/http/client/HttpClient.html – FabianCook

5

我會建議使用Android Asynchronous HTTP Client

它實現其自身的持久性cookie存儲(PersistentCookieStore),這是很容易使用。事實上,如果你不想使用它的異步功能庫,你可以將它用於它提供的Persistent Cookie Store。但是它的異步功能非常值得。

因此,爲了與當前類使用它,你可以簡單地做出有

public static synchronized CookieStore getCookieStoreInstance(Context context) { 
    if (_cookieStore == null) { 
     _cookieStore = new PersistentCookieStore(context); 
    } 
    return _cookieStore; 
} 

請注意,你將不得不因爲它是必需的PersistentCookieStore上下文添加到方法你HttpSupport類的變化上班。

+0

請給出downvote的原因。我正在使用提到的cookie存儲的AndroidHttpClient,並發現來自此庫的持久性cookie存儲能夠很好地工作。另一個顯而易見的解決方案是不使用android httpclient,而是使用DefaultHttpClient來描述這裏http://stackoverflow.com/questions/5410823/how-to-use-defaulthttpclient-in-android –

+0

本來是要投票決定的 - .-我想改變它,但它不會讓我。做一些類型的編輯,我可以嗎?謝謝:) – FabianCook

+0

沒關係。雖然不是一個很好的答案,但我覺得它不值得讚揚。 2分雖然傷害不大。我認爲OP實際上應該嘗試使用該庫(對於cookie存儲和使用異步http調用來簡化他的應用)。它看起來像http auth完全由它支持。 –