HTTP Formulare füllen und Datei downloaden

kevin9r

Aktives Mitglied
Guten Abend,
ich habe da mal eine Frage. Ich würde gerne eine Methode schreiben, welche mir eine Datei von einer Website downloaded. Das Problem ist, dass ich auf der Website erstmal 4 Formulare füllen muss und dann den Submit Button drücken muss und erst dann wird die Datei heruntergeladen.

Ich habe mich nie mit Netzwerkprogrammierung auseinander gesetzt und bin auch ein Java Anfänger. Ich hätte jetzt erstmal die Frage ob dies a) überhaupt möglich ist und b) welche Möglichkeiten es da gibt.
Das Problem ist einfach folgendes.
Drücke ich nach Dateneingabe den Submit Button öffnet sich ein neues Fenster (ohne sichtbaren Link) und der download beginnt (ich bekomme keinen Weiterleitungslink o.ä.).

Ich hoffe Ihr könnt mir da paar Tips geben wie ich da an die Sache dran gehen soll.

Vielen Dank!
 

Robat

Top Contributor
Hey kevin9r,

schau dir mal http://htmlunit.sourceforge.net/gettingStarted.html an.
Damit kannst du relativ einfach sowas machen:

Java:
WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage("http://foo-bar.de/");
HtmlForm form = page.getFormByName("form1");
form.getInputByName("inputText").setValueAttribute("text");
form.getTextAreaByName("textArea").setTextContent("other text");
form.getInputByName("checkbox").setChecked(true);
HtmlPage page2 = form.getInputByName("submit").click();

Hoffe, dass es das ist was du suchst.
 

kevin9r

Aktives Mitglied
Hey, wow danke, das sieht genau danach aus wonach ich gesucht habe.
Hast du schon einmal damit gearbeitet? Tue mir gerade etwas schwer (habe noch Schwierigkeiten damit die API richtig zu lesen und zu deuten und die Objektorientierung ist auch noch nicht so recht meins, aber ich arbeite daran). Schau mal, so sieht das Formular aus:

login24.jpg
Java:
form.getInputByName("inputText").setValueAttribute("text");
form.getTextAreaByName("textArea").setTextContent("other text");
form.getInputByName("checkbox").setChecked(true);

Das ist eigentlich ganze verständlich aber eclipse spuckt mir einen Fehler aus?

Der Name form1 ist der name des Feldes, welchen ich auf der Website im Quelltext sehen kann?
 

Robat

Top Contributor
Habe es mal verwendet - ist aber eine weile her.

form ist die ID des Formulars auf der Website. getInputname("..") ist die ID des Inputfeldes und mit setValueAttribute setzt du eben den Content des Feldes.

Was spuckt er dir denn für ein Fehler aus?

Und was verstehst du denn genau nicht? Stell Fragen dann hilft man dir auch ;)
 

kevin9r

Aktives Mitglied
Ich bekomme das einfach nicht hin.. habe jetzt folgendes geschrieben:

Code:
            WebClient webClient = new WebClient();
            HtmlPage currentPage = webClient.getPage("http://www.test.com/api/csv/");
            
            //Get the query input text
            HtmlInput user = currentPage.getElementByName("username");
            user.setValueAttribute("user");
           
            HtmlInput pass = currentPage.getElementByName("password");
            pass.setValueAttribute("root");
           
            HtmlInput datef = currentPage.getElementByName("datefrom");
            datef.setValueAttribute("2015-01-01");
           
            HtmlInput dateto = currentPage.getElementByName("dateto");
           
           //Heutiges Datum in String
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // Format für 24-Stunden-Anzeige
            String str = dateFormat.format(new Date());
           
            dateto.setValueAttribute(str);
            
            //Submit the form by pressing the submit button
            HtmlSubmitInput submitBtn = currentPage.getElementByName("Submit");
            currentPage = submitBtn.click();

Bekomme nur eine ElementNotFoundException.

In dem getElementByName stehen immer die Namen aus dem Quelltext:
<input name="password" value="" type="password">

