Je souhaite faire une requête http à un serveur distant tout en gérant correctement les cookies (par exemple, en stockant les cookies envoyés par le serveur et en envoyant ces cookies lorsque je fais des demandes ultérieures). Ce serait bien de conserver tous les cookies, mais le seul qui me tient à cœur est le cookie de session.
Avec java.net, il semble que la meilleure façon de procéder consiste à utiliser java.net.CookieHandler (classe de base abstraite) et java.net.CookieManager (implémentation concrète). Android a java.net.CookieHandler, mais il ne semble pas avoir java.net.CookieManager.
Je pourrais tout coder à la main en inspectant les en-têtes http, mais il semble qu'il doit y avoir un moyen plus simple.
Quelle est la bonne façon de faire des requêtes http sur Android tout en préservant les cookies?
java.net.CookieManager
est maintenant pris en charge dans Android depuis la version 2.3 (API niveau 9): developer.android.com/reference/java/net/CookieManager.htmlRéponses:
Il s'avère que Google Android est livré avec Apache HttpClient 4.0, et j'ai pu comprendre comment le faire en utilisant l'exemple de «connexion basée sur un formulaire» dans la documentation HttpClient :
https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
la source
The method getCookieStore() is undefined for the type HttpClient
, dois-je changer pourList<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
? Parce que si je le fais, ça marche.Un cookie n'est qu'un autre en-tête HTTP. Vous pouvez toujours le définir lors d'un appel HTTP avec la bibliothèque apache ou avec HTTPUrlConnection. Dans tous les cas, vous devriez pouvoir lire et définir les cookies HTTP de cette manière.
Vous pouvez lire cet article pour plus d'informations.
Je peux partager ma paix de code pour démontrer à quel point vous pouvez le faire facilement.
la source
Étant donné que la bibliothèque Apache est obsolète , pour ceux qui souhaitent l'utiliser
HttpURLConncetion
, j'ai écrit cette classe pour envoyer Get and Post Request à l'aide de cette réponse :la source
Je ne travaille pas avec Google Android mais je pense que vous constaterez que ce n'est pas si difficile de faire fonctionner cela. Si vous lisez le bit correspondant du didacticiel java, vous verrez qu'un gestionnaire de cookies enregistré reçoit des rappels du code HTTP.
Donc, s'il n'y a pas de valeur par défaut (avez-vous vérifié si la valeur
CookieHandler.getDefault()
est vraiment nulle?), Vous pouvez simplement étendre CookieHandler, implémenter put / get et le faire fonctionner à peu près automatiquement. Assurez-vous de considérer l'accès simultané et autres si vous suivez cette voie.edit: De toute évidence, vous devrez définir une instance de votre implémentation personnalisée comme gestionnaire par défaut
CookieHandler.setDefault()
pour recevoir les rappels. J'ai oublié de le mentionner.la source