Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Interfata CGI
Paginile Dinamice reprezinta un nivel intermediar intre o pagina normala si browser, contructor de pagini care primeste de la browser solicitari, cauta in baza de date raspunsul la solicitari si construieste mai multe pagini ca raspuns, potrivit cererii. De fapt se folosesc cateva tipuri de pagina. Astfel ca HTML a fost completat cu instructiuni pentru dinamica devenind DHTML.
O alta forma prin care se poate adapta raspunsul la solicitari este CGI(Common Gateway Interface). Aceasta tehnologie ofera niste pagini + prelucrari deinformatii cerute de utilizator (transforma info intr-o alta forma dupa care o transmite browser-ului). Este format din programe de legatura intre paginile Web cautate si aplicatiile de pe server-ul Web. In plus are si alte servere de aplicatie.
De obicei sunt programe scrise intr-un limbaj ceva mai simplu (C,C++) pentru ca avem operatiuni de management de aplicatie.
Limbajele
de scriptare folosesc
asertiuni intuitive apropiate de pseudocod (asemanatoare
fisierelor .bat din dos), o lista de comenzi mari. Exp:
Avantaje CGI: mijloace reduse, deci flexibilitate mare; scripturi usor de scris si inteles.
Dezavantaje CGI: fiecare apel de browser construieste o noua instanta a unui CGI, daca sunt multi utilizatori se ajunge la aglomerarea server-ului.
In consecinta trebuie organizata activitatea de CGI: nivel de ierarhizare intre CGI si Server ISAPI(microsoft) si NSAPI(netscape). Aceste programe organizeaza activitatea bateriei de CGI -uri si reuneste actiunile diverse asemanatoare. ISAPI beneficiaza de facilitati de programare MFC.
Deasemenea programele pot fi:
Scripturi server-side: aici serverul executa scripturi ce contin cereri. Varianta clasica este reprezentata de programele CGI (Common Gateway Interface). CGI dialogheaza intre serverul Web si aplicatii. El trebuie sa cunoasca si baza de date si forma paginii Web. Programele care se executa pe server (precompilate) se numesc "servet-uri".
Scripturi client-side: acestea ruleaza in browser. Pot fi JavaScript, VBScript, ActiveX controls, appleturi. JavaScript si VBS sunt trimise sub forma de cod sursa si sunt interpretate la client. Appleturile si ActiveX controls se trimit precompilate si se executa direct la client.
Calea cea mai directa catre programarea Web o reprezinta scripturile CGI. Insa pentru a putea scrie astfel de programe sunt necesare cateva cunostinte de baza privind protocolul HTTP si modul in care serverul Web ruleaza scripturi CGI.
Programele care fac ca Web-ul sa fie dinamic sunt adesea numite 'scripturi CGI' pentru ca folosesc o interfata standard, despre care se presupune ca este suportata de toate serverele Web, interfata numita CGI - Common Gateway Interface. CGI defineste un mediu in care orice proces este rulat de catre serverul de Web. Un proces rulat de server poate fi scris in orice limbaj de programare. Vorbim despre 'scripturi CGI' pentru ca de obicei este mai usor sa fie scrise in limbaje interpretate, numite 'limbaje de scripting'. Interfata CGI redirecteaza datele de intrare catre un proces rulat de server si intercepteaza datele de iesire ale acestuia.
Multe servere Web sunt configurate in asa fel incat atunci cand o cerere HTTP de la navigator solicita un fisier cu extensia cgi, fisierul nu va fi trimis. In schimb, serverul va verifica daca programul respectiv este executabil si, in caz afirmativ, va rula programul, despre care se poate presupune ca are sarcina sa genereze date de iesire corespunzatoare. Serverul Web poate fi configurat si in asa fel incat o cerere catre un fisier aflat intr-un director anume sa se execute ca un script. Acest director special este numit de obicei cgi-bin.
1. Schimbul de informatii
Cand se scriu scripturi CGI, se creeaza de fapt un program care va rula ca un subproces al serverului Web. Trebuie gasita o modalitate pentru ca scriptul sa primeasca informatii de la server. Exista cateva metode care sunt folosite pentru a transmite informatiile catre scriptul care ruleaza. Prima modalitate ar fi folosirea parametrilor. De fapt, scripturile CGI nu folosesc parametri asa cum sunt folositi in alte programe, poate pentru ca aceasta modalitate a fost considerata 'prea UNIX', sau pentru ca standardele pentru transmiterea de parametri catre programe sunt prea restrictive.
A doua metoda de a transmite date catre procesul fiu este prin 'variabile de mediu': o serie de perechi de forma nume=valoare sunt mostenite de procesul fiu de la parinte in momentul in care procesul fiu este creat. UNIX foloseste de obicei variabile de mediu pentru a pastra informatiile utile in context global, punandu-le astfel la dispozitia proceselor.
Structura nume = valoare a variabilelor de mediu se potriveste foarte bine cu datele care vin din formularul (form) pe care utilizatorul l-a incarcat in navigator. Fiecarui camp de intrare de pe formular poarta un nume si va primi si o valoare furnizata de catre utilizator. Valoarea trebuie sa fie legata de numele campului si perechea sa fie trimisa serverului Web.
In fine, o alta metoda de a trimite date catre procesul fiu este sa se scrie informatiile intr-un fisier si sa se specifice procesului fiu sa citeasca datele din acesta. Aceasta tehnica este frecvent utilizata in redirectarea de tip shell. De exemplu, comanda:
ls-l /bin | more " va determina shell-ul sa lanseze comanda ls si sa redirecteze rezultatul comenzii catre o intrare standard a comenzii more. Comanda more primeste de fapt un descriptor al unui fisier deschis, din care sa citeasca datele.
2. Variabile de mediu
Cand un client trimite serverului Web o cerere care are drept rezultat executia unui script, serverul va preincarca mai multe variabile de mediu, pe care scriptul CGI le va mosteni si pe care le va putea consulta. Anumite variabile de mediu sunt considerate parti 'standard ' ale protocolului CGI. Serverul poate sa defineasca si alte variabile de mediu. Se poate folosi un script CGI de tip shell simplu, care contine comanda set pentru a vedea variabilele de mediu care sunt returnate de server, de obicei pentru a verifica daca se stie denumirea corecta a unei anumite variabile.
Aceste variabile pot fi impartite in trei categorii.
In primul rand, sunt variabile care comunica scriptului date despre serverul pe care ruleaza. De exemplu, scriptul poate afla numarul portului pe care il foloseste.
In al doilea rand, sunt si cateva variabile care furnizeaza scriptului informatii de baza despre programul client (de obicei un browser Web) si despre sistemul care a formulat cererea pentru date. Astfel, de exemplu, scriptul poate sa identifice adresa IP a clientului sau tipul navigatorului. Dar pe de alta parte, nu poate identifica nici persoana, nici adresa ei de e-mail.
In al treilea rand, sunt variabile care contin informatii despre tranzactia curenta. Precum am mai spus, HTTP foloseste protocolul MIME pentru a schimba informatii. Tipul MIME este pus la dispozitia scriptului in variabila CONTENT_TYPE.
3. GET si POST
Exista doua variante de a trimite catre serverul Web informatia culeasa intr-un formular care apeleaza un script CGI: GET si POST. Parametrul METHOD specifica alegerea facuta la implementarea formularului in pagina Web. Fiecare metoda foloseste o cale diferita pentru a trimite informatiile din formular la server, in momentul in care butonul submit (trimite) este apasat.
Denumirile GET si POST se refera la comenzi din protocolul HTTP. Cand navigatorul cere o pagina obisnuita, trimite o cerere de genul:
GET /main.html HTTP/1.1
Cererea de mai sus ii solicita serverului pagina /main.html si ii indica faptul ca este capabil sa faca fata versiunii 1.1 a protocolului HTTP. Daca totul este ok, atunci serverul va raspunde cu un mesaj care contine datele cerute.
Cand navigatorului i se spune sa trimita datele din formular folosind o cerere de tip GET, acesta va trimite cererea adaugand la sfarsitul URL-ului un semn de intrebare si continutul formularului. Se creeaza un URL, extins continand adresa paginii si parametrii care trebuie trimisi scriptului (de exemplu https://www.domeniu.dom/cgi-bin/script.pl?name=John& tel=1274). Daca sunt foarte multe perechi nume = valoare in formular sau daca valorile sunt mari, atunci aceasta cerere initiala catre server poate fi prea mare iar serverul nu ii va putea face fata. La fel, cand URL-ul este procesat de server, orice sir de caractere urmat de un semn de intrebare ajunge intr-o variabila de mediu (QUERY_STRING), care este pusa la dispozitia scriptului CGI.
Este de dorit sa se limiteze spatiul ocupat de variabilele de mediu. Astfel, pentru formularele mai mari este de preferat metoda POST. In acest caz, datele din formular nu sunt trimise ca parte a URL-ului, ci sub forma unui fisier codat cu standardul MIME inglobat in corpul mesajului trimis catre server. Datorita faptului ca datele sunt trimise codat MIME, serverul stie marimea si tipul datelor si va trece aceste valori in script folosind variabila de mediu CONTENT_LENGTH si CONTENT_TYPE. In plus, scriptul asteapta sa se citeasca setul de parametri trimis din formular de pe canalul sau standard de intrare. Este de datoria serverului sa asigure ca datele trimise de catre navigator sa fie puse la dispozitia scriptului, gata de a fi importate si scanate pentru perechile nume=valoare.
Exista insa o complicatie atat pentru GET cat si pentru POST. HTTP este un protocol de tip text si folosirea textului pentru a transporta informatii are probleme.
Se intampla des ca intr-o aplicatie de text sa trebuiasca sa 'furam' caractere pentru a le folosi in aplicatia insasi. Fisierul de parole din UNIX: foloseste caracterul doua puncte (:) pentru a separa diferitele informatii despre utilizator, cum ar fi parola, numele, iar acest lucru inseamna ca nu putem avea un nume de utilizator care sa contina caracterul doua puncte. Se spune ca acesta (caracterul ':') este un caracter 'furat'.
Pentru a evita acest lucru, protocolul HTTP foloseste o metoda de decodare ca sa asigure faptul ca informatia ramane intacta in urma transmisiei. Pentru a codifica datele folosite in URL-uri, caracterele spatiu sunt inlocuite cu semnul plus (+) si toate celelalte caractere care nu sunt alfanumerice sunt inlocuite cu semnul procent (%) urmat de codul hexazecimal al caracterului.
Intr-un mesaj POST sau GET, datele din formular sunt trimise folosind aceasta metoda de codificare. Numele campurilor si valorile sunt codate si fiecare pereche este transformat intr-un sir de caractere nume=valoare, aceste siruri de caractere fiind apoi concatenate intr-un singur sir, in care perechile sunt separate de caracterul &. De exemplu, un formular cu metoda POST care contine doua variabile NAME si PHONE isi va trimite data astfel:
NAME=Joe&PHONE=1274
Metoda GET va adauga acest sir de caractere la URL, dupa semnul de intrebare, in timp ce metoda POST va transmite datele ca o parte a protocolului HTTP, urmand ca scriptul sa le citeasca de pe canalul sau standard de intrare.
POST /cgi-bin/script.pl HTTP/1.1
Accept: images/gif, image/x-xbitmap,
image/jpeg, image/pjepeg, */*
Accept-Language: en-us,ro;q=0.5
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0;
Windows 95)
Host: www.domain.com
Content-Length: 41280
Connection: Keep-Alive
Pragma: no-cache
Name=John&tel=1274
4. Raspunsul dat de script
Datoria serverului Web este de a trimite raspunsuri la cererile clientilor. Scripturile CGI sunt utilizate de regula pentru a colecta date din diverse surse (de obicei baze de date, fisiere locale etc.), a le grupa, a le formata si, in fine, a le trimite clientului care le-a solicitat. Serverul Web aranjeaza lucrurile in asa fel incat iesirea standard a scriptului sa fie redirectionata catre navigatorul clientului. Totusi, datele trimise de catre script trebuie sa fie codificate prin standardul MIME, astfel incat un script trebuie sa porneasca prin trimiterea unui antet (header) MIME care specifica tipul datelor care vor urma, antet care este separat de informatia codata printr-un rand liber. Daca se va examina un script scris in PERL care returneaza o pagina HTML, sunt sanse mari ca acesta sa inceapa o linie de forma:
Print 'Content-type:text/htmlnn';
Prin aceasta se specifica faptul ca datele care urmeaza reprezinta cod HTML. Se observa ca apare un rand liber in plus dupa aceasta afirmatie, pentru a separa antetul de corpul mesajului. Antetul fiind trimis, scriptul poate sa transmita linistit date de tip HTML.
Exemplu
S-a vorbit mai devreme despre scrierea unui script CGI care sa afiseze toate variabilele de mediu setate de server. Iata cum ar putea arata, ca script CGI shell:
bin/sh
echo 'Content-type: text/plain'
echo
set
Trebuie plasat acest script in cgi-bin-ul respectiv si denumit - sa zicem - shset. Scriptul este executat de shell. Folosind perechea standard de caractere magice la inceputul fisierului !) pentru a comunica sistemului ca acesta este un fisier executabil. Pentru a rula, scriptului trebuie sa-i setam drepturile de executie.
chmod +x shset
Scriptul afiseaza antetul MIME, un rand liber si apoi foloseste comanda standard shell set pentru a afisa valorile mediului. Acum se poate apela dintr-un browser Web, prin introducerea unui URL de genul urmator:
https://www.domain.com/cgi-bin/shset
Se va obtine un ecran plin cu informatii care va arata diferite valori care sunt stabilite de serverul respectiv.
Deoarece scriptul CGI returneaza o parte din informatiile trimise prin protocolul HTTP catre browser, este usor de determinat sa foloseasca capacitati speciale ale acestuia. De exemplu, se pot crea pagini in care sa spunem: 'Multumesc pentru introducerea datelor' si sa instruim navigatorul sa astepte 10 secunde si apoi sa se conecteze la o alta adresa, de exemplu la pagina de intrare a serverului (sau, eventual, la pagina pe care utilizatorul o vizitase inainte sa inceapa sa completeze formularul). Pentru aceasta e suficient sa se adauge la antetul HTTP un rand ca cel care urmeaza:
Refresh: 10; URL=https://www.domain.com/index.html
Observatie: URL-ul trebuie sa fie o cale absoluta.
Perl-ul are acum un modul standard (CGI.pm) care usureaza extrem de mult rezolvarea acestor sarcini.
Utilizarea bibliotecilor standard are avantaje si dezavantaje. Pentru programe foarte simple, se intampla sa nu foloseasca aceste biblioteci, desi bibliotecile rezolva problemele mai usor si ascund partile neplacute ale problemei respective. Astfel, cand se foloseste o biblioteca, probabil nu trebuie sa se stie ce probleme incearca sa rezolve. Daca functioneaza, este perfect. Dar daca nu, gasirea problemei este mai dificila, pentru ca va trebui sa se citeasca si sa inteleaga codul scris de altcineva. Mai mult, acea persoana a carui cod trebuie descifrat poate fi un programator experimentat care foloseste structuri Perl care nu sunt atat de evidente.
In sfarsit, daca se foloseste o biblioteca trebuie sa se supuna modului in care autorul crede ca trebuie rezolvata problema respectiva. In cazul modulului CGI.pm, acest lucru inseamna ca programul scris va contine codul care genereaza aspectul formularului, codul care parseaza datele din formular, cel care verifica veridicitatea acestora, cat si codul care contine actiunea principala a procesarii formularului. In acest fel, scriptul va contine functii nefolosite (ceea ce-i va creste dimensiunea) iar codul pentru generarea aspectului paginii nu este separat destul de clar de codul pentru actiunea propriu-zisa - de obicei selectarea informatiilor ce trebuie afisate.
De fapt, pentru a citi valorile din formular trimise prin metoda POST e nevoie de vreo 13 linii sursa Perl si se pot gasi variante ale acestui cod in diverse carti.
In prima faza scriptul citeste cativa octeti de pe canalul lui standard de intrare, unde serverul Web plaseaza valorile metodei POST. Rutina stie cati octeti trebuie sa citeasca deoarece poate sa examineze variabila de mediu CONTENT_LENGTH. Folosind limbajul Perl, toate variabilele de mediu pot fi interogate folosind vectorul asociativ ENV.
Datele citite sunt stocate intr-un sir, care apoi este separat intr-un vector folosind ca separator caracterul & (linia 4). Acum sunt cateva siruri de caractere de forma nume=valoare de care e nevoie in continuare. Separam fiecare dintre sirurile de caractere in doua variabile (folosind ca separator caracterul =), dupa care decodificam caracterele modificate din valoarea corespunzatoare fiecarui camp. In cele din urma se depoziteaza argumentele intr-un vector asociativ. In final, se afiseaza perechile nume = valoare receptionate din formular prin metoda POST.
Pentru cei care nu cunosc Perl: vectorii asociativi sunt structuri de stocare echivalente cu ceea ce in alte limbaje se cheama 'tablouri asociative' sau 'dictionare'. In principiu, sunt structuri similare cu tablourile obisnuite, cu diferenta ca accesarea elementelor se poate face nu doar printr-un index numeric, ci si printr-un alt tip de valoare (de exemplu, sir de caractere), numita 'cheie'. Astfel, expresia $FORM va furniza valoarea care este asociata sirului 'nume' in vectorul asociativ FORM.
Deoarece un program CGI este executabil, este de fapt echivalent cu faptul de a lasa pe oricine sa ruleze un program pe calculatorul respectiv, lucru care nu este printre cele mai sigure. De aceea, exista niste masuri de precautie care trebuiesc implementate cand e nevoie de folosire programelor CGI. Probabil acela care va afecta user-ul normal este nevoia ca programele CGI sa fie stocate intr-un director special, astfel incat server-ul web sa stie sa-l execute mai bine decat doar sa-l afiseze in browser. Acest director este de obicei sub directul control al administratorului de retea, si interzice crearea de programe CGI userului obisnuit. Sunt si alte cai de a da acces la scripturile CGI, dar depinde de administratorul de retea de a le fixa.
Daca se dispune de o versiune NCSA HTTPd de distributie a serverului, se va observa un director numit /cgi-bin. Acesta este directorul special mentionat mai sus, unde se afla toate programele CGI. Un program CGI poate fi scris in orice limbaj care permite executarea pe un sistem, precum: C/C++, Fortran, PERL, TCL, orice shell Unix, Visual Basic, AppleScript.
Totul depinde de ce este disponibil pe respectivul sistem. Daca se foloseste un limbaj de programare precum C sau Fortran, trebuie compilat programul inainte de a fi rulat. Daca se urmareste in directorul /cgi-src care a venit o data cu serverul de distributie, se vor observa codurile sursa ale catorva programe CGI in directorul /cgi-bin. Daca se foloseste unul dintre limbajele de scripting precum PERL, TCL sau shell Unix, scriptul insusi trebuie doar sa existe in directorul /cgi-bin, deoarece nu are asociat nici un cod sursa. Multi prefera sa scrie scripturi CGI in loc de programe, deoarece sunt mai usor de depanat, modificat si mentinut decat un program compilat normal.
Bibliografie
1. https://www.afaceri.net/articole/Webdesign/Proiectare/Scripturi_CGI.htm
2. https://hoohoo.ncsa.uiuc.edu/cgi/
3. CURS 9 - CI - AN 2006 - CAPS5_WEB
4. CURS 11 - CI - AN 2006 - CAPS5_WEB
Copyright © 2024 - Toate drepturile rezervate