# Post | Get  <- PhP



## >>--(knee)--> (4. Apr 2012)

Hallo, 
ich weiß nicht ganz ob ich das hier unter 'Spiele' oder 'Netzwerke' Posten soll, sollte ich mich falsch entschieden haben, bitte ich um Verzeihung.

Zu meiner Frage:
  Ich habe mir folgende Klasse geschrieben um Werte an ein PhP Skript zu schicken,
  dieses soll diese in eine Textdatei schreiben.


Spoiler: Code






Spoiler: HighscoreSaver





```
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class HighscoreSaver {

	public static final int SEND_POST = 0;
	public static final int SEND_GET = 1;

	private String phpPath;
	private StringBuilder getString = new StringBuilder();
	private StringBuilder postString = new StringBuilder();

	public HighscoreSaver(String phpPath) {
		this.phpPath = phpPath;
	}

	public boolean send() {
		boolean ret = true;
		String path = phpPath + getString;
		System.out.println(path);
		try {
			URL url = new URL(path);
			URLConnection con = url.openConnection();
			con.setDoOutput(true);
			OutputStream out = con.getOutputStream();
			out.write(postString.toString().getBytes());
			out.flush();
		} catch (MalformedURLException e) {
			e.printStackTrace();
			ret = false;
		} catch (IOException e) {
			e.printStackTrace();
			ret = false;
		}
		return ret;
	}

	public void add(String name, String value, int art) {
		if (art == SEND_GET) {
			addGetVariable(name, value);
		} else if (art == SEND_POST) {
			addPostVariable(name, value);
		}
	}

	public void addGetVariable(String name, String value) {
		appendGetSeparator().append(name).append('=').append(value);
	}

	public void addPostVariable(String name, String value) {
		appendPostSeparator().append(name).append('=').append(value);
	}

	private StringBuilder appendGetSeparator() {
		if (getString.length() == 0)
			getString.append('?');
		else
			getString.append('&');
		return getString;
	}

	private StringBuilder appendPostSeparator() {
		if (postString.length() != 0)
			postString.append('&');
		return postString;
	}
}
```






Spoiler: HighscoreSaver JUnit





```
@Test
	public void test() {
	HighscoreSaver s = new HighscoreSaver("http://XXXXXX/save.php");
	s.addGetVariable("name", "Peter");
	s.addGetVariable("score", "100.000.000.000€");
	s.addPostVariable("tname", "Peter");
	s.addPostVariable("tscore", "100.000.000.000€");
	s.addPostVariable("table", "test");
	s.send();
	}
```






Spoiler: PhP





```
$name = (String)$_Get["name"];
	$score = (String)$_Get["score"];
	$tname = (String)$_POST["tname"];
	$tscore = (String)$_POST["tscore"];
	$checksum = (String)$_POST["checksum"];
	$gameName = (String)$_POST["table"];

/*Abfragen ob die Werte 'valid' sind. Habe die Abfragen zum Testen raus genommen. Funktioniert trotzdem nicht.*/

 	$fp = fopen("_".$gameName.".txt","a+");
         fputs($fp,$tname."|".$tscore."\n");
         fclose($fp);
```







Leider bekomme ich keine Fehlermeldung, es tut sich einfach gar nichts.
Wenn ich mich aber vom Netz trenne erscheint (wie erwartet) eine Exception beim Verbinden: 
	
	
	
	





```
java.net.UnknownHostException
```
.

Ich hoffe ihr könnt mir Helfen.
Viele Grüße


----------



## irgendjemand (4. Apr 2012)

1) in php heißt das get-array $_GET ... $_Get gibt es nicht ...
2) java : [c]String path = phpPath + getString;[/c] das ist falsch ... es muss heißen : [c]String path = phpPath + getString.toString();[/c]
3) prüfe mit wireshark ob überhaupt , und wenn ja welche daten gesendet werden


----------



## nillehammer (4. Apr 2012)

Du erzeugst in Deinem Code einen String und schiebst den in den OutputStream. Leider reicht das nicht für gültige GET- oder POST-Requests. Die haben eine bestimmte Struktur mit Headern, URL und evtl Body (bei Post). Die müsstest Du entweder komplett händisch mit Strings erzeugen und dann in den OutputStream schieben oder Du benutzt eine Library, die das für Dich macht. Ich finde den http-Client von Apache dafür sehr gut geeignet.


----------



