HTTP Post Request mit Cookie

M

MichaelS

Erfahrenes Mitglied
51
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;
    }
}
 
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
 
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.
 
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
 
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
 
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;
    }
}
 
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
 
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 ;)
 
Das connect() hab ich gar nicht vermisst :rolleyes: lol
 
MichaelS schrieb:
So ich habe mir mal selber geholfen =)
Voll funktionsfähigen Code findet man unten ;)

POST Request + Post Data + Cookie speicherung =)
Danke für den Code, hat mir wirklich sehr geholfen und einiges an Arbeit gespart.
 
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?
 
da hast du ja nen alten thread ausgegraben :D

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

gruß
Michael
 
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. :(
 
jeps sollte passen, würde sagen daran liegts nicht ;)
 
"username=MeinLoginName&password=MeinPasswort" als data-String übergeben, strichpunkte gehören da nicht rein
 
:cursing: ähm ja sorry... Zeit für Feierabend... sry
Er hat natürlich Recht...
 
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 bearbeitet von einem Moderator:
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
 
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?
 
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.
 

Ähnliche Themen

L
Antworten
15
Aufrufe
905
jogimuc
J
B
Antworten
4
Aufrufe
470
bb321
B
FabianDev
Antworten
5
Aufrufe
548
swa00
swa00
Zurück
Oben Unten