2010-11-10 17 views
37

MISE À JOUR: Cette question et ses réponses ne devraient plus être recommandées à quiconque lisant ceci. Android no-longer recommends HttpClient (read: deprecated), and instead recommends HttpUrlConnection. Un bon exemple de bibliothèques à utiliser maintenant, sont Retrofit et OkHttp. Dans le contexte de cette question, les cookies peuvent être sauvegardés, stockés et livrés avec des requêtes ultérieures. Ceci n'est pas géré de manière transparente. Avec OkHttp you can use Interceptors.Android cookies persistants HttpClient

J'ai une application Android avec plusieurs intentions.

La première intention est un formulaire de connexion, les intentions suivantes reposent sur les cookies fournis par le processus de connexion. Le problème que j'ai, c'est que les cookies ne semblent pas persister à travers les intentions. Je crée de nouveaux HttpClients dans chaque intention (j'ai d'abord essayé de Parcelable de le transmettre à chaque intention, ce qui ne marchait pas très bien).

Quelqu'un a-t-il des conseils pour que les cookies persistent dans les intentions?

+0

Soit dit en passant, le plus proche que j'ai trouvé est d'écrire le prefs dans le magasin de cookies partagés. – Knossos

+0

Pour terminer cette discussion, j'ai réussi ma quête en créant ma propre classe HttpClient avec des méthodes pour définir et obtenir son CookieStore. Je l'ai fait de sorte que lors de l'initialisation du client, il a automatiquement récupéré tous les cookies de SharedPreferences. En outre, avant chaque création d'une nouvelle intention ou la fin de celle en cours, tous les cookies sont copiés dans SharedPreferences. – Knossos

Répondre

31

Vous pouvez faire ce que @Emmanuel a suggéré ou vous pouvez passer le BasicHttpContext entre les HttpClients que vous créez.

Exemple d'utilisation du contexte et les cookies, complete code here

HttpClient httpclient = new DefaultHttpClient(); 

    // Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/", localContext); 
+0

Merci pour l'information, cela semble être le meilleur choix pour moi. – Knossos

22

Ne créez pas de nouveaux HttpClients; cela effacera les cookies. Réutiliser un seul HttpClient.

+0

donc je peux rendre le httpclient statique. – Senthil

+0

@vsk: Oui. Vous pourriez, par exemple, utiliser un singleton. Je crée typiquement un Singleton de ConnectionHelper où je peux sérialiser des demandes au serveur. – Emmanuel

4

Faites votre httpClient une classe singleton.

4

définir HttpClient dans la classe Application et utiliser l'activité.

dans la demande

public class AAA extends Application { 
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

dans l'activité

AAA aaa = (AAA)getApplication(); 
httpClient = app.httpClient; 
+1

Cette réponse est bonne! Pourquoi downvote? –

+0

Vous n'avez aucun contrôle sur l'état de l'application, si vous utilisez ceci assurez-vous de faire une vérification nulle ou une méthode en AAA pour obtenir le client avec cette vérification. – DagW