Ceea ce a promis si a realizat CGI este o întreagă clasă de aplicatii interactive al căror comportament este determinat de datele introduse de utilizator.

CGI, cadre si JavaScript

Dumitru Rădoiu

CGI (Common Gateway Interface) s-a impus ca cea mai eficientă, stabilă si usor de înteles modalitate de manipulare a informatiei generate în mod dinamic pe Web. CGI este acea parte a serverului Web care poate comunica cu alte programe care rulează pe sistem. Cu ajutorul acestei interfete, serverul Web poate apela un program, îi poate trece acestuia datele utilizator, poate prelucra rezultatele si le poate trimite înapoi utilizatorului.

Ceea ce a promis si a realizat CGI este o întreagă clasă de aplicatii interactive al căror comportament este determinat de datele introduse de utilizator: prelucrarea datelor inserate în formulare (care necesită un răspuns), imagini senzitive, contoare de acces a documentelor sau interogarea unor baze de date pentru o anumită informatie.

Cea mai răspîndită aplicatie este prelucrarea formularelor. Acestea sînt un subset HTML care permite achizitionarea de informatie prin intermediul unor figuri grafice de genul butoanelor radio, căsutelor de selectie, cîmpurilor text sau listelor. După ce utilizatorul a terminat de completat un asemenea formular, îl poate expedia (prin intermediul unui buton submit) programului CGI care prelucrează informatia si returnează un răspuns pe baza criteriilor de selectie utilizator.

Limbajul cel mai des utilizat pentru scrierea programelor este Perl (cel putin pentru sistemele UNIX) deoarece pare a fi cel mai usor de utilizat pentru manipularea textelor si matricelor. După rulare, un program CGI poate trimite clientului rezultatele fie în mod direct (caz în care va trebui să genereze un header HTTP complet), fie indirect prin intermediul serverului care va completa datele cu informatia din header.

O a doua aplicatie (în ordinea răspîndirii) este gateway. Un gateway CGI este un script utilizat pentru a accesa informatia care nu este direct accesibilă clientului; de pildă, informatia stocată într-o bază de date. Scripturile de acest fel se scriu în limbaje care posedă extensii (de pildă, pentru Perl extensia este oraperl) pentru a formula interogări SQL si a citi informatia continută în bazele de date.

Se pot scrie programe gateway si pentru accesarea altor informatii de pe Net (Archie, WAIS, etc)

O a treia aplicatie semnificativă este reprezentată de documente virtuale. Acestea sînt create ca răspuns la cererea clientului. Se poate crea un document HTML oricît de complex, continînd text, imagine, fisiere de sunet sau video. Cele mai elocvente exemplificări sînt cele care rulează pe "căutători".

Cum lucrează interfata

Majoritatea serverelor asteaptă ca programele CGI si scripturile să fie rezidente într-un director special, numit cgi-bin si/sau să aibă o anumită extensie. Cînd clientul cere un URL asociat cu programul CGI, serverul recunoaste adresa si în loc să trimită programul (sau scriptul), îl execută.

Cererea clientului este frecvent însotită de date. Felul în care aceste date sînt trecute programului depinde de server si de sistemul de operare nativ. Pe sistemele UNIX, programele CGI primesc informatii prin intrarea standard (STDIN) si prin variabilele de mediu (parametrii pusi la dispozitie de către server). În cazul în care o parte din datele de intrare sînt furnizate de client prin intermediul formularelor, există două metode prin care acestea sînt trecute serverului: GET si POST.

Prin metoda GET, datele din formular sînt incluse în URL de forma: http://adresă_server/cgi-bin/nume_script?nume=valoare. În acest caz, serverul execută scriptul din directorul cgi-bin, iar variabilei de mediu QUERY-STRING i se asignează nume=valoare. Dacă formularul are mai multe cîmpuri, perechile nume=valoare inserate în URL sînt separate prin caracterul "&". Pentru a le accesa trebuie create noi variabile. Acest lucru poate fi realizat fie cu programe gata făcute (de pildă cgiparse, care va crea noile variabile cu nume de forma FORM_nume si a căror valoare va fi valoare) fie cu cîteva linii de program care fragmentează sirul plasat în variabila de mediu QUERY-STRING.

Metoda POST trimite datele client ca flux de intrare si setează variabila CONTENT-LENGTH la dimensiunea în octeti a datelor. Citirea valorii variabilelor se face prin intrarea standard.

La ambele metode, rezultatul este că datele client sînt trecute programului ca perechi nume=valoare. Programul (sau scriptul) CGI le prelucrează apoi după dorintă.

Formulare, cadre si JavaScript

