Einführung in die CGI-Programmierung

von Wolfgang Wiese
 
Realm of CGI

Seite 1

  1. Das Common Gateway Interface
  2. Def.: Das Common Gateway Interface (CGI) ist ein Interface um externe Programme oder Gateways unter Steuerung eines Informationsservers ablaufen zu lassen.

    Im Klartext: Gatewayprogramme (CGI-Programme, CGI-Skripts) sind ausführbare Programme, die selbstständig ablauffähig sind. In den meisten der Fällen werden sie erstellt, um auf Anfragen von Benutzern zu reagieren.
    Diese Anfragen erhalten die CGI-Programme in der Regel aus fest definierten Eingabemasken, den Forms.
    Was eine Form ist, und wie diese aufgebaut ist, zeigen wir später.
    Bevor wir zu einem konkreten Programm-Beispiel kommen, welches wir Schritt-für-Schritt entwickeln, möchte ich erst noch einige Worte zu den Hintergründen sagen.

    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 und empfehlenswert ist die Interpreter-Sprache Perl.

    Beim Aufruf des CGI-Programmes aus einem Formular übermittelt der Web-Browser des Benutzers die Eingabedaten an den Web-Server. Dieser wiederum startet das CGI-Programm und übergibt die Eingabedaten und weitere Parameter mit Hilfe der Environment-Variablen.
    Im Normalfall wertet das CGI-Programm nun diese Variablen aus und liefert eine HTML-Seite an den Web-Server zurück, welcher dieser weiter zum Browser leitet.

    Das folgende Bild verdeutlicht dieses:

    CGI Ablauf-Diagramm

    Dieses Vorgehen ist allerdings nur der Regelfall. Es ist Sache des Programmierers, inwieweit er sich an dieses Ideal hält. So ist es zum Beispiel nicht zwingend notwendig, daß das CGI-Programm auch wirklich eine HTML-Seite zurückliefert. Erhät der Web-Server jedoch keine Antwort, wird dem Anwender die Meldung "Document contains no data." gesandt.
    Eine weitere Möglichkeit wäre es, den Web_Server anzuweisen, eine andere, schon bestehende Seite zu laden.

  3. Übergabe von Benutzereingaben
  4. Bei der Übermittlung der Daten vom Browser zum Web-Server und von diesem zum CGI-Programm werden die Daten in einer einzigen Zeichenkette gepackt:
    • Sonderzeichen werden durch den hexadezimalen ASCII-Code ausgedrückt, wobei ein "%" als vorlaufende Kennzeichnung fungiert.
    • Leerzeichen werden durch das Pluszeichen "+" ersetzt.
    • Eventuell vorhandene Prozentzeichen werden erstetzt durch ein vorlaufendes Prozentzeichen und den ASCII-Code: "%25".
    • Alle zu übergebenden Werte werden in der Form "Name=Wert" eingebunden, wobei "Name" der im <INPUT>-Tag angegebene Name ist, und "Wert" der dazugehöhrige Eintrag.

    Ein String, der dem CGI-Programm übergeben wird, kann also z.B. so aussehen:

    Text=Hallo+dies+ist+ein+Test&Zeichen=%25

    Die codierten Eingabedaten werden je nach Art der Methode dem Web-Server übergeben. Es gibt im wesentlichen zwei Methoden, die verwendet werden: GET und POST.
    Auf das CGI-Programm selbst macht es keinen Unterschied, welche Methode verwendet wird (sieht man von einer zusätzlichen Zeile im Code ab). Der Unterschied macht sich in der URL bemerkbar:

    • Bei der GET-Methode wird die in der <FORM ACTION="URL"> angegebene URL genommen und die codierten Eingabedaten angehängt, getrennt durch ein "?". Dies könnte zum Beispiel so aussehen:

      http://.../cgi-bin/testcgi.pl?Text=Hallo+dies+ist+ein+Test&Zeichen=%25

      Diese URL wird beim Absenden der Anfrage auch durch den Browser angezeigt.
      Die Nachteile der GET-Methode sind leicht ersichtlich:
      • Es eignet sich nur bei relativ geringen Datenmengen
      • URLs werden unleserlich.
      Als Vorteil ist nurmehr zu sagen, daß diese Darstellung für den CGI-Programmierer sehr hilfreich sein kann beim Debugging seinen Skriptes. Außerdem ist GET schneller als POST.

    • Bei der POST-Methode bleibt die in <FORM ACTION="URL"> angegebene URL unverändert.
      Die Daten werden für den Benutzer unsichtbar an den Server übertragen. Dies hat aber den Nachteil, daß man die URL nicht bookmarken kann: Während man z.B. bei einer Suchmaschine, welcher mit GET arbeitet ganz bestimmte Begriffe linken kann, und so immer einen aktuellen Link auf einen Suchbegriff haben kann, kann man dies nicht machen, wenn die Methode POST ist. Der folgende Link weist z.B. immer auf die Übersetzung des Wortes "Wahrscheinlichkeit" ins Englische:

      http://www.leo.org/cgi-bin/dict-search?search=wahrscheinlichkeit

      Die gleiche Funktionalität ist mit POST nicht möglich, weil die gesendeten Daten, nach einem Neustart des Browsers oder nachdem eine andere Form abgesendet wurde, nicht mehr zur Verfügung stehen.

    Es ist somit nicht unwichtig sich darüber Gedanken zu machen, welche Methode man letztendlich benutzt. Man sollte sich an die Regel halten, daß man generell große und/oder komplexe Eingabe mit POST übergibt, und alle andere mit GET.
    (Eine Alternative, beides abzudecken, wäre es, Informationen zusätzlich in der Pathinfo mitzugeben. Die Informationen, die hier stehen, können sowohl bei POST, wie bei GET mitgeliefert werden. Die Informationen werden allerdings dann in eine andere Environment-Variable übergeben.)




Wolfgang Wiese
E-Mail: unrzc9@rrze.uni-erlangen.de,
04.08.1997