# Per POST -Methode Daten an den Web-Server übertragen.



## Nur ein Gast (23. Okt 2008)

Hallo,
ich möchte von einem Web-Server ein zur Laufzeit erstelltes Log-File runterladen und abspeichern ->
Das Logfile wird erzeugt, wenn ich den Zeitraum per HTML Formular eingebe und die Daten mit dem Submit Button abschicke. Genau das will ich jetzt mit Java automatisieren.
Ich bin schon soweit mich auf den Server zu verbinden und das aktuelle LogFile auf Platte zu speichern. Das Logfile welches ich schon erreiche ist aber nur das aktuelle von 0:00 bis jetzt. Auf das komplette gestrige habe ich so keinen Zugriff. Diese wird erst zum Abfragezeitpunkt generiert und übertragen.
Ich weiß nun nicht, an welchem Punkt ich Ansetzen soll, bzw. wann der Webserver von mir welche Daten erwartet.

Danke schön im Voraus

Nur der Gast


----------



## pinhead84 (24. Okt 2008)

Kannst du dein Logfile-Skript auf dem Server nicht anpassen, dass auch GET-Anfragen verarbeitet werden? - Dann könntest du die Parameter direkt an die URL hängen. Das macht aber nur bei wenigen Parametern Sinn.

Aber um auf deine Frage zu kommen: Ein Beispiel einer POST-Anfrage findest du hier.


```
// Daten an das CGI-Skript schicken
  cgiConnection.setDoOutput(true);
  URLoutput = new DataOutputStream(cgiConnection.getOutputStream());
  URLoutput.writeBytes(data+"\n");
  URLoutput.close();
```



> In obigem Beispiel muss eine Option für die Kommunikation mit dem Server gesetzt werden:
> 
> cgiConnection.setDoOutput(true);
> 
> Mit setDoOutput(boolean) wird eingestellt, ob eine Ausgabe vom Client bei der Kommunikation mit dem Server erfolgt. Per Voreinstellung ist dieses Flag auf false gesetzt, d. h., es ist von Client-Seite keine Ausgabe zum Server möglich. Bei der Verwendung der POST-Methode müssen die Daten über einen OutputStream an den Server geschickt werden. Deshalb ist ein vorheriger Aufruf von setDoOutput() notwendig.



Bei POST-Anfragen müssen die Parameter im Body des HTTP-Requests übertragen werden, siehe hier. Zum Beispiel:


```
URLoutput.writeBytes("key1=value1&key2=value2\n");
```


----------



## FArt (24. Okt 2008)

Apache HTTPClient


----------



## Guest (24. Okt 2008)

pinhead84 hat gesagt.:
			
		

> Kannst du dein Logfile-Skript auf dem Server nicht anpassen, dass auch GET-Anfragen verarbeitet werden? - Dann könntest du die Parameter direkt an die URL hängen. Das macht aber nur bei wenigen Parametern Sinn.



Der "Server" ist eine proprietäre Steuerung, auf der ich nichts ändern kann.
Muß aber mal ausprobieren, ob der Server nicht auch eine Get Anfrage beantwortet.

Die kann ich doch einfach an die URL anhängen, mit der ich die Seite aufrufe...

Der Gast


----------



## Schon wieder der Gast (24. Okt 2008)

Hier mal der Auszug aus dem per Webbrowser gezogenen Logfile, das auch das Eingabeformular zur verfügung stellt


```
<form action="/func/setup/getlog" method=POST name=thelog>
<TR><TD>Start date</TD><TD><INPUT TYPE=text name=startdate value="2008-09-11 00:00:00"></TD></TR>
<TR><TD>End date</TD><TD><INPUT TYPE=text name=enddate value="2008-09-12 00:00:00"></TD></TR>
<input type=hidden name=dummy value=1221121089><INPUT TYPE=submit name=action value="Search"></FORM>
```

Verstehe ich es denn richtig, das der Webserver, nachdem ich mich autorisiert habe und er mir die Seite mit dem Formular anzeigt, auf die Rücksendung dieses HTML Codes wartet ???
Und wenn ich ihm dann diese "Webseite" zurückschicke, schickt er mir als Antwort darauf die angeforderte Seite, die mit dem Buffered Reader dann wieder abfangen kann und wegspeichern.

Aber wie soll ich mit Java diesen Code erzeugen, wobei das datum ja auch "Variabel" sein muß, sprich das Datum wird von einer anderen methode generiert und dann als String dort eingefügt.

