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.

CGI: der Server schlägt zurück

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>

Das Verzeichnis cgi-bin liegt typischerweise an anderer Stelle, als die HTML-Dateien für die Webpräsenz. Sie müssen Ausführungsrechte haben, sonst werden sie nicht gestartet. Der Ort des cgi-bin wird durch die Konfiguration des Webservers festgelegt.

Betrachten wir nun den angestossenen Skript, der aus Demonstrationszwecken in einfachster Shell-Sprache der Bourne-Shell 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. Entgegen anderslautenden Gerüchten ist es durchaus nicht zwingend, Java oder Perl zu verwenden. Die beiden Sprachen tauchen aus unterschiedlichen Gründen in diesem Zusammenhang auf.

Perl ist eine Skriptsprache, die mächtige Befehle zur Stringverarbeitung besitzt und diese sind in diesem Bereich besonders hilfreich. Java ist durch die Java-Fähigkeit der Browser eine wohlbekannte Sprache im Internet-Umfeld. Warum sollte es nicht auch an dieser Stelle verwendet werden? Prinzipiell kann jede Programmiersprache verwendet werden, mit der es möglich ist, Übergabeparameter oder Environmentvariablen zu lesen, also auch C oder Shell-Skript.

Daten an den Server senden

Die typische Art, Daten an den Server zu senden, wird über Formulare erreicht. Zunächst einmal wird nur eine Anwendung aus dem Formular gestartet. Das folgende HTML-Dokument wird nach Drücken auf den Button "Start" das Programm /../cgi-bin/test02 durchstarten.

<HTML>
<HEAD>
<TITLE>Testseite</TITLE>
</HEAD>

<FORM ACTION="/../cgi-bin/test02" METHOD="POST">
<INPUT TYPE="SUBMIT" VALUE="Start">
</FORM>

</BODY>
</HTML>

Die Übermittlung der Daten aus der Form-Maske an den Skript erfolgt per Standard-Eingabe, wenn als Methode so wie oben POST verwendet wird. Wenn wir folgende einfache Maske verwenden:

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

Die Maske wäre optisch natürlich noch durch eine Tabelle zu strukturieren und erläuternde Texte aufzupeppen. Hier soll es aber nur um den Mechanismus gehen und da kann es gar nicht schlicht genug sein.

Den empfangenden Skript haben wir durch das Lesen der Standard-Eingabe erweitert.

#!/bin/sh
echo "Content-type: text/html"
echo
# Inititalisierung beendet: es folgt der gesendete Text
read maske
echo $maske

Der Inhalt des Formulars wird also in die Environment-Variable maske gelesen und anschließend wiedergegeben. Wir finden dann auf dem Browser die Zeile

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.

Literatur

Yves Ernst: HTML. Data Becker, 1996. Kapitel 13: Common Gateway Interface.


Homepage
TCP/IP
(C) Copyright 1999, 2000 Arnold Willemer
Last modified: Thu Nov 2 19:27:26 MET 2000