| Es gibt mehrere unterschiedliche Möglichkeiten, um Daten (Argumente, Parameter) an CGI-Programme zu übergeben. | Die POST-Methode bietet mehr Sicherheit, aber weniger Übersicht als die häufiger verwendete GET-Methode |
CGI
|
Common Gateway Interface - Programme (GET-Methode) |
| Demo-Formular | Anwendung der POST-Methode mit HTML-Formularen |
| Validierung | Parameter testen, allenfalls richtigstellen |
| Buttons | HTML-Buttons |
| Quellcode | Muster für die Annahme von POST-Parametern |
| Umgebungs-Variable | Information über das Programm-Umfeld |
| Perl-Parameter | Übernahme und Decodierung von Parametern in Perl |
| HTML-Links | Verwendung von <a href="..."> zur Übergabe von POST-Parametern |
| Javascript | Verwendung von Javascript zur Übergabe von POST-Parametern |
Übergabe von POST-Parametern mit HTML-<form>ularen
|
|
| Damit ein CGI-Programm auf unterschiedliche Anforderungen reagieren kann, muss es Argumente (Parameter) zu seiner Steuerung annehmen, z.B. Texte, Zahlen, Optionen etc. | Der normale Weg, AnwenderInnen-Wünsche an den Webserver zu übergeben, sind HTML-Formulare: Tragen sie ihre Text-Spende ein und senden sie das ausgefüllte Formular durch Klick auf einen der Buttons ab. |
|
Dieses Beispiel startet ein Perl CGI-Script-Programm.
<form name="fpp" method="post" action="/cgi-bin/perlpost.pl">
<input type="text" name="spende1">
</form>
Text-Spende <input type="submit" name="Submit" value="Absenden"> |
Hier das gleiche Formular, jedoch für die Anforderung eines
mit C++ erstellten CGI-Programms
<form name="fpc" method="post"
action="/cgi-bin/cpppost">
<input type="text" name="spende2">
</form>
Text-Spende <input type="submit" name="Submit" value="Absenden"> |
|
+ Beiden Formularen gemeinsam ist die Anforderung der POST-Methode
mit dem Attribut method="post" + Das Attribut action definiert das Zielprogramm. + Geben sie jedem Formular mit dem Attribut name einen eindeutigen Namen. |
+ Sie können beliebig viele Formulare in eine Webseite einbauen. + Mit Klick auf den submit-Button wird die Anforderung an den Webserver abgesendet. Sie können das Formular jedoch auch mit <button>s oder mit Javascript absenden. |
|
|
Vergleichen sie nach dem Absenden des Formulars die Browser Adresszeile mit den Beispielen der GET-Methode. |
Validierung - vor dem Absenden ! |
|
Validierung:In fast jedem Fall müssen sie übergebene Parameter validieren, d.h. ihre Gültigkeit feststellen und falls benötigt darauf reagieren. |
♦ Details zur Validierung (allgemein - mit Javascript) auf der Seite der CGI-GET-Methode. |
HTML-<button>s |
|
|
An Stelle der veralteten Submit-Buttons verwenden sie besser
das <button>-Element.
Damit kann man nicht nur Formulare senden, sondern vor dem Absenden noch eine
Validierung der eingetragenen Argument-Daten mit Javascript durchführen. ♦ Details zu HTML-Buttons auch auf der Seite der CGI-GET-Methode. |
sendet das HTML-Formular dieser Seite. HTML-Quellcode für diesen Button:
<button onclick="document.fpc.submit()">
</button>
|
Quellcode der POST-Demo-CGI |
|
|
Quelltext des Perl-CGI-Programms perlpost.pl
#!/usr/bin/perl
print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n<title>POST</title>\n</head>\n"; print "<body>\n"; print "<h2>CGI perlpost.pl</h2>\n"; $method=$ENV{'REQUEST_METHOD'}; print "REQUEST_METHOD: $method<br>\n"; if ($method eq "POST") {
$buffer=$ENV{'CONTENT_LENGTH'};
}print "CONTENT_LENGTH = $buffer <br>\n"; $qs=""; for($i=0;$i<$buffer;$i++) {$qs.=getc;} print "STDIN: $qs <br>\n"; print "</body>\n"; print "</html>\n"; Ihre CGI-Programme sollten sich nicht darauf verlassen, dass sie mit einer bestimmten Methode aufgerufen werden. Programmieren sie sauber und bestimmen sie die Methode der Parameter-Übergabe aus den Umgebungs-Variablen. Perl bietet übrigens eine bequeme Funktion für Übernahme und Decodierung der Parameter, unabhängig von der Methode: |
Quelltext des C++ CGI-Programms cpppost.cpp
#include <unistd.h>
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) {
char *method,*qs;
}
printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n<title>GET</title>\n</head>\n"); printf("<body>\n"); printf("<h2>CGI cppget</h2>\n"); method = getenv("REQUEST_METHOD"); printf("REQUEST_METHOD: %s <br>\n",method); if(strncmp("GET",method,3)==0) {
qs = getenv("QUERY_STRING");
}printf("QUERY_STRING: %s <br>\n",qs); printf("</body>\n"); printf("/<html>\n"); return 0; |
Umgebungs-Variable |
|
| Der Webserver verfügt über einige Informationen zu seiner Umgebung. Diese sind für Programme in Form von Umgebungs-Variablen verfügbar. Beim Aufruf eines CGI-Programms vererbt der Webserver einen Satz seiner Umgebungs-Variablen an das CGI-Programm. |
Einige Umgebungs-Variable werden zur Übergabe der Parameter verwendet. Alle Programmiersprachen bieten Möglichkeiten zum Lesen der Umgebungs-Variablen. |
| Bei der POST-Methode werden die Parameter in Strom der Eingabedaten übergeben. Bei Konsolen-Programmen sind das jene Daten, die sie auf der Tastatur eingeben. Bei CGI-Programmen sendet der Webserver die Parameter über diesen (input)-Strom. | |
PerlDie Umgebungs-Variablen sind im Hash %ENV enthalten: |
C++Funktion getenv liefert die Umgebungs-Daten. |
$ENV('REQUEST_METHOD')Diese Umgebungs-Variable enthält die zur Parameter-Übergabe verwendete Methode (GET, POST).Durch Abfrage dieser Variablen erfährt das Perl-Programm, mit welcher Methode es aufgerufen wurde. |
Variable "REQUEST_METHOD"
enthält auch hier die angewendete Methode (GET, POST).Die Funktion getenv() aus <stdlib.h> bietet Zugang zu den Umgabungs-Variablen: |
|
$ENV('CONTENT_LENGTH')
enthält die Länge (Anzahl bytes) im Strom der
Eingangsdaten STDIN. Wenn sie die Länge kennen, können
sie ebenso viele bytes mit getc von STDIN
übernehmen.
|
Variable "CONTENT_LENGTH"enthält die Länge im Strom der Eingangsdaten. Wenn sie die Länge kennen, können sie ebenso viele bytes vom input übernehmen.Achtung: diese Daten sind nicht (z.B. mit einem null-byte) terminiert ! Natürlich muss der Parameter-Text auch in C++ zur Verarbeitung decodiert werden. |
POST-Methode mit Javascript |
|
| Javascript bietet auf Client-Seite mehrere Möglichkeiten, um POST-Parameter zu übergeben. | Im Gegensatz zur GET-Methode ist es jedoch nicht möglich, die Argumente ohne Verwendung eines Formulars direkt als String zu senden. |
|
Damit sie Javascript nutzen können, darf der submit-
Vorgang nicht von einem <input
type="submit">-Button ausgelöst werden. Am besten ist
es,
<button>-Elemente zu verwenden und mit Hilfe von
onclick-Events
ein Javascript-Programm aufzurufen. Im einfachsten Fall enthält dieses nur
den submit-Befehl.
document.fpc.submit();
( Ersetzen sie fpc durch den Namen ihres Formulars ! )Sehen sie rechts, wie sie in Javascript den aktuellen Wert (value) jedes Eingabefelds (hier: spende2) lesen können. Das ist die Voraussetzung für eine Validierung. Als Beispiel für eine Änderung wird das aktuelle Datum des Clients in das Formular-Feld geschrieben. |
function post_test1() {
// Formfeld lesen:
// wert = fpc.spende2.value;
wert=new Date();
// Validierung hier einfügen ! // Formfeld schreiben:
document.fpc.spende2.value=wert;alert(wert+" wird abgesendet"); // Form absenden:
document.fpc.submit();
|
|
Javascript-Anforderung mit einem HTML-Link:
So können sie jedes Javascript-Programm (hier: post_test1)
mit einem HTML-Link aufrufen. In () können sie auch Argumente übergeben.Falls sie evtl. andere targets verwenden als die aktuelle Webseite (z.B., in frames), sollten sie in den Links das Attribut target="_self" setzen ! Derartige Links werden meist an <img>-Buttons gebunden - Damit sind sie von den eher langweiligen HTML-Buttons unabhängig. |
<a href="javascript:post_test1()" target="_self">
</a>
|
|
Versteckte Formulare:
Sie können HTML-Formulare verwenden, ohne dass diese sichtbar sind:Daten wie bei der JS-Funktion post_test1 gezeigt in das Formular eintragen, dann absenden. Diese Methode eignet sich dann, wenn ihr Javascript-Programm die Parameter bereits kennt. |
<form name="fph" method="post"
action="/cgi-bin/perlpost.pl">
<input type="hidden" name="date">
</form>
<input type="hidden" name="time"> |
|