PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : html-Formular mit Java APPLIKATION ansteuern...



SeeksTheMoon
21-03-2003, 08:45
Ich möchte zwecks Automatisierung ein CGI auf einem Server mit einem Java-Programm (anstatt des zugehörigen html-Formulars per Webbrowser) zur Ausführung bringen. Bisher habe ich mit meinem Java-Prog direkt das CGI angeschmissen und mit POST-Daten gefüttert. Das klappt aber aus irgendeinem Grund nicht richtig.

Deshalb möchte ich einen komplett anderen Ansatz versuchen und direkt das zum CGI gehörige html-Formular ansprechen, anstatt dessen Funktionen zu imitieren wie vorher.
(Wie) kann ich die Radiobuttons des Formulars und sonstige html-Elemente mit Java ansteuern und das dann mit dem Submit-Button losjagen?
Dies soll wie gesagt eine Java Applikation machen, kein Applet (und schon gar kein JavaScript).

anda_skoa
21-03-2003, 11:02
Hmm.

Du hast also Client seitig eine Java Applikation und einen Browser, der eine Seite anzeigt, die ein Forumlar für ein CGI enthält?

Welcher Browser ist das?

Ich kenn eigentlich keinen, der von außen Zugriff auf seinen DOM Baum erlaubt.

Ciao,
_

SeeksTheMoon
21-03-2003, 14:42
hm, ich würde es nur ungerne über einen Browser machen, weil die Leute, die das Prog benutzen sollen Mozilla, IE, Opera und Konqueror benutzen und dann noch unter Linux und Windows.