Nur beim Button habe ich folgende Angaben:
<input value="Submit" type="submit">
Hier ist kein Name.

Und wenn ich das irgendwie zum laufen bekomme, muss ich ja auch noch irgendwie die Datei downloaden. Gibt es da auch irgendwelche Methoden?
 

Robat

Top Contributor
Die Elemente müssten auf der Website eigentlich in eine Form eingebettet sein.
Daher musst du dir die Form mit HtmlForm noch holen.
 

kevin9r

Aktives Mitglied
Stimmt, schau mal:
<form method="POST" target="result"> ?

und dann muss ich noch:
Code:
HtmlForm form = currentPage.getFormByName("??????");
einbinden. Aber was übergebe ich da?
 

mrBrown

Super-Moderator
Mitarbeiter
Du könntest auch einfach einen ganz normalen HTTP-Post-Request absetzen, das dürfte deutlich einfacher sein...
 

kevin9r

Aktives Mitglied
Ist das denn überhaupt mit dem HTTP Post Request möglich? Ich weiß ja eben überhaupt nicht wie ich nach dem klick auf den Submit Button weiterverlinkt werde? Hatte mich versucht da jetzt einzulesen aber irgendwie...
Also bei der GET Methode schicke ich so wie ich das verstanden habe einen Link zum Server der die Informationen bereits enthält (das ist ja in meinem Fall nicht möglich) ..

Bei der POST Methode werden die Parameter in einen Block gesetzt und übertragen? Was bedeutet das mit "in einen Block gesetzt"? Und werden mit Parameter dann die Formularwerte gemeint?
Puh ist alles nicht so leicht.. und das mit dem htmlunit klappt nicht?
 

Robat

Top Contributor
Also ich mische mich jetzt doch noch mal mit meinem HTMLUNIT ein.

Ich meine, dass ich ein Weg gefunden habe, dein Problem mit dem ElementNotFount gefunden zu haben.

Java:
        WebClient webClient = new WebClient();
        HtmlPage currentPage = webClient.getPage("https://www.beds24.com/api/csv/getbookingscsv");

        List<HtmlForm> forms = currentPage.getForms();
       
        System.out.println(String.valueOf(forms.size()));
       
        HtmlForm form = forms.get(0);
       
        HtmlInput name = form.getInputByName("username");
        name.setValueAttribute("bla");
       
        System.out.println(name.getValueAttribute());
       
        HtmlSubmitInput submitBtn = form.getInputByValue("Submit");
       
        HtmlPage p2 = submitBtn.click();

Es gibt eine Methode, die dir alle Forms (ist das der Plural? :D ) ausgibt.
Wenn du eine List<HtmlForm> anlegst, und sie mit currentPage.getForms() initialisierst, hast du eine Liste mit allen.
Ich hab es getestet, die länge der liste ist 1. also hast du nur eine form. --> deine form ist forms.get(0).

Wenn du dir jetzt eine HtmlForm Instanz machst und über diese deine Elemente holst, dann funktioniert der Code.

So kannst du erstmal alle Form erstmal abarbeiten. Es gibt auch wege mit htmlunit pdfs zu downloaden, aber mach erstmal das eine :)


Hoffe es klappt so wie du es willst!

Gruß
Robert
 

kevin9r

Aktives Mitglied
hey super, scheint geklappt zu haben? Es tauchen keine Fehler auf. In der Konsolenausgabe erhalte ich einfach eine 1? Ich meine darauf folgt ja sofort ein Dateidownload, das muss man vermutlich ja jetzt irgendwie programmieren. Ich versuche mich morgen mal in der API darüber schlau zu machen, was diese eins heißt und wie ich nun zum download komme... hast du da auch noch tipps?
Danke schonmal!
 

Robat

Top Contributor
Hast du mein Code kopiert? Wenn ja kommt die 1 weil ich mir die Länge der Liste ausgeben lassen habe :D

