| ## CGI und HTML
| Die CGI-Schnittstelle CGI-Aufrufe aus HTML und HTML-Ausgabe über CGI Beispiel für die Wechselwirkung zwischen HTML und CGI

## Die CGI-Schnittstelle

CGI (Common Gateway Interface) ist eine Schnittstelle des Web-Servers. Sie erlaubt es, die Anfragen eines Web-Browsers an Programme (auf dem Web-Server) weiterzureichen und von diesen auszuführen zu lassen. Solche Programme (oder Scripts) können beispielsweise Formulareingaben aus HTML-Dateien verarbeiten, auf dem Server-Rechner Daten speichern und dort gespeicherte Daten auslesen. Auf diese Weise werden Web-Seiten zu Oberflächen für "Anwendungen", beispielsweise für elektronische Warenbestellung oder zum Abfragen von Datenbanken.

Die so genannte CGI-Schnittstelle steht zur Verfügung, wenn ein Web-Server installiert ist, der CGI unterstützt. Sie können sich selbst auf Ihrem PC lokal einen Web-Server einrichten, um dort eine CGI-Schnittstelle zur Verfügung zu haben. Wenn Sie bei einem Provider auf einem öffentlichen Web-Server im Internet Speicherplatz für eigene Web-Seiten erhalten, können Sie die CGI-Schnittstelle dieses Web-Servers benutzen, um eigene CGI-Scripts im Web einzusetzen. Ihr Provider muss Ihnen allerdings den Zugriff auf die CGI-Schnittstelle ermöglichen. Fragen Sie den Provider im Zweifelsfall danach!

Um die CGI-Schnittstelle nutzen zu können, benötigen Sie Zugriff auf ein bestimmtes Verzeichnis auf dem Server-Rechner, das CGI-Programme enthalten darf. Meist erhält dieses Verzeichnis den Namen cgi-bin. CGI-Programme oder CGI-Scripts werden nur dann ausgefüht, wenn sie in diesem Verzeichnis liegen. Welches das CGI-Verzeichnis sein soll und wie Sie es ansprechen wollen, können Sie beim Einrichten des eigenen Web-Servers festlegen. Je nach Server können Sie auch mehrere CGI-Verzeichnisse einrichten. Bei einem Provider, der Ihnen öffentlichen Web-Speicher mit CGI-Schnittstelle eingerichtet hat, finden Sie das CGI-Verzeichnis bereits vor. Sie brauchen dann nur noch Ihre CGI-Scripts in dieses Verzeichnis hochzuladen (siehe auch CGI-Scripts auf öffentlichem Web-Server installieren).

Die CGI-Schnittstelle ruft nicht nur das jeweils auszuführende Programm auf und leitet dessen Antwort weiter, sondern stellt auch eine Reihe von Daten bereit, die der Web-Server speichert, und die ein CGI-Script auslesen kann (und zum Teil auslesen muss), um Daten verarbeiten zu können. Diese Daten speichert der Web-Server in so genannten CGI-Umgebungsvariablen.

Derzeit liegt die CGI-Schnittstellendefinition in der Version 1.1 vor. Andere Schnittstellen für ausführbare Programme im Web, die von kommerziellen Herstellern wie Netscape oder Microsoft eingeführt wurden, machen der klassischen CGI-Schnittstelle Konkurrenz. Von Netscape stammt beispielsweise die API-Schnittstelle (auch NSAPI genannt), von Microsoft die ISAPI-Schnittstelle. Beide Schnittstellen sind für die Server-Software-Produkte der jeweiligen Hersteller optimiert, erreichen allerdings auch eine Performance bei der Datenverarbeitung, die ein Mehrfaches der CGI-Schnittstelle beträgt. Ein entscheidender Vorteil der CGI-Schnittstelle bleibt jedoch die Tatsache, dass es sich - ähnlich wie bei HTML - um einen kommerziell unabhängigen, kostenlosen und produktübergreifenden Standard handelt.