Prima problemă pe care trebuia să o rezolvăm era destul de simplă. Trebuiau postate informatiile (adunate pe cale traditională) despre Internet Service Providers, alături de un formular interactiv pentru achizitionarea datelor noi. Am generat un document format din două cadre: unul cuprinzînd lista ISP (din care putea fi apelat si formularul) si altul cuprinzînd unul din documentele apelate din primul.

Cadrele (frames) împart fereastra navigatorului în mai multe regiuni, în care pot fi afisate documente diferite. Codul HTML care initiază o fereastră bazată pe cadre este simplu:

<FRAMESET parametru> Datele relative la cadre </ FRAMESET>.

Parametrul poate fi ROWS sau COLS (rînduri sau coloane) si ia fie valori procentuale din dimensiunea ferestrei, fie valoarea în pixeli, fie valori relative ale cadrelor, separete prin virgulă.

Datele relative la cadre au forma:

<FRAME parametrii> unde parametrii pot fi: NAME (nume), SRC (care are ca valoare URL-ul documentului care trebuie încărcat), MARGINWIDTH (care controlează marginea ferestrei în pixeli), SCROLLING (yes/no/auto) si NORESIZE (care indică faptul că fereastra nu poate fi modificată).

Tagurile <NOFRAMES> si </NOFRAMES> încadrează codul HTML destinat navigatoarelor care nu pot afisa cadre.

Din considerente estetice am ascuns linia de demarcatie între cadre cu ajutorul tagului FRAMEBORDER care a luat valoarea zero.

<FRAMESET COLS="200,*" FRAMEBORDER=no BORDER=0>
<FRAME SRC="isp1.htm" NAME="isp1" FRAMEBORDER=no BORDER=0
NORESIZE SCROLLING="no">
<FRAME SRC="isp2.htm" SCROLLING="auto"
NAME="isp2" MARGINWIDTH=2 MARGINHEIGHT=2>
</FRAMESET>

Pentru ca un document la care face referintă o legătură să poată fi trimis într-un anumit cadru, legătura are sintaxa:

<A HREF="nume_document.htm" TARGET="nume_cadru">Text activ</A>

Dacă dorim ca documentul să fie afisat pe fereastra întreagă, TARGET ia ca valoare _parent.

Datele inserate în formular sînt prelucrate de de un script scris in shell (vezi caseta).

Prima parte a scriptului generează un fisier temporar în care stochează datele. După ce le trimite via e-mai, sterge fisierul. A doua parte a scriptului trimite utilizatorului un mesaj de multumire.

O altă problemă care trebuia rezolvată era abonarea on-line. Pagina de abonamente trebuia să permită selectia publicatiei la care se face abonament, să totalizeze "în fata clientului" costul total al abonamentelor si să trimită continutul formularului (după prelucrare) via e-mail. Singura deosebire fată de exemplul precedent este că perechea nume=valoare este calculată cu ajutorul unei functii JavaScript (form.elements[i].value=suma(this.form)), prezentată de altfel în numărul trecut.

În încheiere as mentiona versiunea shareware WebForms, Q&D Software Development, care poate fi adusă pentru încercări de la http://www.q-d.com/. Interfata grafică excelentă permite generarea rapidă si automată a formularelor precum si a scripturilor CGI în Perl.

#!/bin/sh
eval `cgiparse -form`
TMP=/usr/local/etc/public/xxx`ctime`
echo > $TMP
echo "Mesaj din pagina ISP" >> $TMP
echo " " >> $TMP
echo "Contact: $FORM_ contact " >> $TMP
echo "Data: $FORM_ data" >> $TMP
echo "Legaturi: $FORM_ legaturi" >> $TMP
echo "Servicii: $FORM_ servicii" >> $TMP
echo "Volum: $FORM_ volum" >> $TMP
echo "Rata: $FORM_ flat" >> $TMP
echo "Taxa: $FORM_ taxa " >> $TMP
echo "Clienti: $FORM_ clienti " >> $TMP 
echo "Distribuitori: $FORM_ distribuitori" >> $TMP 
echo "Direct: $FORM_ direct" >> $TMP 
echo "Capacitate: $FORM_ Capacitate" >> $TMP 
echo "Pondere: $FORM_ pondere" >> $TMP 
echo "Descriere: $FORM_ vorbe" >> $TMP 
mail -s "ISP" info@agora.ro < $TMP
rm $TMP
echo Content-type: text/html
echo 
#echo <HTML>
echo "<HEAD><TITLE>Multumesc!</TITLE></HEAD>"
#echo "<BODY>"
echo "<CENTER>Informatiile trimise de Dvs. <br>"
echo " vor fi publicate în scurt timp.</CENTER>"
echo "<BR>"
echo "<CENTER> <A HREF="../cpa/new/isp.html">Inapoi</A> </CENTER>"
echo " "
echo "</BODY>"
#echo </HTML>

(C) Copyright Computer Press Agora