Programmieren mit C++

Allgemeines

Objekt Orientierte Programmierung

Kommunikation mittels CGI

Was ist CGI und wie erfolgt die Zusammenarbeit mit dem HTTP-Server?

Frage

CGI (Common Gateway Interface) ist ein Interface, das verwendet wird, um Programme unter Steuerung eines (HTTP-) Servers ablaufen zu lassen. In der Hauptsache werden CGI-Scripts für das Auswerten der aus den Formularen (FORMS) von HTML-Seiten erhaltenen Daten sowie der Erzeugung von HTML-Antwortseiten eingesetzt. Das CGI-Script greift dabei oft auf serverseitige Datenbanken zu. Geschrieben sind CGI-Scripts in PERL, C++, TCL und neuerdings auch Delphi.

Lösung

Wird in der FORM einer HTML-Seite die Methode GET verwendet, stellt der HTTP-Server dem CGI-Script die Daten des Formulars in einer Kette von name=wert-Paaren in einer Umgebungsvariablen QUERY_STRING bereit. Bei Verwendung von POST im Formular der HTML-Seite liest das CGI-Script die Eingaben aus der Standardeingabe.

CGI

Für Windows gibt es eine spezielle Realisierungsform des CGI – das WIN-CGI. Die HTTP-Server benutzen WinExec() oder CreateProcess(), um das in der ACTION-Anweisung des Formulars angeforderte Programm bzw. das zu aktivierende CGI-Script zu starten. Über eine Synchronisation mit diesem Programm durch WaitForSingleObject() überwacht der Server, ob das Programm noch läuft oder ob es schon beendet ist. Die Kommandozeile für den Start des Programmes hat den folgenden Aufbau:

Programmname CGI-Datenfile

Anzutreffen ist jedoch auch

WIN-CGI

Programmname CGI-Datenfile Eingabefile Ausgabefile URL-Daten

Da im CGI-Datenfile auch die Informationen über Eingabefile, Ausgabefile und URL-Daten enthalten sind, sollte man bei der Realisierung des CGI-Scriptes alle benötigten Informationen dem CGI-Datenfile entnehmen.

Das zu startende Programm muss nicht unbedingt eine EXE sein. Es könnte sich auch um den Namen eines Dokumentes handeln, das mit einer Anwendung verknüpft ist.

Die Arbeitsweise soll an einem Beispiel erläutert werden. Das Formular in der rufenden HTML-Seite lautet dazu:

Name:
Alter:
Bemerkung:

Dieses einfache Formular enthält Eingabefelder für Name, Alter und Bemerkung sowie einen Submit-Button. Das Drü-cken des Submit-Buttons löst die Übertragung der eingegebenen Daten an den HTTP-Server aus. Die angeforderte TEST.EXE wird vom Server dann z.B. mit der folgenden Kommandozeile gestartet:

TEST.EXE c:\app\800WS.INI .

Die im Verzeichnis c:\app liegende 800WS.INI wurde vom HTTP-Server erzeugt und kann jetzt durch das CGI-Script gelesen werden. Der Aufbau der 800WS.INI könnte im Beispiel folgendermaßen aussehen, wobei mehrere Sektionen die Informationen strukturieren.

Die CGI-Sektion übergibt zunächst allgemeine Informationen:

[CGI]
Request Protocol=HTTP/1.0
Request Method=POST                    ;Verwendete Request-Methode
Request Keep-Alive=No
Document Root=c:\app\docs\
Executable Path=/cgi-win/test.exe
Query String=GetInformation            ;Query-StringServer Software=WebSite/1.1e
Server Name=jersey
Server Port=80
Server Admin=
CGI Version=CGI/1.3 (Win)                                   Verwendete CGI-Version
Remote Address=139.30.16.226
Referer=http://dummy/test/cgitest.htm  ;Adresse der HTML-Seite, 
                                       ;von der der Aufruf kam
User Agent=Mozilla/3.0 (WinNT; I)
Content Type=application/x-www-form-urlencoded
Content Length=96

