\"/
\"/ \"/    

CGI a dynamické www-dokumenty (2)

Miroslav Bartošek, ÚVT MU
Ročník VIII - číslo 2, prosinec 1997
Citace: M. Bartošek. CGI a dynamické www-dokumenty (2). Zpravodaj ÚVT MU. ISSN 1212-0901, 1997, roč. VIII, č. 2, s. 4-6.
Tematické zařazení: Software obecně - principy, tvorba, Webové zdroje a technologie
 předchozí článek | následující článek 

předchozí části jsme uvedli, co to jsou a k čemu slouží dynamické webovské dokumenty. Víme již, že (na rozdíl od statických dokumentů) nejsou uloženy v souborech na www-serveru, nýbrž že jsou na vyžádání generovány externími programy. Způsob předávání dat mezi www-serverem a externím programem generujícím dynamický webovský dokument je definován standardem, který se nazývá CGI, Common Gateway Interface.

V dnešní části příspěvku popíšeme, jak toto předávání dat dle standardu CGI vypadá. Začneme nejprve tou jednodušší stranou našeho popisu: jak má vypadat výstup externího CGI-programu1, aby jej www-server přijal a následně webovský prohlížeč uživatele správně zobrazil. Poté naznačíme principy pro opačný směr komunikace: jak předávat vstupní data od uživatele přes www-server až k CGI-programu. Vzhledem k omezenému rozsahu tohoto článku a jeho informativnímu charakteru neuvádíme všechny možnosti a detaily, které programátor CGI-programů může ke své práci potřebovat. Zájemce o podrobnější studium odkazujeme na odbornou literaturu (některé zdroje uvádíme na konci článku).

1  Výstup CGI-programu

CGI-program zapisuje svá výstupní data na tzv. standardní výstup, odkud je přebírá www-server. Protože CGI-program může generovat dokumenty mnoha rozdílných typů (HTML, obyčejný text, obrázek, zvukový klip aj.), musí předat kromě vlastního dokumentu také informaci o tom, jakého typu tento dokument je, aby jej uživatelův www-prohlížeč mohl správně zobrazit. Výstup CGI-programu má proto dvě části:

CGI-hlavička má následující tvar:

     Content-type: <typ>/<podtyp>

kde dvojice <typ>/<podtyp> určuje typ dokumentu dle standardu MIME (Multipurpose Internet Mail Extension). Např. text/html specifikuje dokument ve formátu HTML, text/plain uvozuje obyčejný text, image/gif říká, že dokumentem je obrázek v grafickém formátu GIF atd.

Příklad:

Následující program v jazyce Perl generuje jednoduchý dynamický www-dokument:

     #!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML><HEAD>\n";
print "<TITLE>CGI - příklad</TITLE>\n";
print "</HEAD><BODY>\n";
print "<H1>Dynamický www-dokument</H1>";
print "Jednoduchý příklad\n";
print "</BODY></HTML>\n";

První řádek programu představuje instrukci pro operační systém Unix, že všechny následující řádky programu mají být zpracovávány interpretem jazyka Perl, který je uložen v udaném adresáři. Druhý řádek generuje CGI-hlavičku ukončenou znakem pro konec řádku \n a zasílá tuto hlavičku na standardní výstup. Třetí řádek generuje povinný prázdný řádek, jímž musí být CGI-hlavička oddělena od www-dokumentu. Zbývající řádky programu již vytvářejí vlastní dokument v HTML-formátu.

Výše uvedený program zapíšeme na počítači s www-serverem do souboru priklad1.cgi, tomuto souboru nastavíme atributy 'readable''executable' pro jakéhokoliv uživatele a umístíme jej do adresáře /cgi-bin, z něhož má www-server povoleno startovat CGI-programy. Kdykoliv pak nějaký uživatel požádá prostřednictvím svého www-prohlížeče tento server o dokument "/cgi-bin/priklad1.cgi", server aktivuje náš CGI-program, který vygeneruje dynamický dokument, a na obrazovce uživatele se objeví text:

    
Dynamický www-dokument
Jednoduchý příklad

2  Vstup CGI-programu

Program, který jsme jako příklad právě uvedli, je velmi jednoduchý. Nejenom tím, jaký triviální www-dokument generuje, ale především z toho důvodu, že nepotřebuje pro svou činnost žádná vstupní data od uživatele. Takováto situace se v praxi vyskytuje velmi zřídka; obvykle se bez potřeby dodat CGI-programu nějaká vstupní data od uživatele neobejdeme. K tomu ovšem potřebujeme zvládnout dvě věci:

Prozraďme hned na začátku, že prostředkem pro zadávání uživatelských dat na www-stránce jsou HTML-formuláře a že data zapsaná uživatelem do formuláře se dostanou k CGI-programu prostřednictvím proměnných prostředí (environment variables).

2.1  Formuláře

HTML-příkaz <FORM> pro vytváření formulářů má tolik parametrů a možností, že jen jejich popis by vydal na obsáhlý článek (viz např. [2]). Formuláře umožňují vytvořit na www-stránce nejenom jednoduchá vstupní textová pole nebo login-formuláře pro identifikaci uživatele pomocí jména a hesla, ale také různé grafické objekty, jako jsou např. tzv. "radiové knoflíky", zaškrtávací boxy, či pevná nebo rozbalovací menu.

