# Daten per POST-Methode aus Java-Applet nach php-Script senden



## thestallion90 (10. Feb 2012)

Hey Leute,

ich will diesen Thread nicht mit gejammer eröffnen, wie lange ich schon an meinem Problem hänge und dass ich überhaupt nichtmehr weiter weiß. Aber in der Zeit, die ich schon mit dem Problem verbracht habe, gehen andere Leute normalerweise mindestens 2 mal schlafen :autsch:

Problemstellung: Ich schreibe an einer Website, auf der man Sitzplätze reservieren kann. Über php-Seiten wählt man die Veranstaltung aus, Anzahl der Karten usw., auf einer php-Seite wird dann innerhalb eines Applets der entsprechende Sitzplan angezeigt und man kann sich Sitzplätze aussuchen. 
Wenn man Plätze ausgesucht hat, muss die Webseite natürlich auch übermittelt bekommen, welche Plätze das sind. Für diese Übermittlung vom Applet zur entsprechenden Webseite habe ich mir die POST-Methode ausgesucht.

Warum POST? 
-Die GET-Methode würde sicherlich in 5 min stehen, allerdings kann sich jeder denken, wie die URL aussieht, wenn da jemand 20 Plätze reserviert.
-Ich habe alternativ versucht die Daten aus dem Applet heraus in Cookies zu speichern und dann aus der php Seite aufzurufen, aber das sei mal nur so am Rande erwähnt...
POST scheint mir am sinnvollsten zu sein...

Zu meinen bisherigen Recherchen: Normalerweise ließ sich bis jetzt jedes Problem mit Google lösen, nicht immer elegant, aber es hat funktioniert. Mittlerweile bin ich soweit, dass egal welche Suchbegriffe ich mir ausdenke einfach alle Links schon lila, also besucht sind. Man findet fast ausschließlich Codebeispiel(e), die auf URLConnection bzw. HTTPURLConnection basieren. Hier eines von vielen Beispielen, die ich ausprobiert habe:


```
private void PostResult4(String url2) throws MalformedURLException, IOException 
    { //in url2 wird der name der php-Datei übergeben, die angesprochen werden soll
        String urlParameters = "myVariable1=myValue1&myVariable2=myValue2";
        URLConnection connection = null;   
        URL url = getBaseURL(this.getDocumentBase()); //Addresse des verzeichnisses, in dem die Datei liegt, aus der das Applet aufgerufen wurde
        //Ich bekomme immer, mit GetCodeBase und mit GetDocumentBase, die komplette URL mit Name 
        //der php-Datei und allen Variablen. "getBaseURL" habe ich geschrieben um alles ab dem "?" im
        //Link hinten abzuschneiden. Nach dieser Zeile steht in url also etwas wie "http://localhost/Reservierungssystem/"
        url = new URL(url + url2); //fertige url, Beispiel: [url]http://localhost/Reservierungssystem/reservieren.php[/url]   
        System.out.println("URLConnection wird gestartet an: "+url.toString() );
        connection = (URLConnection)url.openConnection();

        // Use post and add the type of post data as URLENCODED
        connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

        // Optinally add the language and the data content
        connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
        connection.setRequestProperty("Content-Language", "en-US");  

        // Set the mode as output and disable cache.
        connection.setUseCaches (false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //Send request
        DataOutputStream wr = new DataOutputStream (connection.getOutputStream ());
        wr.writeBytes (urlParameters);
        wr.flush ();
        wr.close ();
    }
```

Wenn ich das richtig sehe, sollte diese Methode zwei Variablen, myVariable1 und myVariable2 an das Dokument "http://localhost/Reservierungssystem/reservieren.php" schicken, die dann aus diesem Dokument heraus ungefähr so abrufbar sein müssten: echo $_POST['myVariable1'];
ACHTUNG: Das Dokument "reservieren.php" ist hier nicht die php-Datei, aus der das java-Applet gestartet wird. Nennen wir diese Datei "sitzplan.php".
Wenn ich also oben geschriebenen Code ausführe und dann per Button auf der "sitzplan.php" Seite die Seite "reservierung.php" aufrufe kann ich dort in $_POST weit und breit nichts von myVariable1 finden.

_Zwischenfrage: Kann ich überhaupt eine POST-Variable an ein anderes php Dokument schicken als das, aus dem das Applet aufgerufen wird? Sagen wir mal ich sende die Variable an sitzplan.php, dann bringt mir das doch nichts, die Seite ist doch schon geladen. (Das is die Seite, auf der das Applet liegt)_

Ich habe mir überlegt, dass mein aus dem Applet gesendetes $_POST eventuell überschrieben wird, wenn ich in sitzplan.php auf den Button klicke um reservierung.php auzurufen. Deshalb habe ich auch schon probiert die Seite reservierung.php manuell aufzurufen, nachdem das Applet die POST-Variablen gesendet hat. Kein Erfolg.
Ein anderer Ansatz war, die Seite reservierung.php aus dem Applet heraus aufzurufen, damit die php-Datei Sitzplan.php da nichtsmehr machen konnte:


```
URL url = new URL(getBaseURL(this.getDocumentBase())+"reservierung.php");
getAppletContext().showDocument(url);
```
-> auch kein Erfolg

Hier mal die Meldung, die ich geschätze 2000 mal gelesen habe: 
*Notice:* Undefined index: myVariable1 in */Applications/XAMPP/xamppfiles/htdocs/Reservierungssystem/reservieren.php* on line *74* 

Hier der Code, der die Meldung hervorgerufen hat:

```
echo$_POST['myVariable1'];
```

Auch wenn das aus meinem Codebeispiel oben nicht hervor geht, ich habe bis jetzt versucht mit HTTPURLConnection zu senden, aber auch mit URLConnection. Einen Unterschied kenne ich nicht, ich habe einfach blind ausprobiert...

Dann habe ich hier im Forum einen Thread gefunden, der mich darauf gebracht hat, dass ich die Variablen aus $_HTTP_RAW_POST_DATA auslesen muss, einen Versuch habe ich gestartet, Meldung:

*Notice:* Undefined variable: _HTTP_RAW_POST_DATA in */Applications/XAMPP/xamppfiles/htdocs/Reservierungssystem/reservieren.php* on line *12*

_Gedankengang: Ich benutze zum Testen XAMPP Control, lade die Dateien also nicht auf einen Webserver hoch sondern teste lokal auf meinem Rechner. Kann XAMPP Control vielleicht nicht mit meinen abgefeuerten HTTP-Requests umgehen?_ 

*AbschlussFrage/Wunschlösung:* Ich möchte gerne innerhalb des Applets (das auf sitzplan.php aufgerufen wird) einen Button "Weiter" haben, per click darauf wird die Seite reservierung.php aufgerufen. Diese Seite kann auf POST-Variablen zugreifen, die das Applet gesendet hat.

Wenn es jemandem hilft, kann ich auch gerne mal jemandem Zugriff auf die Seiten und das Applet geben (zum HTTP-Quellcode auslesen, Applet sehen oder sonst irgendwas). Ich bin in meinem jetzigen geistigen Zustand zu allem bereit... ???:L


----------



## Marcinek (10. Feb 2012)

Das Problem wird alle 5 Minuten hier gefragt. Lösung ist die Nutzung von Apache http Client.


----------



## thestallion90 (10. Feb 2012)

Marcinek hat gesagt.:


> Das Problem wird alle 5 Minuten hier gefragt. Lösung ist die Nutzung von Apache http Client.



Hättest Du Dich auch nur annähernd mit dem Post auseinander gesetzt, wäre Dir klar, dass ich keine 08/15 Frage gestellt habe und sowohl über den HTTP-Client bescheid weiß, als auch extrem umfassend recherche zu meinem Problem betrieben habe. Deine Antwort war also völlig unpassend.

Ich habe es mittlerweile geschafft das Problem zu lösen:

Folgendes ist mir klar geworden: Die Variable wird an ein Script gepostet, welches dadurch auch direkt aufgerufen wird. Damit ist die Lebensdauer der übergebenen POST-Werte auch schon beendet. Mein Fehler lag darin, dass ich die Variablen ein ein Script gesendet habe, das Script dann manuell geöffnet habe und dann auf die Variablen zugreifen wollte.
Lösung: Wenn ich die Dateien in reservierung.php zur Ausgabe im Browser verfügbar haben will, und zwar bei einem manuellen Aufruf der Seite, dann müssen die Variablen fest gespeichert sein, z.B. in einer Session oder einem Cookie (für den man auch die aktuele Session braucht).
Ich habe also ein weiteres Script "datenEmpfangen.php" geschrieben, das sieht so aus:


```
<?php
//Session starten - Das ist wichtig, weil es eine der einzigen Möglichkeiten darstellt, die übergebenen Variablen irgendwo fest zu speichern und den anderen Scripten so verfügbar zu machen.
session_start();
//Übergebene Variablen aus POST in SESSION einlesen.
$_SESSION['SeatsCount'] = $_POST['SeatsCount'];    
$_SESSION['Seats'] = $_POST['Seats'];
echo"AllOK"; //AllOK an applet senden, wir dort in der konsole ausgegeben
?>
```

Hierbei ist zu beachten, dass die php-Datei datenEmpfangen.php in genau der gleichen SESSION laufen muss, wie die Datei, aus der das Applet aufgerufen wird. Sonst werden die Variablen in eine neu erzeugte SESSION gepostet. Das lässt sich beim Posten der Variablen im Applet mit folgender Zeile bewerkstelligen:


```
connection.setRequestProperty("Cookie", "PHPSESSIONID=" + mySession);
```

Somit wird im Http-Header die SessionID übergeben (PHPSESSIONID) und durchs session_start() aufgegriffen und keine neue Session gestartet. Die variable mySession ist ein String. Die SessionID muss man aus der Datei, aus der das Applet aufgerufen wird (Sitzplan.php) beim Aufruf des Applets als Parameter übergeben, damit die ID im Applet verfügbar ist:


```
echo'<applet code="Main.class" width="'.$AppletBreite.'" height="600">';
echo'<param name="SESSION_ID" value="'.session_id().'">';  //session_id() gibt zugrif auf die id der laufenden Session.
```

Im Applet wird das Parameter dann in die String-Variable mySession geschrieben.
echo'</applet>';


----------



## DerFeivel (10. Feb 2012)

> Hättest Du Dich auch nur annähernd mit dem Post auseinander gesetzt, wäre Dir klar, dass ich keine 08/15 Frage gestellt habe und sowohl über den HTTP-Client bescheid weiß, als auch extrem umfassend recherche zu meinem Problem betrieben habe. Deine Antwort war also völlig unpassend.



Find ich jetzt nicht:

Deine Anfrage war: Daten per POST-Methode aus Java-Applet nach php-Script senden.


Mit:

HttpClient - Post Method

kannst du mit relativ wenig Code dieses Anliegen bewerkstelligen.


----------