Die „System“-Sektion enthält die wichtigen Parameter für Output und Content.

[System]
GMT Offset=3600
Debug Mode=No
Output File=c:\app\800ws.out 
Content File=c:\app\800ws.inp

„Output File“ spezifiziert den Namen der Datei, in die das CGI-Script die Antwortseite schreiben soll, während die Datei in „Content File“ die erhaltenen Daten in nicht interpretierter Form enthält.

Die Sektion „Form Literal“ enthält die Parameter der Anwendereingaben für die Eingabefelder der HTML-Seite.

[Form Literal]
Name=Meier
Alter=33

In Abschnitt „Form External“ sind die Parameter enthalten, die vom Server auf Grund ihrer Größe in einer Extra-Datei abgelegt werden. Dazu gehören alle Parameter, deren Länge 254 Zeichen überschreitet oder die entsprechende Steuerzeichen enthalten. Sie werden grundsätzlich als Datei abgelegt.

[Form External] 
Bemerk=c:\app\800ws.000 56

Im obigen Beispiel werden die Bemerkungen in der Datei „c:\app\800ws.000“ abgelegt, wobei die Datei eine Länge von 56 Bytes besitzt.

Die Abschnitte „Accept“ und „Extra Headers“ enthalten weitere Informationen, die hier zunächst nicht von Bedeutung sind.