Ukažme si jen jednoduchý příklad formuláře pro ilustraci základních principů CGI:

     <FORM ACTION="/cgi-bin/priklad2.cgi" METHOD="post">
 Zadejte Vaše jméno:
  <INPUT TYPE="text" NAME="jmeno"><BR>
 Kdy jste se narodil:
  <INPUT TYPE="text" NAME="datum"><BR>
  <INPUT TYPE="submit" VALUE="Odeslat data">
  <INPUT TYPE="reset" VALUE="Smazat formulář">
</FORM>

Význam jednotlivých prvků v tomto formuláři je následující:

Jakmile uživatel tento formulář vyplní a stiskne tlačítko "Odeslat data", jsou data z formuláře předána CGI-programu ke zpracování.

2.2  Předání dat z formuláře CGI-programu

Jak již bylo uvedeno, způsob, kterým jsou data z formuláře předána CGI-programu, záleží na metodě specifikované ve formuláři (CGI-program může zjistit název použité metody v proměnné REQUEST_METHOD):

  1. metoda "get"
    Data z formuláře budou přilepena na konec URL z atributu ACTION a to bude přes www-server předáno CGI-programu v proměnné prostředí QUERY_STRING. Hodnota této proměnné bude mít tvar:
           URL?jmeno1=hodnota1&jmeno2=hodnota2...
    kde URL je hodnota atributu ACTION, jmeno(i) je jméno i-tého vstupního prvku formuláře (viz atribut NAME příkazu INPUT) a hodnota(i) je uživatelem zadaná hodnota tohoto prvku.
    Délku dat udává proměnná CONTENT_LENGTH (definice CGI zavádí více než dvacet dalších proměnných pro různé údaje).
  2. metoda "post"
    Objem dat, která lze předat metodou "get", je omezen na zhruba 200 bytů. Metoda "post" toto omezení odstraňuje - CGI-program obdrží uživatelská data na svém standardním vstupu, přičemž jejich délku udává opět proměnná prostředí CONTENT_LENGTH.

U obou metod se uživatelská data při předávání navíc ještě kódují: mezera se nahrazuje znakem "+" a každý speciální znak, který se může vyskytnout v URL (např. plus, procento, dolar), stejně tak jako znak s kódem vyšším než 128 (např. české diakritické znaky), se zakóduje do trojice znaků %XX, kde XX je hexadecimální kód znaku v tabulce ASCII.

Příklad:

Uveďme si příklad CGI-programu, který bude zpracovávat data zapsaná uživatelem do formuláře uvedeného v části 2.1 tohoto příspěvku (připomínáme, že tento formulář umožňuje zadat uživateli jeho jméno a datum narození). Náš ukázkový program data z formuláře pouze převezme a zobrazí je v jím vygenerovaném dynamickém dokumentu.

Z toho, co jsme uvedli v části 2.2, je zřejmé, že již jen pouhé naprogramování převzetí dat zasílaných metodou "get" nebo "post" představuje ne zcela triviální úkol (testy, dekódování, rozčlenění vstupního řetězce znaků na jednotlivé hodnoty). Využijeme proto knihovnu CGI-podprogramů cgi-lib pro jazyk Perl, která nám pro tento úkol (stejně jako pro řadu dalších často používaných operací při CGI-programování) nabízí hotová řešení v podobě příslušných podprogramů.

     #!/usr/local/bin/perl
# priklad2.cgi - data z formulare
require "cgi-lib.pl";
print "Content-type: text/html\n";
print "\n";
# Nacteni a dekodovani parametru
# z formulare do pole "data"
&ReadParse(*data);
print "<HTML><HEAD>\n";
print "<TITLE>CGI - příklad2</TITLE>\n";
print "</HEAD><BODY><H1>";
print "Zpracovani dat z formulare</H1>";
print "Dne ", $data{"datum"}";
print " se narodil/a ", $data{"jmeno"}";
print "<BR>\n";
print "</BODY></HTML>\n";

Struktura tohoto programu je obdobná jako u programu priklad1.cgi (nově se nám zde objevují komentáře - řádky začínající znakem #). Třetí řádek instruuje interpret jazyka Perl, odkud má vzít podprogramy, které budou dále v podprogramu vyvolávány. Příkaz &ReadParse(*data) na osmém řádku je příkladem volání takového podprogramu. Tento podprogram za nás udělá veškerou "špinavou práci" s načítáním a dekódováním dat z formuláře; získaná data jsou uložena do asociativního pole data a jednotlivé údaje jsou v poli odkazovány interními jmény příslušných prvků formuláře (viz např. $data{"jmeno"}).

Literatura

[1] T. Boutell. CGI Programming in C & Perl. Addison-Wesley Developers Press, 1996.
... zpět do textu
[2] http://hoohoo.ncsa.uiuc.edu/cgi/intro.htm
... zpět do textu
setting
1 Aby nedošlo k nedorozumění: jednoduché je pouze předání výstupů z CGI-programu k www-serveru; vytvoření těchto výstupů - to je již stejná "programátorská řehole" jako každé jiné programování.
... zpět do textu
Zpět na začátek
ÚVT MU, poslední změna 14.11.2011