cgicorner.ch

Informationen rund um Perl/CGI

Sie sind hier: Home > Knowledge Base > GET und POST Daten in CGI

GET und POST Daten in CGI

Wie kann ich die an das CGI übermittelten Daten auslesen und was ist der Unterschied zwischen GET und POST?

Hier als Beispiel der - hoffentlich bekannte - HTML-Code für ein Formular:

...
<form action="/cgi-bin/test.cgi" method="GET">
<input type="text" name="test1" /><br />
<input type="text" name="test2" /><br />
<input type="reset" value="Zurücksetzen" /> <input type="submit" value="Absenden" />
</form>
...

Bei method= kann zwischen GET und POST gewählt werden.

Bei der GET-Methode werden die Formular-Daten an die URL angefügt, beispielsweise .../cgi-bin/test.cgi?test1=wert1&test2=wert2. Der Teil der URL nach dem Fragezeichen (?) beinhaltet die Variablen und deren Werte und steht in der Umgebungsvariable QUERY_STRING zur Verfügung. Die Länge der URL ist begrenzt. Für Variablen reicht die maximale Länge jedoch meistens aus. Bei grossen Textfeldern oder Dateien, wird die Limite aber bald erreicht, so dass die POST-Methode verwendet werden sollte.

Bei der POST-Methode hingegen werden die Daten mittels einer Pipe an den STDIN gesendet.

Ich persönlich nutze im Normalfall die GET-Methode und nur bei grossen Eingaben die POST-Methode. Dadurch kann ich auch Links definieren, die einem CGI-Variablen übergeben (<a href="/cgi-bin/test.cgi?test1=wert1&test2=wert2">Rufe CGI mit Parametern auf</a>). Andere wiederum benutzen nur die POST-Methode, weil sie sich dann nie Gedanken über die Länge des Inputs machen müsen. Welche Methode gewählt wird, spielt jedoch letztlich keine Rolle. Deshalb wäre es natürlich schön, eine Funktion zu haben, die bei beiden Methoden funktioniert.

Folgende Funktion erfüt genau diesen Zweck:

sub readForm {
  my ($buffer,@pairs,@pair,$i);
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'};
  } else {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  }
  @pairs = split(/&/, $buffer);
  foreach (@pairs) {
    @pair = split(/=/, $_, 2);
    for ($i=0;$i<2;$i++) {
      $pair[$i] =~ tr/+/ /;
      $pair[$i] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    }
    $FORM{$pair[0]} = $pair[1];
  }
}

In der Umgebungsvariable REQUEST_METHOD wird übergeben, ob es sich um einen GET oder POST Aufruf handelt. Bei der GET-Variante wird die Umgebungsvariable QUERY_STRING, welche die Daten enthält in eine Variable ($buffer) gelesen.

Bei der Post-Variante wird vom STDIN gelesen (die Länge, die gelesen werden muss steht in der Umgebungsvariable CONTENT_LENGTH).

Danach wird die Variable bei den "&" gesplittet. Wir haben jetzt ein Array (@pairs) mit einem Name und Wert-Paar (text1=wert1). Jedes Wertepaar wird nun nochmals beim Gleichzeichen (=) in die Variablen $name und $wert gesplittet. Diese werden nun noch decodiert (Umlaute und Sonderzeichen werden Hex-Codiert übertragen, ein "/" wird z.B. %2F) und dann in einen Hash (%FORM) geschrieben. Der Wert des Feldes text1 steht also z.B. in $FORM{"text1"}.

Weiterführende Links

Autor: Jürg Sommer, knowledge@cgicorner.ch

[ zurück ]