124 votes

Comment puis-je faire une requête http à l'aide de cookies sur Android?

Je voudrais faire une requête http à un serveur distant tout correctement la manipulation des cookies (par exemple. stocker des cookies envoyés par le serveur, et l'envoi de ces cookies quand je fais les demandes ultérieures). Il serait bien de le préserver de tout et de tous les cookies, mais, vraiment, la seule chose qui me préoccupe est le cookie de session.

Avec java.net il semble que la meilleure façon de le faire est à l'aide de java.net.CookieHandler (classe de base abstraite) et de java.net.CookieManager (mise en œuvre concrète). Android java.net.CookieHandler, mais il ne semble pas avoir de java.net.CookieManager.

Je ne pouvais le code tout à la main par l'inspection des en-têtes http, mais il semble qu'il doit y avoir un moyen plus facile.

Quelle est la bonne façon de faire des requêtes http sur Android, tout en préservant les cookies?

94voto

emmby Points 35359

Il s'avère que Google Android est livré avec Apache HttpClient 4.0, et j'ai été en mesure de comprendre comment le faire en utilisant le "Formulaire d'ouverture de session" par exemple dans le HttpClient docs:

http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientFormLogin.java


import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * A example that demonstrates how HttpClient APIs can be used to perform
 * form-based logon.
 */
public class ClientFormLogin {

    public static void main(String[] args) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpGet httpget = new HttpGet("https://portal.sun.com/portal/dt");

        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
        System.out.println("Initial set of cookies:");
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        HttpPost httpost = new HttpPost("https://portal.sun.com/amserver/UI/Login?" +
                "org=self_registered_users&" +
                "goto=/portal/dt&" +
                "gotoOnFail=/portal/dt?error=true");

        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("IDToken1", "username"));
        nvps.add(new BasicNameValuePair("IDToken2", "password"));

        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

        response = httpclient.execute(httpost);
        entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }

        System.out.println("Post logon cookies:");
        cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        // When HttpClient instance is no longer needed, 
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();        
    }
}

11voto

Hesam Points 6415

Un cookie est juste un autre en-tête HTTP. Vous pouvez toujours ensemble en faisant un appel HTTP avec apache bibliothèque ou avec HTTPUrlConnection. De toute façon, vous devriez être en mesure de lire et de définir des cookies HTTP dans ce mode.

Vous pouvez lire cet article pour plus d'informations.

Je peux partager ma paix du code de démontrer avec quelle facilité vous pouvez le faire.

public static String getServerResponseByHttpGet(String url, String token) {

        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);
            get.setHeader("Cookie", "PHPSESSID=" + token + ";");
            Log.d(TAG, "Try to open => " + url);

            HttpResponse httpResponse = client.execute(get);
            int connectionStatusCode = httpResponse.getStatusLine().getStatusCode();
            Log.d(TAG, "Connection code: " + connectionStatusCode + " for request: " + url);

            HttpEntity entity = httpResponse.getEntity();
            String serverResponse = EntityUtils.toString(entity);
            Log.d(TAG, "Server response for request " + url + " => " + serverResponse);

            if(!isStatusOk(connectionStatusCode))
                return null;

            return serverResponse;

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

1voto

wds Points 9910

Je ne travaille pas avec google android, mais je pense que vous constaterez qu'il n'est pas difficile d'obtenir ce travail. Si vous lisez pertinentes bits de java tutoriel vous allez voir qu'un régime enregistré d'cookiehandler obtient des rappels à partir de la code HTTP.

Donc, si il n'y a pas de valeur par défaut (avez-vous vérifié si CookieHandler.getDefault() est vraiment nulle?) ensuite, il vous suffit d'étendre CookieHandler, de mettre en œuvre mettre/obtenir et de faire travailler quasiment automatiquement. Assurez-vous de considérer l'accès simultané et le comme si vous allez dans cette voie.

edit: Évidemment, vous auriez à définir une instance de votre coutume de mise en œuvre tant que gestionnaire par défaut par le biais CookieHandler.setDefault() recevoir les rappels. J'ai oublié de mentionner que.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X