Die meistbenutzte Programmiersprache für CGI-Scripts ist noch immer Perl. Der Grund dafür ist, dass Perl sehr mächtige Funktionen besitzt, z.B. für Zeichenkettenoperationen oder für das Lesen und Schreiben von Daten. Der Perl-Interpreter, der zum Ausführen eines Perl-Scripts erforderlich ist, ist für fast alle Betriebssysteme als Freeware verfügbar und auf fast allen Server-Rechnern im Web installiert (siehe auch Perl einrichten).

Wenn Sie in einer anderen Programmiersprache, z.B. in C, Pascal oder Visual Basic, bereits viel Erfahrung haben, können Sie auch diese Sprachen für CGI-Programme verwenden. Das Problem bei diesen Sprachen ist, dass der damit erstellte Code erst ausführbar ist, nachdem er für die Betriebssystemumgebung compiliert und gelinkt wurde, unter der er ausführbar sein soll. Wenn Sie beispielsweise ein C-Programm schreiben und dieses Programm als CGI-Programm im Web auf einem Server-Rechner mit Unix-Betriebssystem zum Einsatz bringen wollen, muss das Programm unter Unix compiliert werden. Ein C-Compiler, den Sie vielleicht auf Ihrem DOS/Windows-PC haben, nutzt Ihnen da nichts.

### Beachten Sie:

In diesem Abschnitt wird vorausgesetzt, dass Sie mit HTML vertraut sind und sich auch über grundsätzliche Abläufe bei der CGI-unterstützten Kommunikation zwischen Web-Browser und Server-Rechner im klaren sind. Lesen Sie dazu vor allem den Abschnitt CGI (Common Gateway Interface).

## CGI-Aufrufe aus HTML und HTML-Ausgabe über CGI

HTML und CGI "kommunizieren" in beide Richtungen: es ist einerseits möglich, aus einer HTML-Datei, die gerade am Bildschirm angezeigt wird, ein CGI-Script aufzurufen; anderseits kann ein CGI-Script HTML-Code an den Web-Browser übertragen, den dieser dann am Bildschirm ausgibt.

Ein CGI-Script kann Daten verarbeiten, die von einer HTML-Datei aus beim Aufruf übergeben werden. Zum Beispiel kann ein CGI-Script eine Datenbank durchsuchen, wobei der Anwender den Begriff, nach dem gesucht werden soll, in einem Formular angegeben hat. Die Ergebnisse einer Datenverarbeitung kann ein CGI-Script an den Web-Browser in Form von HTML-Code zurücksenden. So kann ein Script, das eine Datenbank nach Begriffen durchsucht, zum Beispiel die Suchtreffer eines Suchvorgangs in Form einer dynamisch generierten HTML-Datei an den Web-Browser zurücksenden.

CGI-Scripts können auch Daten auf dem Server speichern und zu einem späteren Zeitpunkt auslesen. Auf diesem Prinzip basieren beispielsweise Gästebücher oder Nachrichtenforen (Bulletin-Boards). Ein Anwender kann in einer HTML-Datei in einem Formular einen Beitrag eingeben. Beim Absenden des Formulars wird ein CGI-Script aufgerufen, das den Beitrag in einer Datei speichert. Ein zweites CGI-Script oder ein anderer Aufruf des CGI-Scripts kann anschließend HTML-Code mit allen gespeicherten Beiträgen an einen Web-Browser übertragen.

Ein CGI-Script kann aus einer HTML-Datei heraus auf verschiedene Arten aufgerufen werden:

- über ein Formular. Dabei steht im einleitenden `<form>`-Tag der Aufruf des CGI-Scripts (Beispiel: `<form action="/cgi-bin/guestbook.pl" method="get">`). Der Aufruf erfolgt nach dem Absenden des Formulars. Die vom Anwender eingegebenen oder ausgewählten Daten stehen dem CGI-Script zur Verarbeitung zur Verfügung. Auf diese Weise funktionieren etwa Suchdienste, Gästebücher oder elektronische Einkaufskörbe.
- über Verweise. Es genügt, als URI des Verweisziels das ausführbare CGI-Script anzugeben (Beispiel: `<a href="/cgi-bin/statistik.pl">Tagesstatistik aufrufen</a>`). Dies ist sinnvoll für CGI-Scripts, die keinen "Input" vom Anwender benötigen, sondern lediglich feste Datenausgaben erzeugen, zum Beispiel für ein CGI-Script, das aktuelle Zugriffsstatistiken für Web-Seiten ausgibt.
- über eine Grafikreferenz. Auch dabei genügt es, als URI in der `src`-Angabe des `<img>`-Tags das ausführbare CGI-Script anzugeben (Beispiel: `<img src="/cgi-bin/counter.pl">`). Dabei muss das CGI-Script allerdings eine Grafikdatei im GIF- oder JPEG-Format an den Web-Browser zurücksenden. Die meisten grafischen Zugriffszähler basieren auf diesem Prinzip.
- über eine Server Side Include Anweisung in einer HTML-Datei, z.B. mit der Anweisung `<!-- #exec cgi="/cgi-bin/counter.pl" -->`. Das ist sehr praktisch, um mit Hilfe eines CGI-Scripts dynamische Information in Textform in eine HTML-Datei einzubinden. Diese Form ist zum Beispiel interessant für textbasierte Zugriffszähler.
- über automatisches Laden des ausführbaren CGI-Scripts/CGI-Programms. Dazu geben Sie in dem `<meta>`-Tag einfach anstelle einer anderen HTML-Datei die Adresse des ausführbaren CGI-Scripts an (Beispiel: `<meta http-equiv="refresh" content="0; URL=/cgi-bin/welcome.pl">`).

## Beispiel für die Wechselwirkung zwischen HTML und CGI

Das folgende Beispiel bewirkt einen einfachen CGI-Vorgang, der die Wechselwirkung zwischen HTML und CGI verdeutlicht: in einer HTML-Datei kann der Anwender in einem Formular seinen Namen und einen Kommentartext eingeben. Wenn er das Formular absendet, wird ein CGI-Programm comments.pl aufgerufen. Dieses Script ist in Perl geschrieben. Es liest die ankommenden Formulardaten ein, splittet sie in ihre Bestandteile auf und erzeugt eine vollständige HTML-Datei, in der es die eingelesenen Daten ausgibt. Der Web-Browser zeigt diesen von comments.pl generierten HTML-Code am Bildschirm an. Studieren Sie das Beispiel in Ruhe und verzweifeln Sie nicht an dem Perl-Programmcode (es geht nämlich auch einfacher als in diesem Beispiel gezeigt, das Beispiel dient nur dazu um zu zeigen wie das CGI-Script an die Formulardaten kommt)!

### Beispiel: HTML-Datei mit CGI-Aufruf

Anzeigebeispiel: So sieht's aus (beim Absenden des Formulars ist eine Internetverbindung erforderlich)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Kommentarseite</title>
    </head>
    <body bgcolor="#E0E0E0">
    <h1>Ihr Kommentar</h1>
    <form action="/cgi-bin/comments.pl" method="post">
    <p>Name:<br><input size="40" maxlength="40" name="AnwenderName"></p>
    <p>Text:<br><textarea rows="5" cols="50" name="Kommentartext"></textarea></p>
    <p><input type="submit" value="Absenden"></p>
    </form>
    </body>
    </html>

### Beispiel: CGI-Script comments.pl mit HTML-Ausgabe

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    read(STDIN, my $Daten, $ENV{'CONTENT_LENGTH'});
    my @Formularfelder = split(/&/, $Daten);
    my ($Feld, $Name, $Wert);
    my %Formular;
    foreach $Feld (@Formularfelder) {
      (my $Name, my $Wert) = split(/=/, $Feld);
      $Wert =~ tr/+/ /;
      $Wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $Wert =~ s/</&lt;/g;
      $Wert =~ s/>/&gt;/g;
      $Formular{$Name} = $Wert;
     }
    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
    print "<html><head><title>CGI-Feedback</title></head>\n";
    print "<body><h1>CGI-Feedback vom Programm <i>comments.pl</i></h1>\n";
    print "<p><b>Name:</b> $Formular{AnwenderName}</p>\n";
    print "<p><b>Kommentartext:</b> $Formular{Kommentartext}</p>\n";
    print "</body></html>\n";