Weiß nicht in welcher Form es nach dem Post weiter geht, also ob deine Anfrage mit js, jq, oder etwas anderem gemacht ist aber du kannst dir bswp die query holen und damit weiter arbeiten - Aber da musst du mal Google befragen

Kein Problem

Gruß
Robert
 

kevin9r

Aktives Mitglied
ach mist, ja habe die Zeile zur getForms und die Ausgabe kopiert :-D Ok, ich muss ins Bett! :D
noch eine Frage, wie meinst du die Query holen? Also nach dem Absenden des Post wird dann irgendwie ein JavaScript ausgeführt das dann die Datei erzeugt und zum download weitergibt, verstehe ich das richtig? Und was meinst du jetzt mit Query?

Nach
HtmlPage p2 = submitBtn.click();
steht in p2 nur:
HtmlPage(https://www.beds24.com/api/csv/getbookingscsv)@1957078537

komplizierte Sache... :confused:
 

Robat

Top Contributor
Ach ne das alte Copy Paste Problem ;)

Was du da ausgegeben hast, ist ein sehr oft gemachter Fehler. Viele versuchen eine Instanz eines Objektes in die print Methode rein zu hauen um den Inhalt zu kriegen aber das gibt dir nur die speicheradresse von der Instanz (Page 2) aus.@.. ist also die Adresse im Speicher :)

Ich nehme an, dass du den Link zum Download der Datei kennst? Dann könnte das hier deine Lösung sein:

Java:
try{
    InputStream is = downloadLink.click().getWebResponse().getContentAsStream();
    try{
        File f =newFile("filename.extension");
        OutputStream os =newFileOutputStream(f);
        byte[] bytes =newbyte[1024];
        while(read = is.read(bytes)){
            os.write(bytes,0, read);
        }
        os.close();
        is.close();
    }catch(IOException ex){
        // Exception handling
    }
}catch(IOException ex){
    // Exception handling
}


Gruß
Robert
 

kevin9r

Aktives Mitglied
Hallo Robot,
nein, wenn ich auf den Submit Button drücke, dann ist das einzige was sich öffnet ein Downloadfenster. Mehr passiert da nicht mehr? Ich müsste also dann irgendwie diesen download abfangen? Aber was soll ich in deinem oben beispielhaften Quelltext als downloadLink angeben, wenn ich da überhaupt keinen Link bekomme wenn ich auf Submit klicke?
 

Robat

Top Contributor
downloadLink kannst du in dem Fall mit deiner HtmlPage Instanze ersetzen. (in meinem ersten Bsp. wäre das p2.)
Über p2 kannst du dann
Java:
p2.getWebResponse().getContentAsStream();
aufrufen.

Versuch das mal und guck, ob das File erstellt wird / in deinem Inputstream überhaupt etwas drin steht.

Kann es leider nicht testen, da ich die Daten zum einloggen für das Formular nicht habe.

Gruß
Robert
 

mrBrown

Super-Moderator
Mitarbeiter
Der Weg über das HTML-Fomrular zu gehen etc ist ein riesiger Umweg.^^
Das ist als API gedacht, also völlig unabhängig von den HTML-Seiten. Alles was man machen muss, ist ein einfacher HTTP-Post mit den benötigten Daten, die Antwort ist dann der csv-Content.
 

Robat

Top Contributor
Der Weg über das HTML-Fomrular zu gehen etc ist ein riesiger Umweg.^^
Das ist als API gedacht, also völlig unabhängig von den HTML-Seiten. Alles was man machen muss, ist ein einfacher HTTP-Post mit den benötigten Daten, die Antwort ist dann der csv-Content.

Dann gib ihm doch mal ein Beispiel - er hat ja nach deinem ersten Post schon gesagt, dass er nicht so Recht weiß wie ^^
 

mrBrown

Super-Moderator
Mitarbeiter
So etwa:

Java:
        String url = "https://www.beds24.com/api/csv/getbookingscsv";
        URL obj = new URL(url);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        con.setRequestMethod("POST");

        String params = "username=XXX&password=YYY";

        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(params);
        wr.flush();

        BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()));
       
        StringBuilder response = new StringBuilder();

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        System.out.println(response.toString());
Streams müssen noch passend geschlossen und Exceptions behandelt werden, dass sollte er aber wohl schaffen...
 

