![]() |
![]() |
Das Common Gateway Interface beschreibt, wie vom Anwender am Web-Browser eingegebene Daten an den Web-Server gesendet und dort an ein CGI-Programm weitergereicht werden.
Auf dieser Seite sollen anhand von kleinen Beispielen die Abläufe beim Aufruf von CGI-Programmen erklärt werden.
(angegebene Menü-Namen und Browser-Meldungen beziehen sich
auf Netscape 2.01 und Internet Explorer 3.0)
Nehmen wir an, Sie haben mit HTML ein Formular definiert :
1. BeispielDas erscheint am Browser dann so : Was passiert nun, wenn Sie den OK-Knopf betätigen ? (Probieren Sie es doch mal und achten Sie darauf, was in der Anzeige "Adresse" ihres Browsers steht)
<form action="http://www.bingo.baynet.de/cgi-bin/ub/cgi-demo" method=GET> <input type=hidden name="BACK" value="/bingo/members/ub304/cgisampl.htm#beisp1"> <b>Suche nach : </b><input type=text name="SUCHE" size=20><br> <b>groß/klein : </b><input type=checkbox name="CASE"><br> <input type=submit value="ok"> </form>
1. Übertragung an den Web-Server
Im <form>-Tag wird mit "action=http://www.bingo.baynet.de/cgi-bin/ub/cgi-demo" festgelegt, mit welchem Protokoll (hier "http", also das Hyper Text Transfer Protokoll) an welchen Server ("www.bingo.baynet.de") die Daten gesendet werden sollen und welches Programm ("/cgi-bin/ub/cgi-demo") diese Daten verarbeiten soll.
Bevor die Daten an den Server gesendet werden, werden sie zunächst vom Browser zu einer einzigen Zeichenkette verpackt. Für unser Beispiel könnte die Zeichenkette z.B. so aussehen : "BACK=%2Fbingo%2Fmembers%2Fub304%2Fcgisampl.htm%23beisp1&SUCHE=irgendwas&CASE=on".
Die Art und Weise der Datenübertragung wird durch den Parameter "method=" gesteuert. Dabei wird grundsätzlich zwischen den beiden Methoden "GET" und "POST" unterschieden:
In unserem Beispiel wurde "GET" angegeben : In diesem Fall wird aus der im <form>-Tag angegebenen URL des CGI-Programms und der aus den Eingabedaten erzeugten Zeichenkette, getrennt durch ein "?", eine Pseudo-URL erzeugt. Für unser Beispiel könnte die also so aussehen: "http://www.bingo.baynet.de/cgi-bin/ub/cgi-demo?BACK=%2Fbingo%2Fmembers%2Fub304%2Fcgisampl.htm%23beisp1&SUCHE=irgendwas&CASE=on". Falls Sie das oben dargestellte Formular einmal abgeschickt haben, dann wird ihr Browser im Anzeigefeld "Adresse" eine entsprechende Pseudo-Adresse angeben.
Die Methode "GET" eignet sich nicht zur Übertragung größerer Datenmengen !
Alternativ kann als Methode "POST"verwendet werden. Dazu
muß der HTML-Code unseres Beispiels wie folgt geändert werden :
2. BeispielDer Benutzer sieht zunächst keinen Unterschied : Was passiert diesmal, wenn Sie den OK-Knopf betätigen ? (Probieren Sie es noch einmal und achten Sie darauf, was in der Anzeige "Adresse" ihres Browsers steht)
<form action="http://www.bingo.baynet.de/cgi-bin/ub/cgi-demo" method=POST>
Wenn Sie dann die Funktion "Anzeigen / Erneut laden" Ihres Browsers aufrufen, wird er Sie fragen "Erneutes Versenden der Datenart ?" : die Zeichenkette muß erneut übertragen werden. (Zumindest bei Netscape ist das so, der Internet Explorer fragt nichts, aber er versendet auch nicht erneut, was zu einer fehlerhaften Anzeige führt.)
2. Start des CGI-Programms
Der Server erkennt an dem Pfadnamen der angefragten URL, (i.A.
"cgi-bin"), daß nicht ein vorhandenes Dokument
zurückgesendet sondern ein CGI-Programm gestartet werden soll.
Der Server muß diesem Programm die Daten aus dem Formular
bereitstellen. Hierzu werden
Environment-Variablen verwendet.
Die Variable "REQUEST_METHOD" hat entweder den Wert
"GET" oder "POST".
Im Fall von "GET" wird die verpackte Zeichenkette in einer weiteren
Variablen "QUERY_STRING" bereitgestellt; bei "POST"
wird in einer Variablen "CONTENT_LENGTH" die Länge der
Zeichenkette abgelegt, die eigentliche Zeichenkette wird dem Programm auf
stdin (Standard-Input) zur Verfügung gestellt.
3. Lauf des CGI-Programms
Zur Erstellung eines CGI-Programms gibt es keine spezielle Programmiersprache. Im einfachsten Fall kann das Programm unter Unix ein shell script bzw. unter DOS eine .bat-Datei sein. Es können aber auch beliebige höhere Programmiersprachen wie c, Pascal oder Fortran benutzt werden. Sehr weit verbreitet ist auch die Script-Sprache Perl.
Das CGI-Programm packt zunächst die empfangene Zeichenkette wieder aus. Der weitere Programmablauf wird dann durch die so erhaltenen Parameter gesteuert.
Die Ausgabe des Programms erfolgt in einem Datenformat, daß vom Browser interpretiert werden kann; in den meisten Fällen ist das entweder "text/html" (also wieder ein HTML-Dokument) oder "image/gif" (also eine Grafik).
Als Beispiele stehen ein kleines shell script
(nämlich das von den hier gezeigten Formularen aufgerufene script) sowie
ein kleines c-Programm (zum Auspacken der Daten) zur Verfügung.
4. Senden der Antwort an den Browser
Dieser Vorgang ist nichts CGI-spezielles mehr.
Alternative: Mail
Ein weiterer Weg ist, die vom Anwender eingegebenen Daten per
Mail zu Verschicken. Viele Anwender haben aus Sicherheitserwägungen
keine Möglichkeit, bei ihrem Provider CGI-Programme abzulegen.
In diesem Fall ist der Weg über Mail die einzige
Möglichkeit, wenn eine lokale Verarbeitung der Daten mit JavaScript
(s.u.) ausscheidet.
Dazu muß wieder die erste Zeile unseres Formulars geändert werden;
außerdem habe ich in diesem Beispiel das
JavaScript-Ereignis "onSubmit" ergänzt :
3. BeispielDas sieht dann wieder genauso aus: Was passiert bei dieser Variante ? (Sie dürfen es gerne wieder probieren)
<form action="mailto:irgendwen@munich.sgi.com" method=POST onSubmit="{alert('... jetzt geht die Post ab'); return true;}">
Die Nachricht ist in dieser Form für den Empfänger leider nicht sehr gut lesbar. Komfortablere Mail-Reader (z.B. Pegasus, Freeware; Dank für die Info an Robert Wenner) bieten dem Anwender die Möglichkeit, automatisch sogenannte Filter aufzurufen, wenn eine Mail einen vorher definierten Betreff hat. Ein solcher Filter könnte die Aufgabe übernehmen, die verpackte Zeichenkette wieder auszupacken.
Subject: Form posted from Mozilla Date: Mon, 28 Oct 1996 19:40:52 +0100 From: Uwe Brinkmann <ub304@bingo.baynet.de> To: irgendwen@munich.sgi.com BACK=%2Fbingo%2Fmembers%2Fub304%2Fcgisampl.htm%23beisp3&SUCHE=irgendwas
Eine Mischform zwischen der Verwendung eines CGI-Programms und Mail bietet
ein sogenanntes CGI-mail Programm.
Da das Versenden der Mail normalerweise erfolgt, ohne daß der Anwender eine Meldung darüber bekommt, ist der Anwender oft verunsichert, ob jetzt überhaupt etwas passiert ist. Aus diesem Grund wird in dem zuletzt besprochenen Beispiel bei Betätigung des submit-buttons ein JavaScript-Alert ausgelöst, um den Anwender entsprechend zu benachrichtigen - sofern sein Browser JavaScript-fähig ist.
CGI und JavaScript
Mit CGI können auch die Eingabedaten eines Formulars (oder jegliche andere Daten) an eine neue HTML-Seite weitergegeben werden; in der aufgerufenen Seite verarbeitet dann ein JavaScript die übergebenen Daten. Dazu muß wieder die erste Zeile unseres Formulars geändert werden:
4. BeispielDas sieht dann wieder genauso aus: Wenn Sie dieses Formular abschicken, erscheint eine Seite, auf der die von Ihnen vorgenommenen Eingaben angezeigt werden. Außerdem finden Sie auf dieser Seite den Quellcode des verwendeten JavaScripts.
<form action="anzeig16.htm" method=GET>
CGI ohne Formular
Ein CGI-Programm kann nicht nur über ein Formular aufgerufen werden, sondern auch :
5. Beispiel
<a href="http://www.bingo.baynet.de/cgi-bin/ub/cgi-demo?BACK=/bingo/members/ ub304/cgisampl.htm%23beisp4&text=hallo">Sag Hallo</a>
(Bitte beachten Sie, daß anstelle des Sonderzeichens "#" die Ersatzdarstellung %23 verwendet wurde !)
Das erscheint so :
6. BeispielDamit ergibt sich folgendes Bild :
<img src="http://www.bingo.baynet.de/cgi-bin/ub/webcount?name=demo&font=tacho">
Ich hoffe, Ihnen mit diesen Ausführungen etwas weitergeholfen zu haben. Für Kritik und Anregungen bin ich immer aufgeschlossen.
Weiterführende Links :