CGI leicht gemacht!
oder: Wie schreibe ich CGI-Skripts um mit Web-Forms umgehen zu können
Stell Dir vor, es ist 16:00 Uhr, und Dein Chef will um 16:30 ein fertiges CGI-Skript sehen. Du weißt bisher nichtmal, was CGI bedeutet.
Hier bist Du richtig!
Ein CGI-Skript ist nichts besonderes, abgesehen von dem Hype, der daraus gemacht wird. Wenn Du von STDIN lesen und auf STDOUT schreiben kannst, kannst Du auch CGI-Skripts schreiben. Wenn Du ein bischen Programmieren kannst, wirst Du in ein paar Minuten CGI-Skripts schreiben können. Wenn Du überhaupt nicht programmieren kannst, wirst Du hier nicht viel Hilfe finden - sorry. Lerne irgendeine Sprache (und sei es AppleScript) und komm wieder, wenn Du soweit bist. Viel Glück!
Diese Kurzanleitung konzentriert sich auf die Verarbeitung von HTML-Forms. Einige Details werden nicht behandelt, dafür kommt man um so schneller zum Ziel und deckt 90% der üblichen Anwendungen ab. Bei mehr Interesse guck Dir mal die offiziellen CGI Specs an. Für Hilfe bei der Erstellung von HTML-Forms empfehle ich die Dokumentation der NCSA.
Wenn Du Dich durch diese Seite durchgearbeitet hast, guck Dir noch meine Anmerkungen an.
Was ist CGI?
CGI ist keine Sprache. CGI ist ein simples Protokoll, das man zum kommunizieren zwischen HTML-Forms und einem Programm nutzen kann. Ein CGI-Skript kann in jeder Sprache geschrieben sein - solange sie das Lesen von STDIN, das schreiben auf STDOUT erlaubt und Environment-Variablen lesen kann. (C, Perl, AppleSkript...)
Struktur eines CGI-Skript
Dies sind die typischen Schritte eines CGI-Skripts:
-
Lies die vom User erzeugten Daten
-
Mach mit den Daten, was Dir so einfällt
-
Schreibe eine Antwort in HTML auf STDOUT.
Der erste und der letzte Schritt sind unten beschrieben - den Rest macht das Programm.
Das Lesen der vom User erzeugten Daten
Wenn der User seine Daten übermittelt (Submit-Knopf), erhält Dein Skript alle erzeugten Daten als einen Satz von Name-Wert-Paaren. Der Name ist jeweils der, den Du beim INPUT-Tag festgelegt hast (Oder halt beim SELECT- oder TEXTAREA-Tag), die Werte sind das, was der User eingetragen (oder gewählt) hat.
Dieser Satz von Name-Wert-Paaren (klingt bescheuert!) wird in einem langen String übermittelt, den Dein Programm aufdröseln muß. Das ist nicht sehr kompliziert, und es gibt tausende fertige Routinen dazu. Hier ist eine in Perl, eine einfachere in Perl und eine in C. Das CGI-Directory von Google hat etliche CGI-Routinen und Skripts in den unterschiedlichsten Sprachen.
Wenn Dir das reicht, überspringe den nächsten Abschnitt. Wenn Du es selber machen willst oder neugierig bist siehst Du hier, wie der String aufgebaut ist:
name1=wert1&name2=wert2&name3=wert3
Du mußt den String also einfach beim Kaufmanns-Und und an den Gleichheitszeichen in Stücke schneiden. In den entstandenen Häppchen muß man
alle "+" in Leerzeichen wandeln und
alle "%xx"-Sequenzen in einzelne Buchstaben mit dem ASCII-Wert "xx" wandeln. (Beispiel: "%3D" wird "=")
Das kommt daher, das der übermittelte String in der URL codiert ist. Dem User muß aber die Möglichkeit Kaufmanns-Unde (?) und Gleichheitszeichen übergeben zu können gegeben bleiben.
Wo kriegt man diesen ominösen, langen String nun her? Das hängt von der Methode ab, mit der die HTTP-Form übermittelt wurde:
Bei GET-Übermittlungen liegt er in der Environment-Variable QUERY_STRING.
Bei POST-Übermittlungen muß man ihn von STDIN lesen. Die genaue Anzahl übermittelter Bytes steht dabei in der Variablen CONTENT_LENGTH.
(Wenn Du Dich nach den Unterschieden von GET und POST fragst, findest Du in meinem Anmerkungen mehr darüber. Kurzantwort: POST ist wesentlich universeller (und etwas schicker), GET arbeitet bei kleinen Forms aber ganz wunderbar.)
Dem User eine Antwort ausgeben
Als erstes gibt man die Zeile
Content-Type: text/html
gefolgt von einer Leerzeile (!) auf STDOUT aus. Nun lässt man eine normale HTML-Antwort folgen, die man ebenfalls auf STDOUT ausgibt. Wenn das Skript beendet ist, sieht der User die so erzeugte Seite.
Ja, man muß richtigen HTML-Quelltext auf STDOUT ausgeben. Das ist nicht schwer: Es ist sogar ziemlich einfach. HTML ist extra als so simpel entwickelt worden, daß man so etwas problemlos hinkriegt.
Wenn Dein Skript statt HTML ein Bild oder andere Binärdaten zurückgeben soll, erfährst Du wieder in meinen Anmerkungen, wie man das macht.
Das wars. Viel Glück!
Hast Du gesehen, wie einfach das ist? Wenn Du mir immernoch nicht glaubst, fang an und schreib ein Skript. Tu es auf Deinem Server ins richtige Verzeichnis und mach es ausführbar - mehr Tips findest Du in den Anmerkungen.
Es wäre unfair, Dich ohne ein paar Hinweise auf die Sicherheitsaspekte von CGI-Skripts zu entlassen.
Wenn Du mehr über CGI wissen willst, besuche mal die komplette CGI-Spezifikation der NCSA. Das W3C hat auch eine CGI-Seite mit Links zu allen möglichen Seiten.
Interessante Hinweise und Details
Auf der Anmerkungsseite findest Du mehr zu folgenden Themen: