2010-08-25 6 views
1

Ceci est une question de suivi de Sending html commands over httpclient android, j'ai POSTé avec succès au serveur et reçu le code 200, mais quand je tente de passer à une autre page, il ne reconnaît pas que je me suis connecté. Je me demande s'il s'agit d'un problème de session ou si j'ai besoin de suivre la redirection après le POST. Comment pourrais-je suivre une redirection? Encore une fois toute aide est grandement appréciée. Voici une simple application HttpClient/POST que j'ai créée à partir d'exemples afin de m'aider à tester rapidement les changements.HttpClient Post problème de session? Comment savoir si la session a été créée?

public class HttpClientTest extends Activity{ 

HttpClient client = new DefaultHttpClient(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final Button btnFetch = (Button)findViewById(R.id.button); 
    final TextView txtResult = (TextView)findViewById(R.id.content); 
    final Button login = (Button)findViewById(R.id.button2); 


    btnFetch.setOnClickListener(new Button.OnClickListener(){ 
     public void onClick(View v){ 
      getRequest(txtResult); 
     } 
    }); 

    login.setOnClickListener(new Button.OnClickListener(){ 
     public void onClick(View v){ 
      try { 
       login(txtResult); 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public void getRequest(TextView txtResult){ 
    HttpGet request = new HttpGet("http://gc.gamestotal.com/i.cfm?f=com_empire&cm=3"); 
    try{ 
     HttpResponse response = client.execute(request); 
     txtResult.setText(Parser.request(response)); 
    }catch(Exception ex){ 
     txtResult.setText("Failed!"); 
    } 
} 

public void login(TextView txtResult) throws UnsupportedEncodingException, IOException{ 
    String action = "i.cfm?&1028&p=login&se=4"; 
    String yourServer = "http://gc.gamestotal.com/"; 
    HttpPost post = new HttpPost(yourServer + action); 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("nic", "user")); 
    params.add(new BasicNameValuePair("password", "password")); 
    params.add(new BasicNameValuePair("server", "4")); 
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); 
    post.setEntity(entity); 

    try{ 
     HttpResponse response = client.execute(post); 
     txtResult.setText(response.getEntity().toString()); 
    }catch(Exception ex){ 
     txtResult.setText("Failed!"); 
    } 
} 

}

I appuyer sur le bouton de connexion sur l'interface utilisateur qui me donne le code de réponse OK Http/1.1 200, mais quand je presse le bouton btnFetch qui me envoie à une page dans laquelle vous devez mais connecté pour accéder, je reçois la page non connecté. Des idées?

+0

Vous devez poser cette question à la personne qui a écrit l'application Web à laquelle vous accédez. Seulement ils peuvent vous dire comment ils veulent que vous fassiez ce que vous essayez de faire. – CommonsWare

+0

J'en avais peur. Merci pour votre réponse. –

+0

Peut-être quelques problèmes de cookie .. S'il vous plaît vérifier – Vinay

Répondre

0

Après de nombreuses recherches et de nombreux exemples plus tard, j'ai finalement réussi à me connecter au site que je tentais. Apparemment, il était un problème avec moi ne pas consommer l'entité de la réponse, à savoir les cookies. J'ai créé une activité simple dont le but principal est de GET et de poster sur le site puis de cracher le résultat dans LogCat. Peut-être que cela peut aider les autres.

public class HttpClientTest extends Activity{ 

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request; 
HttpEntity entity; 
List<Cookie> 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 String TAG = "MyActivity"; 
    request = new HttpGet("http://some.site.com/"); 
    response = client.execute(request); 
    entity = response.getEntity(); 
    Log.d(TAG, "Login form get: " + response.getStatusLine()); 
    if(entity != null) 
    { 
     entity.consumeContent(); 
    } 
    Log.d(TAG, "Initial set of cookies:"); 

    cookies = client.getCookieStore().getCookies(); 
    if (cookies.isEmpty()) 
    { 
     Log.d(TAG, "None"); 
    } 
    else 
    { 
     for(int i = 0; i<cookies.size(); i++) 
     { 
      Log.d(TAG, "- " + cookies.get(i)); 
     } 
    } 
    String action = "i.cfm?&1028&p=login&se=4"; 
    String yourServer = "http://some.site.com/"; 
    post = new HttpPost(yourServer + action); 

    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("nic", "username")); 
    params.add(new BasicNameValuePair("password", "password")); 
    params.add(new BasicNameValuePair("server", "4")); 

    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 


    response = client.execute(post); 
    entity = response.getEntity(); 

    Log.d(TAG, "Login form get: " + response.getStatusLine()); 
    if(entity != null){ 
     entity.consumeContent(); 
    } 

    Log.d(TAG, "Post logon cookies:"); 
    cookies = client.getCookieStore().getCookies(); 
    if (cookies.isEmpty()) 
    { 
     Log.d(TAG, "None"); 
    } 
    else 
    { 
     for (int i = 0; i < cookies.size(); i++) 
     { 
      Log.d(TAG, "- " + cookies.get(i)); 
     } 
    } 


    request = new HttpGet("http://some.site.com/i.cfm?f=com_empire&cm=3"); 

    response = client.execute(request); 
    Log.d(TAG, "Check for login: " + Parser.request(response)); 
    if(entity != null) 
    { 
     entity.consumeContent(); 
    } 

} 

} 

le dernier journal, Log.d (TAG, "Check for login:" + Parser.request (réponse)); imprime le html du site en passant par une classe analyseur, que j'ai utilisé pour vérifier que c'était en fait une page qui nécessitait une connexion réussie

4

Je sais, un peu en retard, mais je trouve aussi cet article et Je veux le lien à cette réponse ici: Android session management qui dit que vous devriez réutiliser votre HttpClient qui gère la gestion de session, à savoir. Rendre statique HttpClient et ne l'instancier qu'une seule fois. Mais je ne sais pas si c'est toute la vérité pour vos besoins. Pour moi c'était.

À la votre!

+0

Merci :) cela a fonctionné pour moi. –

Questions connexes