## irgendjemand (4. Apr 2012)

nillehammer hat gesagt.:


> Du erzeugst in Deinem Code einen String und schiebst den in den OutputStream. Leider reicht das nicht für gültige GET- oder POST-Requests. Die haben eine bestimmte Struktur mit Headern, URL und evtl Body (bei Post). Die müsstest Du entweder komplett händisch mit Strings erzeugen und dann in den OutputStream schieben oder Du benutzt eine Library, die das für Dich macht. Ich finde den http-Client von Apache dafür sehr gut geeignet.



ich dachte das macht [japi]HttpURLConnection[/japi] selbst ?


----------



## nillehammer (4. Apr 2012)

> ich dachte das macht HttpURLConnection selbst ?


Dafür müsste man sie Konfigurieren, d.h. URLConnection nach HttpURLConnection casten und Request-Parameter und Request-Method über die entsprechenden Methoden setzen. Kann sein, dass sie da default Verhalten hat, wenn man nichts konfiguriert. Ausprobiert habe ich es aber noch nicht.

Aber, was mir gerade noch auffällt: Ich sehe nirgends ein con.connect(). Das wird von einigen Methoden der URLConnection zwar implizit aufgerufen, ob aber die hier verwendeten dazu gehören, konnte ich anhand der API-Docs nicht ermitteln.


----------



## irgendjemand (5. Apr 2012)

mit dem connect irrst du dich ... denn URL.openConnection() callt dies implizit in der jeweiligen instanz nach festgestellt wurde welches protokoll und damit welche implementierung zu verwenden ist ...
wäre hier also total überflüssig und würde eh ignoriert werden da openConnection() dies bereits gecallt hat


----------



## nillehammer (5. Apr 2012)

> mit dem connect irrst du dich ... denn URL.openConnection() callt dies implizit in der jeweiligen instanz nach festgestellt wurde welches protokoll und damit welche implementierung zu verwenden ist ...
> wäre hier also total überflüssig und würde eh ignoriert werden da openConnection() dies bereits gecallt hat


Bist Du da sicher? In der API-Doc zu openConnection (URL#openConnection()) steht dieser Satz: "It should be noted that a URLConnection instance does not establish the actual network connection on creation. This will happen only when calling URLConnection.connect()."
Das hatte ich jetzt so interpretiert, dass es eben noch nicht gecallt wird.


----------



## irgendjemand (5. Apr 2012)

tja im source nachgucken kann man nicht ... da das mal wieder über factory-klassen im sun.* package verschwindet ...


----------



## Empire@home (8. Apr 2012)

Zum einen kann man problemlos (mit übung) im bytecode nachlesen, so schlimmist da auch nicht, zumindest wenn man nur nen methodena ufruf haben will. Oder halt im openjdk nachgucken,da beide identische spezifikationen(wo mana uch anchgucken könnte) implementieren müsste die logik folglich auch gleich sein. (gibt wenige ausnahmen aber die halten sich in grenzen)


----------



## irgendjemand (8. Apr 2012)

Empire@home hat gesagt.:


> Zum einen kann man problemlos (mit übung) im bytecode nachlesen, so schlimmist da auch nicht, zumindest wenn man nur nen methodena ufruf haben will. Oder halt im openjdk nachgucken,da beide identische spezifikationen(wo mana uch anchgucken könnte) implementieren müsste die logik folglich auch gleich sein. (gibt wenige ausnahmen aber die halten sich in grenzen)



hmm ... dann kennst du die "einfachsten" unterschied aber nicht ...

im openJDK ist was die klassen angeht auch einiges nicht zugänglich ... und man muss es sich aus den VM sources zusammenlesen ...

außerdem verwendet die Sun/Oracle-VM packages wie sun.* com.sun.* etc und diese sind so NICHT im openJDK vorhanden ...

wenn ich also im "source" der Oracle-VM eine factory finde in der auf eine klasse in sun.* verwiesen wird ... werde ich diese trotzdem NICHT im openJDK finden ...

genau DAS sind ja die unterschiede zwischen closed und open source JVM

und wie du sowas dierekt im bytecode nachlesen willst ist mir auch nicht ganz klar ...
denn hier geht es nicht um irgendwelche signaturen welche man noch mit ein wenig übung lesen kann ... sondern dierekt um die internen abläufe ... welche im bytecode nun mal nur noch als VM-assebler vorhanden sind ...


----------

