# [JAVA] html-Form füllen und abschicken



## AleX (4. September 2003)

hi,
schreib grad ne Anwendung und wollte nun auf einer page bei der man Angebote per Webinterface einstellen kann dies insofern automatisieren, dass die page aufgerufen wird, die Anwendung einen gefakten cookie erstellt und dann eine html-form ausfüllt und diese abschickt. Die htmlform  per POST.

Das mit dem Login bzw. Cookie funktioniert schon eiwandfrei, jetzt hab ich aber das problem, das Formular auszufüllen.

Hinweis: Es handelt sich nicht um nen php teil, wo man die parameter aus der form einfach in der url mitgeben könnte.  

Nun hab ich es wie gefolgt versucht:

```
String toSend = "feld1=testinhalt";
                URLConnection uc = url.openConnection();
                uc.setUseCaches(false);
                uc.setDoInput(true);
                uc.setDoOutput(true);
                uc.setAllowUserInteraction(true);
                uc.setRequestProperty("Cookie", );

                DataOutputStream dostream = new DataOutputStream(uc.getOutputStream());
                dostream.writeBytes(toSend);
                dostream.flush();
                dostream.close();
```
Was aber nicht funktioniert und beim auslesen der page bekomme ich denn nen 403 - No Permission to access...

Wie kann man soetwas überhaupt machen? Nehmen wir an, ich will nur auf diese art und weise etwas in google eintragen und mir dann zeile für zeile die antwortpage einlesen....

Schon mal im Vorraus danke
alex


----------



## Thomas Darimont (4. September 2003)

Servus!

Schau dir mal HttpURLConnection an ...
soweit ich das sehe, kannst du dort Argumente des Post-Requests mitgeben ...

http://java.sun.com/j2se/1.4.2/docs/api/java/net/HttpURLConnection.html

vielleicht hilft dir das weiter ...

Gruß Tom


----------



## AleX (5. September 2003)

@Thomas:

Also erst mal danke. Hat weitergeholfen.

Nun meine Frage, da ich ein weiteres Problem habe:

Das perlscript, das das Angebot einstellt befindet sich auf dem server in einem ungefähr
folgenden Pfad /ordner/SessionID+irgendwas/ordner/action.pl

Nun baue ich eine urlconnection zu dem eingabeformular auf, lese dort den htmlcode 
aus, suche die Zeile mit <Form und lese da unter action dann die url mit der SessionID aus.

Das heißt wenn ich jetzt das perlding mit der sessionid aufrufe, die daten vom Formular an den Server schicke, müsste alles funktionieren.

Nur hab ich jetzt das problem, dass ich um das *.pl aufzurufen und die daten zu 
schicken ne neue urlconnection aufbauen muss. Und bei der stimmt die 
SessionID ja schon wieder nicht mehr.
Kann man von der alten urlconnection irgendwie auf ne andere url springen. 
Ohne ne komplett neue Verbindung aufzubauen und somit ne neue SessionID zu 
bekommen?

alex


----------



## Thomas Darimont (5. September 2003)

Servus!

 ....puhhhhh....?

 Kannst du dir nicht die SessionID von deiner ersten HttpConnection merken und
 dann das an den Parameter des Konstruktors der neuen HttpUrlConnection übergeben?

 Sowas wie ...


```
HttpURLConnection con1 = new HttpURLConnection(www.irgendeinhost.de/ordner/action.pl);
 //Merke session
 String meineSession = magischeMethode_getSession ( www.irgendeinhost.de//ordner/SessionID+MeineSession/ordner/action.pl); //
 doParsing();
 //
 HttpURLConnection con1 = new HttpURLConnection(www.irgendeinhost.de/ordner/SessionID+irgendwas/ordner/action.pl);
 
 ...
```
 
 Vielleicht kannst du ja mit der übergabe der alten SessionID eine bestimmte Session "erzwingen" ...

 Gruß Tom ...


----------



## AleX (5. September 2003)

ne, das geht leider nicht. Allerdings bin ich mir nicht sicher, ob vielleicht auch wasan meinem code falsch ist... :-/


```
import util.ProxyTunnel;

import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.net.HttpURLConnection;
import java.io.*;


public class MobileMain {
    public static void main(String[] args) {
        new MobileMain();
    }

    public MobileMain() {
        ProxyTunnel.setProxy("proxy.xxx.de", "xxxx", "user", "pass");
        test("user", "pass");
    }


    public void test(String user, String pass) {
        boolean error = true;
        String tempUrl = "";
        try {
            URL url = new URL("http://" + user + ":" + pass + "@admin.mobile.de/cgi-bin/insertClosed.pl?" +
                    "titel=verkauf&funktion=Insert&bereich=pkw&HA=1");

            while (error) {
                try {
                    System.out.println("connecting: " + url);

                    URLConnection uc = url.openConnection();

                    BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
                    String inputLine;

                    while ((inputLine = in.readLine()) != null) {
                        if (inputLine.startsWith("<FORM enctype=")) {
                            System.out.println("orgLine: " + inputLine);
                            tempUrl = inputLine.substring(inputLine.indexOf
                                    ("http://admin.mobile.de/"), inputLine.indexOf("\" name="));

                            System.out.println("action:  " + tempUrl);
                            }
                    }


                    error = false;
                } catch (Exception e) {
                    error = true;
                    System.out.println(e);
                }//catch
            }//while
            url = new URL(tempUrl);
            URLConnection uc = url.openConnection();
            uc.setUseCaches(false);
            uc.setDoInput(true);
            uc.setDoOutput(true);
            uc.setAllowUserInteraction(true);


            DataOutputStream dostream = new DataOutputStream(uc.getOutputStream());
            dostream.writeBytes("id=&ad_contentType=Car&_form=insert&ad_model=testteil03&ad_make=15900&ad_category=14&ad_price=48000");
            dostream.flush();
            dostream.close();

            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }                    

        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}
```

Hoffe du nimmst dir die zeit den code kurz mal zu überfliegen.
Weis, dass ich da viel verlange, aber weis jetzt echt nicht weiter.

DAnke im Vorraus
alex


----------



## Thomas Darimont (5. September 2003)

Servus!

...

kannst du mir vielleicht mal noch schnell erklären, weshalb du unbedingt 2 Mal eine URLConneciton aufbauen mußt ?

...

bzw. versuch doch mal einen forward auf die Action-Url zu machen ...

d..h du bleibst mit der sleben URLConnection erstmal 10 sec auf seite 1 .. machst deine Aufgaben und leitest dann automatisch auf die action Seite weiter und bleibst in der selben session ...

Gruß Tom


----------



## AleX (5. September 2003)

hi, geht hier ja ratz fatz mit den antworten 

Das mit dem Forward hört sich richtig gut an. 
Nur eine dumme Frage, wie mach ich das.


----------