Habe aus nem freien Java Buch (Java ist auch eine Insel) folgendes ->
_*

Daten nach der POST-Methode versenden

Die Klasse URLConnection bietet die schon bekannte Methode getOutputStream() an, die eine Verbindung zur Eingabe des serverseitigen Programms möglich macht (POST-Methode):

// CGI-Script schickt die Daten zurück 
PrintStream o = new PrintStream( connection.getOutputStream() ); 
o.println( data ); 
o.close();

*_

Aber ich verstehe nicht, wie und wo ich nun was eintragen könnte

Schon mal Danke
der Gast ohne Namen ;-)


----------



## pinhead84 (27. Okt 2008)

Wie 'FArt' schon schrieb, sollte es mit dem Apache-HttpClient einfacher gehen, als ich es beschrieben hatte:


```
PostMethod post = new PostMethod("http://jakarata.apache.org/");
        NameValuePair[] data = {
                new NameValuePair("user", "joe"),
                new NameValuePair("password", "bloggs")
        };
        post.setRequestBody(data);
        // execute method and handle any error responses.
        ...
        InputStream in = post.getResponseBodyAsStream();
        // handle response.
```


In deinem Falle müsstest du beim POST-Request die URL eingeben, die im action-Attribut des Formulars steht, sowie die Eingabefelder als NameValuePair:

```
PostMethod post = new PostMethod("http://www.meinserver.de/func/setup/getlog");
        NameValuePair[] data = {
                new NameValuePair("startdate", "2008-09-11 00:00:00"),
                new NameValuePair("enddate", "2008-09-12 00:00:00"),
                new NameValuePair("dummy", "1221121089"),
                new NameValuePair("action", "Search")
        };
```


----------



## Gast (28. Okt 2008)

Aber wenn ich das nun einfüge und kompiliere, sagt er mir 

*cannot find symbol class PostMethod
cannot find symbol class NameValuePair*

Habe die Jakarta Jar Archive aber ins Projekt mit eingebunden und ein 

```
import org.apache.http.client.*;
```
 hab ich auch drin :-(

Der Gast aus dem Osten  :autsch:


----------



## pinhead84 (28. Okt 2008)

Eclipse / Netbeans sollten dir die nötigen Importe automatisch anzeigen, wenn du die HTTP-Components korrekt eingebunden hast.

Wie ich gerade sehe funktioniert der Beispielcode nur mit Version 3.1 der HTTP-Components, siehe hier. Prüfe also mal, welche Version du heruntergeladen hast.

Version 4 (Beta) ist anscheinend nicht abwärtskompatibel, siehe API. Wenn du diese Version verwenden willst, schau dir eines dieser Beispiele an. Im Zweifelsfalle würde ich aber eher zur stabilen 3er Version raten.


----------



## Gast (29. Okt 2008)

Jawohl, das wars, hab jetzt die 3.1 drauf und die wirft zumindest beim compilieren keine Fehler mehr.
Das Programm läuft zwar noch nicht wie gewünscht (eigentlich läuft es gar nicht) aber ich hab ja noch 2 Wochen Zeit.
Jetzt meckert er, das er eine Methode nicht findet, genauen Fehlertext muß ich durcharbeiten, aber falls es wieder hängt melde ich mich einfach noch mal...wenn ich darf  :roll: 
Evt. sollte ich mich mal im Forum anmelden, immer nur als Gast ist irgendwie doof  :autsch: 

Gruß
Der "Noch" Gast


----------



## Guest (29. Okt 2008)

Ich noch mal...
Was hat das hier für eine Funktion, weil die kann ich nämlich nicht in den Code aufnehmen, dann schmeißt er Fehler beim compilieren ->

```
HttpClient client = new HttpClient();
```




			
				Gast hat gesagt.:
			
		

> Jawohl, das wars, hab jetzt die 3.1 drauf und die wirft zumindest beim compilieren keine Fehler mehr.
> Das Programm läuft zwar noch nicht wie gewünscht (eigentlich läuft es gar nicht) aber ich hab ja noch 2 Wochen Zeit.
> Jetzt meckert er, das er eine Methode nicht findet, genauen Fehlertext muß ich durcharbeiten, aber falls es wieder hängt melde ich mich einfach noch mal...wenn ich darf  :roll:
> Evt. sollte ich mich mal im Forum anmelden, immer nur als Gast ist irgendwie doof  :autsch:
> ...


----------