Vielleicht komme ich ja mit httpUnit weiter (http://httpunit.sourceforge.net/), aber ich bin mir nicht sicher, ob das das richtige Tool für sowas ist.

fs111
21-03-2003, 15:19
Bitte erklär noch mal etwas genauer, was Du machen willdt, ich verstehe das nicht ganz.

Grüße fs111

anda_skoa
21-03-2003, 17:02
Ja, du hast mich jetzt auch verwirrt.

Du hast du davon gesprochen, dass du es über das HTML Formular machen willst.

Wenn du keinen Browser nimmst, stellst du es also selber in deiner Applikation dar.
Ist das nicht ein bischen viel Aufwand?

Ciao,
_

SeeksTheMoon
21-03-2003, 19:22
ok, ich versuchs mal:

auf dem Server xy liegt ein cgi. Auf diesem Server liegt auch ne html-Seite mit nem Formular, das mit POST seine Daten an das cgi schickt.

Jetzt will ich das cgi aber mit einem Java-Programm von meinem Rechner fernsteuern. Bisher habe ich ein Java-Programm geschrieben, das die benötigten Daten an das cgi schickt. Aus irgendeinem unerfindlichen Grund will das aber nicht klappen.
Deshalb habe ich mir gedacht, die POST-Funktion nicht selber zu implementieren, sondern mich des fertigen html-Formulars zu bedienen - natürlich über das Java-Programm. Und da hört meine Weisheit auf, weil ich keine Ahnung habe wie ich das machen soll.

giotto
21-03-2003, 20:21
Warum lässt du die Aktionen, die das cgi-script ausführt nicht gerade von der Java Applikation selber machen?

z.B. in eine Datenbank schreiben...

cu
giotto

anda_skoa
22-03-2003, 10:03
Original geschrieben von SeeksTheMoon

Deshalb habe ich mir gedacht, die POST-Funktion nicht selber zu implementieren, sondern mich des fertigen html-Formulars zu bedienen - natürlich über das Java-Programm. Und da hört meine Weisheit auf, weil ich keine Ahnung habe wie ich das machen soll.

Du übersiehst dabei, dass das POST nicht vom Formular ausgefürht wird, sondern vom Browser, der das Forumular interpretiert.
Das Formular ist lediglich eine Beschreibung der Eingabe Elemente, damit der Browser weiß, was er darstellen soll.

Eigenltich sollte laut Doku java.net.HttpURLConnection POST können.
Sonst geht es wahrscheinlich auch mit dem HttpUnit, das du gepostet hast.

Ciao,
_

SeeksTheMoon
22-03-2003, 13:15
Original geschrieben von giotto
Warum lässt du die Aktionen, die das cgi-script ausführt nicht gerade von der Java Applikation selber machen?
giotto

Weil es nicht mein Server ist :D

Bisher habe ich es mit java.net.HttpURLConnection gemacht, aber das klappt nicht wirklich (das Script läuft in einer php-Session und ich kriege den Session-key nicht nachgebildet, so dass ich ihn bisher aus dem Formular rausparsen musste, weil er dort netterweise in einem hidden-Field drin steht).
Ich probiers mal mit dem httpunit aus... oder jemand sagt mir, wie man nen gültigen PHP-Session-Key mit java erzeugen kann :D (dieser key kann aber auch mit perl oder TCL erstellt sein, weil das auch auf dem Server installiert ist - keine Ahnung)

anda_skoa
22-03-2003, 15:47
Original geschrieben von SeeksTheMoon

Ich probiers mal mit dem httpunit aus... oder jemand sagt mir, wie man nen gültigen PHP-Session-Key mit java erzeugen kann :D (dieser key kann aber auch mit perl oder TCL erstellt sein, weil das auch auf dem Server installiert ist - keine Ahnung)

Den Session key erzeugt das PHP script, denn es muss diesen Key für die Zuordnung benutzen.

Wenn der Key im Forumalr enthalten ist, musst du es anfordern (GET oder mit java.net.URL), die ID rausholen und dann bei deinem POST verwenden.

Ciao,
_

SeeksTheMoon
22-03-2003, 20:43
Das cgi bekommt schon alle Daten von mir.
Ich lade mit meinem Programm die Seite mit dem Formular runter und puhle mir die ID dort raus und schicke die beim POST nachher mit.
Wenn ich das lokal auf meinem Tomcat teste, dann kommen auch alle Daten an, aber wenn ich es auf das Originale php-cgi auf dem Fremdserver loslasse, zeigt es nicht die erhoffte Wirkung.

Ich poste mal meine Methode. Vielleicht ist sie aus dem Zusammenhang gerissen, aber ich baller sie mal mit Kommentaren voll:


//zuerst die html-Datei mit dem Formular holen:
url = new URL("http://url-mit-cgi-formular.html");
connect = (HttpURLConnection) url.openConnection();
connect.setFollowRedirects(true);
connect.setDefaultUseCaches(false);
connect.setRequestProperty("Accept-Language", "de-de");
connect.setRequestProperty("User-Agent", browser);
//diesen Wert identisch mit dem Referer- und ref-Wert unten halten:
connect.setRequestProperty("Referer", "http://meine-homepage.de");

connect.setRequestMethod("GET");
connect.connect();

Object inhalt = url.getContent(); //Inhalt der URL besorgen

String zeile = "";
BufferedReader br = new BufferedReader(new InputStreamReader(
(InputStream) inhalt));

int zeilenNummer = 0;

//Inhalt lesen
while ((zeile = br.readLine()) != null) {
zeilenNummer++;

/*
in Zeile 92 steht unsere böse, böse Session-ID, z.B. so:
<input type='hidden' name='id' value='9b5a74dcfe47ee49b0d016d506594f0f'>
aber wir wollen nur das:
9b5a74dcfe47ee49b0d016d506594f0f
*/
if (zeilenNummer == 92) {
break;
}
}
//nach Hochkommas zerschneiden, dann steht im vorletzten Feld die ID
String[] schnipsel = zeile.split("'");
String id = schnipsel[schnipsel.length - 2]; //wir haben die ID

//jetzt das cgi foppen:
//ist es ok, wenn url neu verwendet wird? Muss vorher die connection beendet werden?
url = new URL("http://url-die-der-submit-button-aufruft.php");
connect = (HttpURLConnection) url.openConnection();
connect.setFollowRedirects(true);
connect.setDefaultUseCaches(false);
connect.setRequestProperty("Accept-Language", "de-de");
connect.setRequestProperty("User-Agent", browser);
connect.setRequestProperty("Referer", "http://meine-homepage.de"); // wie ref
connect.setRequestMethod("POST");

//die Felder des Formulars: Die ersten 3 werden der Methode übergeben
connect.setRequestProperty("wert1", "" + wert1);
connect.setRequestProperty("wert2", "" + wert2);
connect.setRequestProperty("wert3", "" + wert3);

connect.setRequestProperty("id", id); //die PHP-Session-ID
connect.setRequestProperty("ref", "meine-url-als-base64-encode");

connect.connect();
//muss jetzt noch was gemacht werden?

return (connect.getResponseMessage());
} catch (Exception ex) {
System.err.println("Ging voll in die Hose: " + ex.getMessage());
return (ex.getMessage());
}
}