Programare Perl
Programare Perl
Programare Perl
Bernard Berenson
Programare Perl
Cuprins
Scripturi CGI (Common Gateway Interface) SSI (Server Side Includes) Programare Web in Perl via modulul CGI
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 3
Programare Perl
Cuprins
Scripturi CGI (Common Gateway Interface)
Caracterizare Variabile de mediu Invocare GET versus POST
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 4
Programare Perl
CGI | caracterizare
Standard de facto pentru interactiunea programatica a clientilor cu serverele Web: CGI/1.1 Scop: generarea dinamica pe server de reprezentari ale unor resurse solicitate de un client Web Un program (script) CGI se invoca pe server, in mod implicit sau explicit (i.e. preluarea informatiilor dintr-un formular)
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 5
Programare Perl
CGI | caracterizare
Scripturile CGI pot fi concepute in orice limbaj disponibil pe server
Limbaje interpretate: bash, Perl (modulul CGI), Python, Pike,... Limbaje compilate: C, C++,...
Programare Perl
CGI | programe
Un script CGI scrie datele la iesirea standard (stdout) Un script CGI genereaza/foloseste anteturi HTTP, utilizind standardul MIME exemplu: Content-type: text/html Unui program CGI, datele de procesat i se vor trimite la intrarea standard sau prin intermediul unor variabile de mediu Detalii: http://hoohoo.ncsa.uiuc.edu/cgi
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 7
Programare Perl
CGI | variabile/1
Un program CGI are acces la variabilele de mediu:
Independente de metoda cererii: SERVER_NAME, GATEWAY_INTERFACE Specifice cererilor transmise spre script: SERVER_PROTOCOL, REQUEST_METHOD, QUERY_STRING, REMOTE_HOST, REMOTE_ADDR, CONTENT_TYPE, CONTENT_LENGTH
8
Programare Perl
CGI | variabile/2
Variabile suplimentare: HTTP_ACCEPT, HTTP_USER_AGENT,... Exemplu de script CGI care afiseaza variabilele de mediu:
#!/usr/bin/perl # Afiseaza mediul print "Content-type: text/plain\n\n"; print "Environment:\n\n"; foreach $key (keys %ENV) { printf "%16s = %s\n", $key, $ENV{$key}; }
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/
Programare Perl
CGI | invocare/1
#!/usr/bin/perl print Content-type: text/html print print <p>Salut din CGI!</p>
salut.cgi stocat in ~/html/
Programare Perl
CGI | invocare/2
<form action=http://www.infoiasi.ro/cgi-bin/max.cgi method=GET> <p>Va rugam, introduceti doua numere: <input name="nr1" size="5 /> <input name="nr2" size="5 /> </p> <p> <input type="submit" value="Afla maximul" /> </p> </form> Invocare dintr-un formular interactiv (GET sau POST)
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 11
Programare Perl
CGI | invocare/3
URL special (cazul GET)
12
Programare Perl
CGI | invocare/4
Pentru fiecare cimp al formularului, se genereaza o pereche nume_cimp=valoare delimitata de & care va fi adaugata URL-ului unde este stocat programul CGI: http://www.infoiasi.ro/cgi-bin/max.cgi?nr1=7&nr2=4 Acest URL este codificat (%hexa, spatiul devine +) URL encoding Serverul va invoca scriptul CGI pasindu-i datele la intrarea standard sau via variabile de mediu
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 13
Programare Perl
CGI | invocare/5
Procesarea datelor prin metoda GET
Datele vor fi disponibile in variabila QUERY_STRING
14
Programare Perl
CGI | invocare/6
Procesul de invocare a scripturilor CGI
15
Programare Perl
CGI | GET
# preluam sirul de interogare # din variabila de mediu QUERY_STRING $interogare = $ENV{'QUERY_STRING'} || die "Sir de interogare vid!\n"; %parametri = &analiza_parametri ($interogare); # preluam valorile parametrilor $nr1 = $parametri{'nr1'}; $nr2 = $parametri{'nr2'}; $max = ($nr1 > $nr2) ? $nr1 : $nr2; print "<p>Maximul dintre $nr1 si $nr2 este: $max</p>\n";
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 16
Programare Perl
CGI | GET
sub analiza_parametri { local ($interogare) = @_; local (@perechi) = split('&', $interogare); # perechi 'camp=valoare' local ($parametru, $valoare, %parametri); foreach (@perechi) { ($parametru, $valoare) = split('='); # valoarea & numele de camp $parametru = &unescape($parametru); # decodificam valorile $value = &unescape ($value); if ($parametri{$parametru}) { # memoram in tabloul 'parametri' $parametri{$parametru} .= "$;$valoare"; } else { $parametri{$parametru} = $valoare; } } # final de foreach return %parametri; }
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 17
Programare Perl
CGI | GET
sub unescape { # functie de decodificare local ($sir) = @_; $sir =~ tr/+/ /; # "+" devine spatiu # %HH devine caracter ASCII $sir =~ s/%([0-9A-Fa-f]{2})/pack("c", hex($1))/ge; return $sir; }
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 18
Programare Perl
CGI | POST
In cazul folosirii metodei POST, preluam parametrii de interogare de la intrarea standard (STDIN): read(STDIN, $interogare, $ENV{'CONTENT_LENGTH'}); Restul programului CGI este similar celui precedent
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 19
Programare Perl
Programare Perl
Programare Perl
Programare Perl
23
Programare Perl
Programare Perl
Programare Perl
Cuprins
Programare Web in Perl via modulul CGI
Prezentare generala Preluarea parametrilor Redirectarea clientului Alte metode utile Exemple
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 26
Programare Perl
Modulul CGI
Ofera rutine/metode pentru dezvoltarea comoda a scripturilor CGI Generare de cod HTML maniera procedurala
#!/usr/bin/perl use CGI qw/:standard/; # utilizare CGI standard print header(); # trimitem antetul HTTP # afisam antetul paginii Web print start_html(-title => "Un salut"); print h1('Salut!'), p('Un paragraf...'); # diferite elemente HTML # afisam finalul de document print end_html();
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 27
Programare Perl
Modulul CGI
Generare de cod HTML maniera obiectuala
#!/usr/bin/perl use CGI; # utilizam modulul CGI $c = new CGI; # instantiem obiectul CGI print $c->header(); # trimitem antetul HTTP # afisam antetul paginii Web print $c->start_html(-title => "Un salut"); print $c->h1('Salut!'), $c->p('Un paragraf...'); # diferite tag-uri HTML # afisam finalul de document print $c->end_html();
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 28
Programare Perl
Modulul CGI
Preluarea parametrilor transmisi scriptului
Se foloseste param()
@parametri = $c->param(); # lista parametrilor disponibili print @parametri; $nume = $c->param('nume'); if ($nume != 'Admin') { print '<p>Nume incorect...</p>'; }
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 29
Programare Perl
Modulul CGI
Redirectarea clientului
# redirectare in functie de limba if ($limba eq 'ro') print $c->redirect('/index.ro'); else print $c->redirect('/index.en');
30
Programare Perl
Modulul CGI
Trimiterea antetului HTTP
# trimite Content-type: image/gif print $c->header('image/gif');
31
Programare Perl
Modulul CGI
Alte metode:
query_string() sirul de interogare pt. GET remote_addr() adresa IP a masinii-client remote_host() adresa simbolica/domeniul clientului request_method() cererea HTTP realizata user_agent() informatii privitoare la programul-client (browser-ului) cookie() acces la cookie-uri
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 32
Programare Perl
Modulul CGI
Alte functii utile:
escape() genereaza un sir codificat in stilul URI (caracterele speciale sunt substituite de %NN) unescape() decodifica un sir codificat cu functia escape() escapeHTML() genereaza un sir codificat in stilul HTML (caracterele speciale sunt inlocuite cu entitatile < > & in loc de < > &) unescapeHTML() decodifica un sir codificat cu escapeHTML()
33
Programare Perl
Programare Perl
35
Programare Perl
36
Programare Perl
Perl
Exercitii
Sa se scrie un script CGI care sa afiseze un citat celebru ales aleatoriu dintr-o lista, in functie de localizarea geografica a vizitatorilor Sa se conceapa o aplicatie Web care sa ofere vizitatorilor posibilitatea de a-si partaja si organiza colectiile multimedia personale (stocate pe CD/DVD-uri); se vor putea realiza si cautari conform unor criterii (simple sau multiple) furnizate de utilizator, eventual recurgindu-se la expresii regulate
37
Programare Perl
Rezumat
Scripturi CGI (Common Gateway Interface) SSI (Server Side Includes) Programare Web in Perl via modulul CGI
Sabin-Corneliu Buraga www.infoiasi.ro/~busaco/ 38