POST - Methode

Parameter-Übergabe an CGI-Programme

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
Zur GET-Seite 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">
Text-Spende
<input type="submit" name="Submit" value="Absenden">
</form>
  Text-Spende  
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">
Text-Spende
<input type="submit" name="Submit" value="Absenden">
</form>
  Text-Spende  
+ 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.
POST-Vorteile Vorteil der POST-Methode: Die Liste der übergebenen Argumente ist (für normale AnwenderInnen) weder erkennbar noch zu manipulieren. 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.

Perl

Die 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.

Decodierung von CGI-Argumenten (Parametern) mit Perl

Die meisten Programmiersprachen bieten Funktionen zur bequemen Übernahme und Decodierung der CGI-Argumente: Das Perl-Modul CGI enthält nützliche Elemente für die CGI-Programmierung.
Quelltext des Perl-CGI-Programms "perlcgi.pl"
#!/usr/bin/perl
use CGI;
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n<title>CGI</title>\n</head>\n";
print "<body>\n";
print "<h2>Perl CGI</h2>\n";

$mycgi = new CGI;
# $v = $mycgi->param('x');
@myargs = $mycgi->param;
$na = @myargs;
print "$na Argumente wurden übergeben <br>\n";
foreach $n (@myargs) {
$v = $mycgi->param($n);
print "$n = $v <br>\n";
}
print "</body>\n";
print "</html>\n";
Damit erhalten sie decodierte (!) Parameter unabhängig von der Methode (GET, POST).

+ Mit Befehl use wird das Modul eingebunden.
+ Befehl new erzeugt ein neues CGI-Objekt (hier: $mycgi )
+ Die auskommentierte Zeile demonstriert, wie sie einen bestimmtes Argument (hier: x ) auslesen können - wenn es übergeben wurde.
+ Anschliessend werden sämtliche übergebenen Parameter an das Hash @myargs übergeben. Das ist unabhängig von der Methode, funktioniert also mit GET und/oder POST !
+ Durch Zuweisung des Hash an eine skalare Variable (hier $na ) erhalten sie die Länge (Anzahl der Elemente).
+ Zuletzt werden in einer Schleife die Elemente des Hash ausgegeben (jeweils Name $n und Wert $v ).

Beispiele:

CGIGETPOST
GET-CGI Test Test
POST-CGI Test Test
dieses CGI Test Test

In den Spalten die beiden untersuchten Methoden: GET & POST
In den Zeilen die verwendeten CGIs (Links -> Quellcode).

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;
// Validierung hier einfügen !
wert=new Date();
// 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">
<input type="hidden" name="time">
</form>