Blue Ribbon Campaign for Free SpeechCGI leicht gemacht!

oder: Wie schreibe ich CGI-Skripts um mit Web-Forms umgehen zu können

In English (auf Englisch)
En español (auf Spanisch), übersetzt durch René Alvarez
Em português (auf Portugiesen), übersetzt durch Claudio F. Chagas
In het Nederlands (auf Niederländisch), übersetzt durch Simon Amstel

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:

  1. Lies die vom User erzeugten Daten
  2. Mach mit den Daten, was Dir so einfällt
  3. 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 Yahoo 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

  1. alle "+" in Leerzeichen wandeln und
  2. 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:

(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 mußt, dann schau dir die CGI-Spezifikation bei NCSA. Auch W3C unterhält eine CGI-Seite mit Verweisen auf Dokumente, die du brauchen könntest.

Oh ja, CGI steht für Common Gateway Interface - mit anderen Worten für eine Standardschnittstelle ("Common Interface") zwischen unterschiedlichen Prozessen (einer Art "Gateway").


Interessante Hinweise und Details

Auf der Anmerkungsseite findest Du mehr zu folgenden Themen:

  1. CGI-Beispiel-Programme
  2. CGI Mailer Skript
  3. Sicherheit und CGI-Skripts
  4. Das Skript auf den Server bekommen
  5. Ein vorhandenes File als Antwort senden
  6. Weitere nützliche CGI-Environment-Variablen
  7. Ein Bild (oder andere Binärdaten) als Antwort ausgeben
  8. Der Unterschied zwischen GET und POST


© 1996 James Marshall, übersetzt 1997 durch Friedemann Wachsmuth (comments encouraged)