### Erläuterung:

In der HTML-Datei wird ein Formular mit zwei Eingabefeldern definiert. Das erste Feld (`<input size="40" maxlength="40" name="AnwenderName">`) ist ein einzeiliges Eingabefeld, in dem der Anwender seinen Namen eingeben soll. Das zweite Feld (`<textarea rows="5" cols="50" name="Kommentartext"></textarea>`) ist ein mehrzeiliger Eingabebereich, in dem der Anwender einen beliebigen Text eingeben kann. Durch Klicken auf den Absendebutton (`<input type="submit" value="Absenden">`) wird das Formular abgesendet. Was mit den Formulardaten geschehen soll, ist im einleitenden Formular-Tag angegeben: mit der Angabe `action="/cgi-bin/comments.pl"` wird ein CGI-Script aufgerufen, das die abgesendeten Formulardaten verarbeiten soll. Die Daten werden dem CGI-Script mit `method="post"` übergeben. Das bedeutet, das Script bekommt die Daten von der Standardeingabe als Parameter übergeben. Das ist genau so, wie wenn Sie ein Programm auf Ihrem Rechner mit einem Parameter, etwa dem Namen einer zu öffnenden Datei, aufrufen.

mit der Anweisung `read(STDIN, my $Daten, $ENV{'CONTENT_LENGTH'});` werden im Perl-Script comments.pl, das im CGI-Verzeichnis liegt, die Daten der Standardeingabe eingelesen.
Mit der Anweisung `@Formularfelder = split(/&/, $Daten);` splittet das Script die eingelesenen Daten nach Formularfeldern getrennt in einzelne Elemente auf. Innerhalb der darauffolgenden `foreach`-Schleife bearbeitet das Script die Daten. Die ziemlich kryptisch anmutenden Befehle dienen dazu, die übergebenen Daten in lesbaren Text umzuwandeln. Denn die Daten, die das Script empfangen hat, sind nach einer bestimmten Konvention kodiert, die mit dem Mime-Type `application/x-www-form-urlencoded` gekennzeichnet wird. In diesem Kodierungstyp werden Leerzeichen und Satz- sowie Sonderzeichen durch hexadezimale Umschreibungen dargestellt (siehe auch Datenstrom bei Übertragung von Formulardaten.

Nach der Dekodierungsarbeit beginnt das Script mit dem Erzeugen der HTML-Datei, die es an den Web-Browser zurücksendet. Dazu dienen die `print`-Anweisungen, die eine normale HTML-Datei konstruieren. Im Beispiel gibt das Perl-Script die Inhalte der beiden Formularfelder HTML-formatiert im Browser aus.

Aus Sicht des Anwenders verschwindet nun die HTML-Datei mit dem Eingabeformular vom Bildschirm. Stattdessen baut der Web-Browser eine neue Seite auf, die den von `comments.pl` erzeugten HTML-Code enthält.

### Beachten Sie:

Das obige Beispiel ist lediglich zur Veranschaulichung der Wechselbeziehung zwischen HTML und CGI gedacht. Wenn Sie sich bislang noch nie mit Perl beschäftigt haben und Ihnen das Perl-Script völlig unverständlich vorkommt, ist das ganz normal. Perl ist eine mächtige, aber ziemlich eigenwillige Programmiersprache. Im Verlauf dieses Kapitels lernen Sie mehr über die einzelnen Befehle. Es gibt auch Techniken wie das CGI-Modul, das die CGI-Programmierung mit Perl erleichtert.

| Webserver lokal auf einem PC einrichten
| Bilderbuch zum Umblättern

© 2001 selfhtml@teamone.de