Advanced
Java
Services
|
Datenübertragung mit GET und POST |
Jede Datenübertragung via HTTP wird durch einen Header eingeleitet. Der Server überträgt dann die
eigentlichen Daten im BODY. Der Client dagegen hat zwei Möglichkeiten, Daten an den Server zu
schicken. Er kann wie der Server die Daten im BODY übertragen, er kann aber auch die Daten zusammen
mit dem URL übertragen.
GET
Mit GET signalisiert der Client nicht nur eine Anforderung nach einer Datei, sondern gleichzeitig,
die Methode, wie er zusammen mit dieser Anforderung Daten an den Server schickt. Jeder kennt
den Vorgang, in dem man ein Textfeld in einer Suchmaschine ausfüllt und den eingegebenen String
mit ENTER an den Server sendet. Wenn man in die Adresszeile des Browsers schaust, sieht man dann
z.Bsp. folgendes "http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=rfc+http&btnG=Google+Suche&meta=".
Hier werden nach dem Fragezeichen zusammen mit Adresse Daten gesendet. Daten, die so gesendet werden,
werden URLcodiert. Meist haben die Daten die Form name=wert, wobei diese Paare durch ein & getrennt
werden.
Aufbau eines URL-Anhangs
http://www.xxx.zzz/dateiName.suff?name1=wert1&name2=werts&name3=wert3
Hier dürfen keine Leerzeichen auftauchen, da diese vom Server als Ende des Strings aufgefaßt werden,
weiter dürfen in den Wertteilen natürlich keine Zeichen wie ? oder = oder & vorkommen, woraus sich
die Notwendigkeit einer Codierung sofort ergibt. Jeder Browser kann diese Codierung vornehmen.
UTF-8 Codierung.
Im nächsten Kapitel wird die Hilfsklasse URLEncoder behandelt. Dort finden Sie ein Applet, bei dem Sie
einen String eingeben können und der dann UTF-8 codiert ausgegeben wird.
POST
Umfangreiche oder sensible Daten wird man nicht mit GET übertragen. In diesem Fall wählt man die POST
Methode. Bei dieser Methode sendet der Client die Daten im BODY nach dem Header. Dazu beginnt der
Header nicht mit dem Schlüsselwort GET sondern mit POST. Adressen, die man in die Adresszeile eines
Browsers eingibt, werden immer mit GET abgeschickt. Mit sogenannten HTML-Formularen kann man zusätzlich
Daten versenden, die beim Client eingegeben werden. So kann jeder Browser u.a. etwa Textfelder oder
CheckBoxen usw. anbieten. Im HTML-Text kann man dann festlegen, welche der beiden Übertragungsmethoden
der Browser verwenden soll.
HTML-Formulare
Mit Hilfe von HTML kann man sogenannte Formulare anbieten. Meist sind diese Textfelder oder
Checkboxen, in denen ein user Daten eingeben kann. Je nachdem, welche Übertragungsmethode man
hier im form-Tag angibt, werden die Daten dann mit GET oder mit POST übertragen. Ausgelöst wird die
Datenübertragung durch Betätigen eines submit-Buttons. Ein einfaches Formular kann wie folgt aussehen:
<form action="http://www.xxx.zzz/file.pl" method="get">
Vorname
<br><input type="text" name="vor" size=40 maxlength=40>
<br>Nachname
<br><input type="text" name="nach" size=40 maxlength=40>
<br>ID
<br><input type="text" name="id" size=40 maxlength=40>
<br>Nachricht
<br><textarea name="msg" rows=7 cols=30></textarea>
<br><input type="reset" value=" Zurücksetzen ">
<input type="submit" value="Daten senden ">
</form>
Das Formular ist weitgehend selbsterklärend. Ersetzt man im Attribut method get durch post, so wird, wen
wundert's, POST als Übertragungsmethode gewählt. Im Übrigen braucht die Übertragung mit GET nicht
explizit angegeben werden, da dies die Defaulteinstellung für das form-Tag ist.
Das obenstehende Formular sieht in einem Browser wie folgt aus:
Füllt man das Formular wie folgt aus,
H. M.
Straub
12+34
§9 100%-ig ok!
§11 nachbessern?
Außerdem: Währungen immer $
und betätigt den submit-Button, so sendet der Browser etwa folgendes:
GET /file.pl?vor=H.+M.&nach=Straub&id=12%2B34&
msg=%A79+100%25-ig+ok%21%0D%0A%A711+nachbessern%3F%0D%0AAu%DFerdem%3A+W%E4hrungen+immer+%24%0D%0A
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: de
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: 127.0.0.1
Connection: Keep-Alive
\r\n
\r\n
wobei die ersten beiden Zeilen real nur eine Zeile sind. Der Zeilenumbruch vor msg dient nur der
besseren Lesbarkeit.
Wählt man im gleichen Formular und bei gleicher Eingabe POST als Übertragungsmethode, so sendet
ein Browser die Daten wie folgt.
POST /file.pl HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: de
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: 127.0.0.1
Content-Length: 130
Connection: Keep-Alive
Cache-Control: no-cache
\r\n
\r\n
vor=H.+M.&nach=Straub&id=12%2B34&msg=%A79+100%25-ig+ok%21%0D%0A%A711+
nachbessern%3F%0D%0AAu%DFerdem%3A+W%E4hrungen+immer+%24%0D%0A
Wiederum ist hier der Zeilenumbruch zur letzten Zeile nicht vorhanden, sondern dient der besseren
Lesbarkeit. Wie man sieht, werden in einem Formular die Daten auch dann URL-codiert, wenn man sie
mit POST verschickt.
GET und POST mit Hilfe von URLConnection
Wie realisiert man GET und POST Aufrufe in Java. Man kann mit Socketverbindungen arbeiten. In diesem
Fall muß man die entsprechenden Header selbst codieren. Man kann aber auch mit der Klasse URLConnection
arbeiten. In diesem Fall werden die GET- bzw. POST Header automatisch erzeugt. Näheres dazu findet
sich in den entsprechenden Kapiteln
Die Klasse URLConnection
und
Sockets.