CGI
Willemers Informatik-Ecke
CGI ist eine Schnittstelle zwischen dem Webserver und einer Anwendung. Die Idee ist, dass der Server auf dem Browser Daten liefert, die nicht starr sind, sondern durch den Inhalt von Datenbanken oder anderen Applikationen gespeist sind. Dazu ist es notwendig, dass Webserver und Applikation miteinander sprechen. Das Interface hierzu ist CGI.

Erster Schritt: Direkter Aufruf eines Serverprogrammes

Wenn der Browser dynamisch erstellte Daten liefern soll, müssen auf dem Server Programme oder Skripten ablaufen. Der Serverprozess muss also auf einen Hinweis im HTML-Quelltext hin diesen Prozess starten. Das Ergebnis des gestarteten Prozesses soll normalerweise wieder auf dem Browser erscheinen. Dazu muss dieser Prozess seine Daten nur auf stdout, also die Standardausgabe lenken.

Die einfachste Art, von HTML aus einen Prozess auf dem Server zu starten, geht über einen HREF-Link.

<a href="http://www.server.de/cgi-bin/startmich">Starte CGI-Skript</a>
  oder
<a href="/cgi-bin/startmich">Starte CGI-Skript</a>

Das Verzeichnis cgi-bin liegt typischerweise an anderer Stelle, als die HTML-Dateien für die Webpräsenz. Dieses Verzeichnis wird in der httpd.conf des Webservers festgelegt. Hier wird die Datei startmich gesucht. Sie muss ausfürbar sein.

Betrachten wir nun den angestossenen Skript, der aus Demonstrationszwecken in einfachster Shell-Sprache der Bourne-Shell gehalten ist. Es ist dabei völlig gleichgültig, in welcher Programmiersprache das Programm gehalten ist.

#!/bin/sh
echo "Content-type: text/html"
echo
# Inititalisierung beendet: es folgt der gesendete Text
echo "Es ist gut, Sie hier zu sehen.<br>"
echo "MfG, Arnold Willemer"

Die Standardausgabe dieses Programmes wird dem Browser als Input zugesandt. Dabei ist entscheidend, dass in der ersten Zeile "Content-type: text/html" und danach eine Leerzeile erscheint. Ansonsten gibt es eine Fehlermeldung.

Daten an den Server senden

Die typische Art, Daten an den Server zu senden, wird über Formulare erreicht. Das Attribut ACTION des Formulars gibt an, welches CGI-Programm aufgerufen werden soll, wenn der SUBMIT-Knopf gedrückt wird. Die Übermittlung der Daten aus der Form-Maske an den Skript erfolgt per Standard-Eingabe, wenn als Methode so wie hier POST verwendet wird.

<FORM ACTION="/../cgi-bin/formcgi.pl" METHOD="POST">
<INPUT NAME="Name" VALUE="Name" SIZE=30> <br>
<TEXTAREA Name="Adresse" ROWS=5 COLS=60>
Ihre Adresse
</TEXTAREA> <br>
<INPUT TYPE="RADIO" NAME="Anrede" VALUE="Herr">Herr<br>
<INPUT TYPE="RADIO" NAME="Anrede" VALUE="Frau">Frau<br>
<INPUT TYPE="SUBMIT" VALUE="Start">
</FORM>

Als empfangenden Skript wird diesmal ein PERL-Skript verwendet. Das macht technisch wenig Unterschied. Allerdings hat PERL schöne Möglichkeiten, die übergebenen Daten "mundgerecht" aufzubereiten.

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$line = <STDIN>;

@array = split('&', $line);
for ( $i=0; $i<= $#array; $i++) {
  ($name, $value) = split('=', $array[$i], 2);
  $field{$name} = $value;
}

print "Name : ".$field{"Name"}."
"

In der ersten Zeile wird festgelegt, durch welchen Interpreter der Skript ausgeführt wird. In diesem Fall ist es PERL. Das erste Kommando erzeugt die beiden Ausgabezeilen, damit der Browser erkennt, dass es sich hier um eine HTML-Ausgabe handelt. Im nächsten Schritt wird der Standard-Input ausgelesen. Hier hat das Formular seine Eingabedaten hingeschrieben. Der Inhalt von $line würde nun etwa so aussehen:

Name=Name&Adresse=Ihre+Adresse%0D%0A&Anrede=Frau

Man kann anhand der Zeile leicht erkennen, wie der Aufbau der übermittelten Daten aussieht. Die Zuordnung der Elemente hat die Struktur

Feldname=Wert

Die Eingabeelemente werden durch & getrennt. Leerzeichen in Eingabefeldern werden durch ein + ersetzt. Bei Textareas werden die Zeilen durch %0D%0A abgeschlossen.

In den folgenden Zeilen sieht man, wie schnell PERL aus diesen Zeilen die Daten aufbereiten kann. Mit dem ersten Split-Befehl wird der String $line in ein Array aufgespalten, wo immer sich ein & befindet. Damit enthauml;lt jedes Array-Element einen Ausdruck Name=Wert. Nun wird eine for-Schleife über die Größe des Arrays gemacht und dabei jede Zeile so aufgebrochen, dass die Variable $name den linken Teil und die Variable $value den rechten Teil erhält. Daraufhin wird ein assoziatives Array angelegt, das über den Variablennamen den Wert liefert. Die letzte Zeile zeigt also den Wert für die Variable Name an.