[Accept]
image/gif=Yes
image/x-xbitmap=Yes
*/*=Yes
 
[Extra Headers]
Host=dummy

Beim Lesen der aus der Form übergebenen Parameter ist zu beachten, dass das Bemerkungsfeld hier vom Server in einer gesonderten Datei (800ws.000) abgelegt wurde und in der Sektion [Form External] erscheint. Wird in das Bemerkungsfeld des Formulars jedoch nur eine Zeile eingegeben, würde das Feld ‘Bemerk’ wie die anderen Parameter in der Sektion [Form Literal] enthalten sein.

In einer hier nicht existierenden „Form Huge“-Sektion können Einträge der Form

[Form Huge]
key=Offset Länge

enthalten sein. Hier würde es sich um Eingaben mit mehr als 65535 Byte Länge handeln. Der ‘Offset’ würde in diesem Fall der Beginn des Parameters im ContentFile sein und ‘Länge’ die Länge des erhaltenen Parameters.

Wichtig ist es, dass das CGI-Script noch vor Überschreitung des Zeitlimits eine Antwortseite unter dem hier geforderten Namen 800WS.OUT in c:\apps ablegt und sich beendet.

Das Auslesen der CGI-Parameter aus der INI-Datei erfolgt dann wie ein normaler Zugriff auf eine INI-Datei. Alternativ können die Parameter jedoch auch über sogenannte Umgebungsvariable übergeben werden, auf die Beitrag 5/2.9.2.2 eingeht.

Zeitlimit

Wie erfolgt eine Kommunikation zwischen den Internet-Clients und den CGI-Scripts auf dem Server?

Frage

Das CGI stellt den wohl ältesten und verbreitetsten Standard zur Realisierung von Aktivitäten auf Serverseite dar. Weiterentwicklungen des CGI resultierten schließlich in zwei (Firmen-) Standards:

  • NSAPI (Netscape Server API) wurde entwickelt für Netscape Webserver (Enterprise, Fast Track, etc.). Die Grundfunktionen des Netscape-Servers können angepasst oder erweitert werden, um spezifische Funktionalität bereits in den Server zu verlegen.
  • ISAPI( Internet Server API) wurde entwickelt für Microsoft Internet Information Server. Programme, die für das ISAPI-Interface geschrieben wurden, werden als DLLs permanent in den Hauptspeicher geladen und können so schneller ausgeführt werden als CGI-Programme.

Lösung

Um dem Benutzer die Möglichkeit zu geben, durch das Treffen von Selektionen oder die Eingabe von Werten innerhalb einer HTML-Seite bestimmte Folgeaktionen auf der Serverseite auszulösen, wurde HTML mit einer Reihe von Schlüsselworten ausgestattet, durch die Formulare realisiert werden.

Bestandteile eines Formulars in einer HTML-Seite sind:

  • Auswahllisten, Radiobuttens, Checkbuttons, einfache und mehrzeilige Text-Eingabefelder
  • Submit-Button; sein Anklicken ist für den Browser das Zeichen, mit der Übertragung der Daten aus dem Formular an den Server zu beginnen.
  • Reset-Button; er kann im Formular nützlich sein, um den Browser anzuweisen, alle Eingabefelder zu löschen bzw. auf ihren Initialzustand zurückzusetzen.

Die Datenübergabe an ein Script auf dem Server erfolgt durch Drücken des Submit-Buttons in der HTML-Seite beim Client. Damit werden die Daten von der Clientseite zum HTTP-Web-Server übertragen.

Die Daten eines Formulars werden vom Browser auf Client-Seite über die gleiche Verbindung, über die auch das Laden der HTML-Seite vom Server erfolgte, an die auf Serverseite aktive HTTP-Web-Server-Software geschickt. Die Daten können auch an einen anderen Web-Server im Internet gehen, was allerdings in der Praxis selten auftritt. Gesteuert wird dies über das „action“-Attribut.

Der Web-Server wird im Regelfall zusammen mit den Daten der HTML-Seite den Auftrag zur Aktivierung eines Scripts erhalten. Läuft auf der Server-Maschine Windows (Win95/ WinNT) als Betriebssystem, könnte dieses Script eine EXE- oder DLL-Datei sein. Der Web-Server übergibt dem Script die von der HTML-Seite erhaltenen Daten.

Das Script wertet die übergebenen Daten aus und übergibt an den Web-Server die Ergebnis-(HTML)-Seite zurück, die dieser an den Client überträgt. Im Browser erscheint dann die Antwortseite.

Dateneingabe auf Client-Seite

Wie könnte ein Formular mit CGI-Support aussehen?

Frage

Das Formular ist ein HTML-Dokument, das zunächst einen ganz normalen Header enthält.



 Ein Formular  

Im Textkörper wird zunächst eine Überschrift im H1-Überschriftsformat mittig auf der HTML-Seite platziert.


Mein erstes Formular !

Das Schlüsselwort FORM steht für den Beginn der Formulardefinition, wobei das Attribut POST angibt, dass die Daten des Formulars in einer gesonderten Datei an den HTML-Web-Server übergeben werden. Bei Angabe von „GET“ als Methode würden die Daten im Anhang an die URL übergeben. Im Allgemeinen sollte jedoch POST der Vorzug gegeben werden.

Das Schlüsselwort ACTION legt fest, welche Aktion nach Drücken des Sendebuttons (Submit) ausgeführt werden soll. Im vorliegenden Beispiel wird die beisp.exe als CGI-Script gestartet, die sich auf dem Server www.servx.com im Verzeichnis cgi-win befindet. Diese sollte die Daten übernehmen und eine Antwortseite generieren.

Der HTML-Tag INPUT kennt drei Attribute:

Attribut

Bedeutung

TYPE

Art des Eingabefelds. Mögliche Werte sind:

TEXT alphanumerische Eingaben

CHECKBOX einzelne Checkbox

RADIO (mehrere zusammengehörende) Radiobuttons

SUBMIT Schalter zum Auslösen der Aktion

RESET Schalter zum Zurücksetzen der Eingaben

NAME

Bezeichner, unter dem CGI das Eingabefeld adressiert.

VALUE

Eingabewert, der eine Vorbelegung haben kann bzw. bei Schaltern die Beschriftung festlegt.

Die beiden folgenden Eingabefelder erfragen den Namen und das Alter in alphanumerischen Eingabefeldern.

Geben Sie Ihren Namen ein : 

Ihr Alter:

Radiobuttons, die zu einer Auswahlgruppe zusammengehören, besitzen den gleichen Parameternamen (hier: „GROSS“). Über das Schlüsselwort „CHECKED“ kann bzw. sollte eine der Alternativen vorausgewählt werden.


Stufen Sie Ihre Größe ein:
ich bin klein: ich bin mittelgroß: ich bin groß:

Jede Checkbox hat einen eigenen Namen. Der bei VALUE angegebene Wert wird nur dann an den Server übergeben, wenn die Checkbox angeklickt ist.

Über das Schlüsselwort „CHECKED“ können einzelne Checkboxen als Vorgabe markiert werden.

Lösung


Beschreiben Sie sich, indem Sie zutreffende Kästchen ankreuzen:
fleissig klug sportlich

Für längere Eingaben kennt HTML das Tag „TEXTAREA“. Es besitzt drei Attribute:

Attribut

Bedeutung

NAME

Bezeichner, unter dem CGI das Eingabefeld adressiert.

ROWS

Anzahl der Zeilen für das Eingabefeld

COLS

Anzahl der Spalten für das Eingabefeld


Geben Sie Ihre Bemerkungen ein:

Der SUBMIT-Schalter hat die Beschriftung „OK“ und löst bei Anklicken die im FORM-Tag in Attribut „METHOD“ angegebene Aktion aus. Dies ist entweder „POST“ oder „GET“.


Das Anklicken des Schalters „Rücksetzen“ führt zum Rücksetzen der Inhalte der Eingabefelder auf den Initialwert.


Das Ende des Formulars markiert das entsprechende Tag sowie die abschließenden Tags für den Textkörper und das HTML-Dokument.

        
  
  

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 WWW-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 WWW-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 WWW-Browser zurücksenden. CGI-Scripts können auch Daten auf dem Server speichern und zu einem späteren Zeitpunkt auslesen. 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 URL-Adresse 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 WWW-Seiten ausgibt.
  • über eine Grafikreferenz. Auch dabei genügt es, als URL-Adresse 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 WWW-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 im <meta>-Befehl einfach anstelle einer anderen HTML-Datei die URL-Adresse des ausführbaren CGI-Scripts an (Beispiel: <meta http-equiv="refresh" content="0; URL=/cgi-bin/welcome.pl">).

Datenstrom bei Übertragung von Formulardaten

Ein typisches HTML-Formular besteht aus benannten Feldern (z.B. für Name, E-Mail-Adresse und Kommentartext). Bei der Übertragung eines ausgefüllten Formulars an den Server-Rechner bzw. ein CGI-Programm müssen die Daten so übertragen werden, dass es dem CGI-Script möglich ist zu erkennen, aus welchen Feldern das Formular besteht und welche Daten der Anwender in welches Feld eingetragen hat. Deshalb gibt es eine bestimmte Kodierungsmethode, die Formularfelder und deren Daten voneinander trennt.

Diese Kodierungsmethode benutzt folgende Regeln:

  • Die einzelnen Formularelemente inklusive ihrer Daten werden durch ein kaufmännisches & voneinander getrennt.
  • Name und Daten eines Formularelements werden durch ein Istgleichzeichen = voneinander getrennt.
  • Leerzeichen in den eingegebenen Daten (z.B. bei mehreren Wörtern) werden durch ein Pluszeichen + ersetzt.
  • Alle Zeichen mit den ASCII-Werten 128 bis 255 (hexadezimal 80 bis FF) werden durch eine Hexadezimalzeichenfolge umschrieben, eingeleitet durch ein Prozentzeichen % und dahinter der Hexadezimalwert des Zeichens (z.B. wird der deutsche Umlaut ö durch %F6 umschrieben).
  • Alle Zeichen, die in diesen Regeln als Steuerzeichen vorkommen (also &, +, = und %) werden ebenfalls hexadezimal umschrieben, und zwar genau so wie höherwertige ASCII-Zeichen.

Das nachfolgende Formular stellt drei Felder dar, die Eingaben aufnehmen können.

Name:   
E-Mail: 
Text:   

Hieraus resultiert der Datenstrom:

AnwenderName=Dietmar+B%FCckart&AnwenderMail=DB@Alojado.de& Text=Test+Text





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:29:04 von textarchiv.alojado.de