1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

HTTP Post Request mit Cookie

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MichaelS, 07.09.2009.

  1. MichaelS, 07.09.2009 #1
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Hey Leute... irgendwie hab ich ein Denkfehler oder es geht einfach nicht, was ich vor habe :D

    Also es geht darum, dass ich den cookie speichern will und an jeden request werfen möchte...

    Wäre super, wenn ihr mein Fehler finden würdet...

    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    public class HTTPHelper {
    
        private List<String> _cookies = new ArrayList<String>();
        
        public String SendPost(String httpURL, String data) throws IOException   {
            URL url = new URL(httpURL);
    
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            
            if (_cookies.size() > 0) {
                for (String cookieItem : _cookies) {
                    connection.setRequestProperty("cookie", cookieItem);
                }
            }
            
            if (data != "") {
                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
                out.write(data);
                out.flush();
                out.close();
            }
            
            
                
            String headerName = null;
            _cookies.clear();
            for (int i=1; (headerName = connection.getHeaderFieldKey(i))!=null; i++) {
                if (headerName.equalsIgnoreCase("Set-Cookie")) {    
                    String cookie = connection.getHeaderField(i);
                    _cookies.add(cookie.substring(0,cookie.indexOf(";")));
                }
            }
            
            String getData = "";
            String decodedString;
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            while ((decodedString = in.readLine()) != null) {
                getData += decodedString + "\n";
            }
            in.close();
            
            return getData;
        }
    }
    
     
  2. Shinigami, 07.09.2009 #2
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Hallo.

    Rate mal ins Blaue:

    Baue aus deinem String-Array mit den Cookie-Infos mal einen String wo die einzelnen Elemente durch ein Semikolon getrennt sind (wie auch beim Auslesen) und weise es dann einmal einem Attribut der Connection zu.

    Gruß,
    Shini
     
  3. MichaelS, 07.09.2009 #3
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    das hab ich auch schon probiert... hatte ich vorher nur da ging es auch nicht und hab dan versucht, dass so zu probieren =( hat beides nicht geklappt.
     
  4. Chri, 08.09.2009 #4
    Chri

    Chri Gewerbliches Mitglied

    Beiträge:
    138
    Erhaltene Danke:
    0
    Registriert seit:
    27.08.2009
    Phone:
    Nexus 4
    sry! Aber da kenn ich mich zur Zeit noch nicht genug aus! Wenn ich mehr weiß, oder mir eine Idee kommt, dann werde ich diese natürlich sofort posten!;)

    mfg Chri
     
  5. Shinigami, 08.09.2009 #5
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Hi.

    Wenn Du setRequestProperty mit der gleichen Property-Bezeichnung mehrfach aufrufst wird meines Wissens einfach nur der Wert des letzten Aufrufs übermittelt. Ich bin mir bei der Property "Cookie" nicht sicher inwiefern diese Bezeichnung case-sensitive ist. Also einfach mal das "C" groß schreiben. So hab ich's bisher in allen Beispielen gesehen. Kann natürlich auch kosmetischer Natur sein...

    Hab leider keine Zeit, sonst würde ich aus purer Neugier auch mal sowas implementieren :o

    Gruß
    Shini
     
  6. MichaelS, 08.09.2009 #6
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    So ich habe mir mal selber geholfen =)
    Voll funktionsfähigen Code findet man unten ;)

    POST Request + Post Data + Cookie speicherung =)

    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HTTPHelper {
    
        private String _cookie = "";
        
        public String SendPost(String httpURL, String data) throws IOException   {
            URL url = new URL(httpURL);
    
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            
            // If cookie exists, then send cookie
            if (_cookie != "") {
                connection.setRequestProperty("Cookie", _cookie);
                connection.connect();
            }
            
            // If Post Data not empty, then send POST Data
            if (data != "") {
                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
                out.write(data);
                out.flush();
                out.close();
            }
            
            // Save Cookie
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String headerName = null;
            //_cookies.clear();
            if (_cookie == "") {
                for (int i=1; (headerName = connection.getHeaderFieldKey(i))!=null; i++) {
                    if (headerName.equalsIgnoreCase("Set-Cookie")) {    
                        String cookie = connection.getHeaderField(i);
                        _cookie += cookie.substring(0,cookie.indexOf(";")) + "; ";
                    }
                }
            }
            
            // Get HTML from Server
            String getData = "";
            String decodedString;
            while ((decodedString = in.readLine()) != null) {
                getData += decodedString + "\n";
            }
            in.close();
            
            return getData;
        }
    }
    
     
  7. Shinigami, 08.09.2009 #7
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Was war denn nun bei dem Handling der Cookies das Entscheidende? Du hast es wieder auf einen String umgestellt, was Du ja schonmal ohne Erfolg getestet hattest (laut eigenen Angaben).

    Was hast Du denn noch geändert?

    Gruß,
    Shini
     
  8. MichaelS, 08.09.2009 #8
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Mein Problem war, dass ich nicht genau wusste, wie ich den / die cookies in den Header schreibe... hatte Zeilenumbruche, und Semikolon probiert hab aber immer alles mit geschickt vom cookie das war mein fehler ;) man darf also nur blablubb=asd; muh=asd; schicken statt auch die laufzeit usw.... und dan hat noch das Connect() gefehlt ;)
     
  9. Shinigami, 08.09.2009 #9
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Das connect() hab ich gar nicht vermisst :rolleyes: lol
     
  10. Boni2k, 23.12.2009 #10
    Boni2k

    Boni2k Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    14
    Registriert seit:
    10.11.2009
    Danke für den Code, hat mir wirklich sehr geholfen und einiges an Arbeit gespart.
     
  11. husvun41, 08.12.2011 #11
    husvun41

    husvun41 Gast

    Moin, erstmal finde ich es Klasse das du deine Lösung bereitstellst.
    Nur noch eine Frage hätte ich. mit der Variablen data übergibts du ja die Logindaten, mit denen du dich einloggen willst richtig? Dazu gehört ja eine Benutzername und ein Passwort. Wenn ich die Mehtode aufrufen möchte, wie muss ich den Benutzernamen und Passwort mitgeben?
     
  12. MichaelS, 08.12.2011 #12
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    da hast du ja nen alten thread ausgegraben :D

    einfach KeyValuePair übergeben :) sprich "bla=asd; muh=test;" usw...

    gruß
    Michael
     
  13. husvun41, 08.12.2011 #13
    husvun41

    husvun41 Gast

    Jo, tut mir ja leid. ^^
    Mhm, also der HTML Code der Seite, für die Login Felder schaut so aus:
    Code:
     <tr><td>Username:</td><td><input type='text' name='username' size='20'></td></tr>
    <tr><td>Password:</td><td><input type='password' name='password' size='20'></td></tr>
    <tr><td></td><td><input type='submit' value='Login' name='login'></td></tr>
    
    Mein Übergabeparameter so:
    Code:
    "username=MeinLoginName;password=MeinPasswort;"
    So sollte es doch richtig sein oder? Weil leider geht das nicht. :(
     
  14. MichaelS, 08.12.2011 #14
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    jeps sollte passen, würde sagen daran liegts nicht ;)
     
  15. Boni2k, 08.12.2011 #15
    Boni2k

    Boni2k Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    14
    Registriert seit:
    10.11.2009
    "username=MeinLoginName&password=MeinPasswort" als data-String übergeben, strichpunkte gehören da nicht rein
     
  16. MichaelS, 08.12.2011 #16
    MichaelS

    MichaelS Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    :cursing: ähm ja sorry... Zeit für Feierabend... sry
    Er hat natürlich Recht...
     
  17. husvun41, 08.12.2011 #17
    husvun41

    husvun41 Gast

    Leider klappt das auch nicht. :/
    Der Inhalt wird mir ausgegeben, allerdings nicht der Inhalt, der eigentlich kommen müsste, wenn ich eingeloggt bin.
    Laut dem Threadersteller sollte der Code ja gehen. Wo könnten noch mögliche Fehlerquellen sein?

    edit:
    Ich hab mir mal den Cookie ausgeben lassen. Nach jedem Compilen erscheint ein anderer Cookie. Sollte der der Cookie nich immer gleich sein?
     
    Zuletzt von einem Moderator bearbeitet: 08.12.2011
  18. Boni2k, 08.12.2011 #18
    Boni2k

    Boni2k Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    14
    Registriert seit:
    10.11.2009
    Puh... dein Code wird stimmen. Mögliche Fehlerquellen wäre dann eben noch der String "username=MeinLoginName&password=MeinPasswort"

    Es kann durchaus sein, dass du bei deiner Login-Seite andere Parameter brauchst, also statt username und password eben was anderes. Rausfinden kannste das z.B. mittels Live HTTP Header Addon für Firefox
     
  19. husvun41, 08.12.2011 #19
    husvun41

    husvun41 Gast

    Das mit Live HTTP Header Addon, war ne gute Idee, ein nettes tool.
    Das KeyValuePair war zwar richtig, jedoch musste ich eine andere url nehmen für dan login.
    Das schaut jetzt alles ein bisschen besser aus. Allerdings hab ich nun das Problem das ich zum auslesen des Quellcodes eine andere url brauche, ich steh da gerade ein bisschen auf dem Schlauch, denn ich kann ja nicht einfach neu connecten, dann der cookie wäre für die connection doch anders oder?
    Wie kann ich nun den Quelltext für eine andere url auslesen, ohne die connection zu unterbrechen?
     
  20. Boni2k, 08.12.2011 #20
    Boni2k

    Boni2k Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    14
    Registriert seit:
    10.11.2009
    Hmm, versteh ich jetzt nicht ganz. Im Grunde läuft ein Login hier so ab:

    1. Login-Daten an die Login-Seite schicken, hast du ja gemacht und funktioniert
    2. Du bekommst n Session Cookie zurück, der wird in der Klasse selbst abgespeichert
    3. Du gehst auf die Seite, wo du den Quelltext herhaben möchtest --> sollte funktionieren

    Also quasi nur:
    Code:
    HTTPHelper helper = new HTTPHelper();
    String loginhtml = helper.SendPost("http://pipapo.de/login", "username=...";
    String html = helper.SendPost("http://pipapo.de/blubb", "");
    Und schon solltest den Quelltext haben, den man nur als angemeldeter Benutzer sieht.
     

Diese Seite empfehlen