Comment gérer les cookies avec HttpClient sous Android et / ou Java?

J’essaie de me connecter à un site et de gérer cette session / ce cookie pour que le serveur reconnaisse mon identifiant, mais j’ai du mal à trouver un moyen d’extraire le cookie de la réponse et de créer une requête pour conserver ma connexion. Je me demande si je devrais prendre l’en-tête “Set-Cookie” ou utiliser un CookieStore. Toute aide est grandement appréciée. Voici mon code que j’ai, avec des commentaires où je pense que les méthodes getHeader / getCookie iraient.

public class Http { DefaultHttpClient client = new DefaultHttpClient(); HttpGet request; HttpEntity entity; HttpResponse response; HttpPost post; CookieStore cookieStore = new BasicCookieStore(); HttpContext localContext = new BasicHttpContext(); public static void setContext() { localContext.setAtsortingbute(ClientContext.COOKIE_STORE, cookieStore); } public static void getPage(Ssortingng url) throws Exception { request = new HttpGet(url); response = client.execute(request, localContext); PARSER.preParse(url, response); } public static HttpResponse postPage(List params, Ssortingng host, Ssortingng action) throws Exception { post = new HttpPost(host + action); post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); response = client.execute(post, localContext); entity = response.getEntity(); if(entity != null) { entity.consumeContent(); } return response; } public void destoyHttp() { client.getConnectionManager().shutdown(); } } 

Dans l’espoir que les autres comprennent mieux ma confusion, j’ajoute du code que je connais fonctionne et maintient une session, mais lorsque j’ai essayé de déplacer le code dans mon application réelle, il s’est cassé quelque part.

 public class HttpClientTest extends Activity{ DefaultHttpClient client = new DefaultHttpClient(); HttpGet request; HttpEntity entity; List cookies; HttpResponse response; HttpPost post; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { getRequest(); } catch (Exception e) { Log.d("My Activity", "Failed"); e.printStackTrace(); } } public void getRequest() throws Exception { final Ssortingng TAG = "MyActivity"; request = new HttpGet("http://gc.gamestotal.com/i.cfm?p=login&se=4"); response = client.execute(request); Ssortingng action = "i.cfm?&1028&p=login&se=4"; Ssortingng yourServer = "http://gc.gamestotal.com/"; post = new HttpPost(yourServer + action); List params = new ArrayList(); params.add(new BasicNameValuePair("nic", "myusername")); params.add(new BasicNameValuePair("password", "mypassword")); params.add(new BasicNameValuePair("server", "4")); post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); response = client.execute(post); entity = response.getEntity(); if(entity != null){ entity.consumeContent(); } request = new HttpGet("http://gc.gamestotal.com/i.cfm?f=com_empire&cm=3"); response = client.execute(request); if(entity != null) { entity.consumeContent(); } } } 

Je sais en effet que cela fonctionne, et vous pouvez voir que dans ce code, je consumContent (), mais l’append au code supérieur ne semblait pas faire de différence, alors je l’ai laissé de côté. Des idées?

Edit: Je n’arrive toujours pas à faire fonctionner le code en gardant une session. Je publie les cookies de mon code actuel, ainsi que les cookies du deuxième code qui fonctionne. Peut-être que quelqu’un remarquera un problème, certainement pas.

 08-31 06:53:50.318: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:50.339: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:53:51.948: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D3%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A46%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:41.628: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:41.648: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D4%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A38%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

Vous devez utiliser HttpContext. Définissez le cookie store sur context et passez le contexte long avec HttpGet / HttpPost en mode Exécution. J’espère que cela devrait aider.

Voir exemple: code complet peut être trouvé ici

  // 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.setAtsortingbute(ClientContext.COOKIE_STORE, cookieStore); HttpGet httpget = new HttpGet("http://www.google.com/"); System.out.println("executing request " + httpget.getURI()); // Pass local context as a parameter HttpResponse response = httpclient.execute(httpget, localContext); 

Je n’ai pas réussi à faire fonctionner mon propre code (je pourrais peut-être y travailler plus tard), mais j’ai trouvé le code utile ici Projet Android utilisant httpclient -> http.client (apache), méthode post / get et j’utilise la classe construite par Charlie Collins, qui est similaire au code Http dans l’exemple de ZXing Android. Je pourrais éventuellement passer au code ZXing.

pour moi, cela n’a pas fonctionné, jusqu’à ce que je fasse de HttpContext et CookieStore statiques, pour restr sur toutes les requêtes.