Dnes si probereme dekódování dat z HTML formuláře metodou GET.
Dnes si probereme dekódování dat z HTML formuláře metodou GET. Metodu poznáte podle toho, že na rozdíl od metody POST po vás nechce žádné další potvrzení odkliknutého formuláře a za jménem CGI skriptu v políčku URL www prohlížeče je seznam proměnných a parametrů.
Funkčnost
Po odkliknutí HTML formuláře se klient (www prohlížeč) spojí s CGI skriptem a automaticky odešle data.
Parametry Apache
Pro zjištění typu poslání dat z formuláře použijeme parametr
REQUEST_METHOD , který nám může říct, že se jedná buďto o metodu POST, GET či PUT (zbylé dvě metody si popíšeme příště). Další důležitý parametr je
QUERY_STRING, ve kterém jsou uložena odeslaná data. Tvar těchto dat si však server trochu přizpůsobil, takže jej budeme muset dekódovat.
HTML formulář
Vysvětlení parametrů formuláře je v
předchozím článku.
Nyní umístěte tento HTML formulář někam na váš www server, například do C:\Program Files\Apache Group\Apache\htdocs\cgi5.html ($HOME/apache/share/htdocs/cgi5.html). Z pohledu serveru je to URL http://localhost/cgi5.html
Příklad HTML formuláře
<HTML>
<HEAD>
<TITLE>Formular CGI SKRIPTU 5</TITLE>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<H1>Formular CGI SKRIPTU 5</H1>
<FORM ACTION=/cgi-bin/cgi5.cgi METHOD=GET>
<INPUT TYPE=TEXT SIZE=20 NAME=parametr1 VALUE="/Program Files/Apache Group/"><BR>
<INPUT TYPE=TEXT SIZE=20 NAME=parametr2 VALUE="jedna dve tri"><BR>
<INPUT TYPE=TEXT SIZE=20 NAME=parametr3 VALUE="hodnota3"><BR>
<INPUT TYPE=TEXT SIZE=20 NAME=parametr4 VALUE="hodnota 4"><BR>
<INPUT TYPE=SUBMIT VALUE="OK - Odeslat data">
<INPUT TYPE=RESET VALUE="Vymazat formular">
</FORM>
</BODY>
</HTML>
CGI skript
Dole je uvedený cgi skript, kterým můžeme dekódovat data z výše uvedeného formuláře. Stačí pokud si CGI skript uložíte do svého adresáře pro CGI skripty. V našem případě je to adresář
C:\Program Files\Apache Group\Apache\cgi-bin\cgi5.cgi ($HOME/apache/share/cgi-bin/cgi5.cgi). Z pohledu serveru je to URL
http://localhost/cgi-bin/cgi5.cgiVerze CGI skriptu pro Linux/Unix je stejná jako zde uvedený příklad pro Windows, stačí pouze upravit první řádek skriptu. #!/usr/bin/perl
Popis CGI skriptu:
#popis1 – skript zjistí pomocí parametru REQUEST_METOD, zda-li se jedná o metodu GET či POST a podle toho zajistí dekódování dat. Metoda POST jej popsaná v předchozím článku, takže se zaměříme na metodu GET. Pokud bychom CGI skriptu poslali metodu PUT (pro upload souboru na server), tak ohlásí chybu (kterou máme ošetřenou v popisu 3), jelikož tento skript není na to připraven.
Vezme se řetězec, který je vidět ve Výsledku CGI skriptu v neupravených datech (viz dole) a postupně se nejdříve rozdělí do pole podle znaku & (ampresand), čímž získáme data typu promenna=hodnota , ale data stále nejsou upravená.
#popis2 – vezmeme řetězec promenna=hodnota ,kterou jsem si dekódovali a v hodnotě proměnné nahradíme znak + (plus) znakem “ “ (mezera). Dále nahradíme hexadecimální znaky jako je %2F znakem “/” (lomítko), atd.
#popis3 – výpis chybového hlášení na obrazovku
#popis4 – tisk dekódovaných a upravených parametrů
Příklad CGI skriptu
#!/perl/bin/perl.exe
# popis 1
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
@dve = split(/&/, $ENV{'QUERY_STRING'});
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@dve = split(/&/, $buffer);
} else { &error('request_method');
}
# popis 2
foreach $druhy (@dve) {
($jmeno, $hodnota) = split(/=/, $druhy);
$hodnota =~ tr/+/ /;
$hodnota =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$hodnota =~ s/<!--(.¦\n)*-->//g;
$promenna{$jmeno} = $hodnota;
}
# popis 3
sub error {
print "Content-type: text/html\n\n";
print "<HTML>";
print "<TITLE>Chyba</TITLE>";
print "<H2>Chyba: Dekodovani dat neni provadeno metodou";
print " POST ani GET</H2>";
print "</HTML>";
exit;
}
# popis 4
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>CGI SKRIPT 5</TITLE></HEAD>\n";
print "<BODY BGCOLOR=#FFFFFF>\n";
print "<H2>CGI SKRIPT 5</H2>";
print "<BR>Parametr 1: $promenna{'parametr1'} ";
print "<BR>Parametr 2: $promenna{'parametr2'} ";
print "<BR>Parametr 3: $promenna{'parametr3'} ";
print "<BR>Parametr 4: $promenna{'parametr4'} ";
print "<BR><BR>Neupravena data: $ENV{'QUERY_STRING'}";
print "</BODY></HTML>\n";
exit;
Výsledek CGI skriptu
Parametr 1: /Program Files/Apache Group/
Parametr 2: jedna dve tri
Parametr 3: hodnota3
Parametr 4: hodnota 4
Neupravena data:
parametr1=%2FProgram+Files%2FApache+Group%2F¶metr2=jedna+dve+tri¶metr3=hodnota3¶metr4=hodnota+4
Příště si ukážeme jak načítat data z obyčejného textového souboru a zobrazit je v HTML stránce. Pokud máte jakékoliv dotazy či připomínky zasílejte jej na adresu erik@email.cz