kevin9r

Aktives Mitglied
:eek::eek::eek:
wow... das hat geklappt...
und sogar ohne download der datei.. jetzt habe ich mich so lange darum bemüht eine CSV Datei auszulesen und in eine Mysql Datenbank zu schreiben und jetzt bekomme ich die Daten schön in einem String serviert.. Top.
Das das so simple ist... Ich werde mir jetzt die Methoden mal genauer ansehen, damit ich das auch verstehe. Um die Exceptions und das schließen der Streams kümmer ich mich jetzt selber.
Ich danke euch echt vielmals, habt mir echt weitergeholfen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
B Inputfelder in php script füllen Netzwerkprogrammierung 8
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
J Datei Download vom Server Netzwerkprogrammierung 8
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
Aruetiise Socket Datei Endung Netzwerkprogrammierung 6
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
A Datei erzeugen und auf der Weboberfläche downloaden (Tomcat) Netzwerkprogrammierung 4
Sogomn HTTP Datei herunterladen Netzwerkprogrammierung 13
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
F FTP Einzelne Datei von FTP-Server überprüfen Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
S Datei(XML) per RMI an Server schicken Netzwerkprogrammierung 0
V Datei Download Fenster Netzwerkprogrammierung 9
S Datei schreiben über Applet Netzwerkprogrammierung 8
C Socket Datei Übertragung Netzwerkprogrammierung 5
D Datei hochladen zu PHP Server Netzwerkprogrammierung 8
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
H Datei in DropBox schreiben Netzwerkprogrammierung 23
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
V Datei auf Server Schreiben Netzwerkprogrammierung 18
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
C Datei auf server speichern Netzwerkprogrammierung 16
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
W Datei automatisiert kopieren! Netzwerkprogrammierung 5
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
G Txt datei von Website downloaden Netzwerkprogrammierung 8
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
S ActiveMQ, JMS und Datei übertragen Netzwerkprogrammierung 25
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
U Web Datei downloaden und bei Änderungen wieder zurückspielen Netzwerkprogrammierung 5
M Class-Datei aus Eclipse mit Xampp Netzwerkprogrammierung 4
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
Dit_ FTP, Datei Hochladen Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
J Datei übertragen ja String + datei übertragen nein Netzwerkprogrammierung 5
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
L Java über php datei lesen? Netzwerkprogrammierung 18
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
weeego Ping über CMD, Umweg über Batch Datei sparen. Netzwerkprogrammierung 17
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
S StringArray in .txt Datei --> langsam wegen Client/Server!? Netzwerkprogrammierung 16
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
U Datei via UDP Netzwerkprogrammierung 8
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
S Error 404 obwohl die Datei existiert Netzwerkprogrammierung 9
T Datei Herunterladen und ausführen Netzwerkprogrammierung 5
S Mittels Java XML abfragen und nicht die Ausgabe-HTML-Datei Netzwerkprogrammierung 5
C PCAP Datei auslesen Netzwerkprogrammierung 8
F Applet Datei Zugriff Netzwerkprogrammierung 13
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
M [Commons NET] Prüfen, ob auf FTP Datei vorhanden ist Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
E Applet zum Datei-Upload Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
J Gibts die Datei? Netzwerkprogrammierung 3
K Datei-Upload per FTP Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
S über rmi datei übertragen? Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
G.I.Joe Datei per POST übertragen Netzwerkprogrammierung 2
B Umfangreiche Batch Datei (Rmiregistry prüfung + Prog. start) Netzwerkprogrammierung 4
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
F Datei senden und empfangen Netzwerkprogrammierung 4
B Via Java Datei zu PHP-Script auf Apache hochladen Netzwerkprogrammierung 4
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
M Datei auf Remoteserver kopieren Netzwerkprogrammierung 8
B Datei speichern unter Netzwerkprogrammierung 10
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben