Supporting the community
Ultima actualizare: Julie 24, 1998.
Acest ghid este facut pentru oamenii ce vor sa-si scrie propriul cod WWW scripturi exacutabile folosind WWW's Common Gateway Interface ( CGI). Desi accentul principal este pe REXX multe exemple sunt de asemenea oferite in Perl.
Exista unele librarii simple de script-uri CGI . cgi-lib.rxx sunt librarii de functii REXX (disponibile la SLAC folosind REXX
CALL PUTENV 'REXXPATH=/afs/slac/www/slac/www/tool/cgi-rexx'
declaratie de a include biblioteca la timpul de executie)si cgi-lib.pl este o librarie similara in Perl scrisa de Steve Brenner (exista o copie executabila a acestei biblioteci la SLAC in /afs/slac/g/www/cgi-lib/cgi-lib.pl). NCSA are un set foarte util de subroutines Perl CGI ce sunt disponibile pe FTP anonime. Alt set de script-uri Perl CGI Server Side scris de Brigitte Jellinek este disponibil sub licenta publica Gnu. De asemenea mai este Codul sursa pentru script-urilesi programele www.stanford.edu. De asemenea exista si un index pentru Perl WWW, programe stranse de Earl Hood. In final, vedeti Centrul pentru Dezvoltare Web.
Din moment ce exista riscuri de securitate si alte riscuri asociate cu executarea scripturilor de utilizator intr-un server WWW, cititorul ar putea dori sa vizualizeze mai intai un document care ofera informatii cu privire la SLAC Security Wrapper pentru utilizatori de script-uri' CGI. Pe langa ca s-ar imbunatatii securitatea, Acest invelis simplifica scrierea de script CGI pentru incepatori.
Inainte sa te apuci sa scrii un script, s-ar putea sa vrei sa verifici si notite despre SLAC Web Utilities Oferit de CGI Script-uri.
CGI este o interfata de scris programe externe, sau portaluri, sub un server de informatii. In prezent, serverele de informatii suportate sunt HTTP (Protocolul de Transport folosit de serverele WWW).
Programele de portaluri sunt programe executabile (e.g. script-uri UNIX) ce pot fi rulate de ele insele (dar nu ai vrea o exceptie ca sa identifici erorile). Au fost facute executabile pentru a le permite sa ruleze sub diferite (posibil foarte diferite) servere informationale interschimbabile. Programele portal daca urmezi specificatiile pot fi scrise in orice limbaj, incluzand REXX sau Perl, ce produce un fisier executabil.
Aportul poate fi trimis script-ului in mai multe moduri, in functie de Uniform Resource Locator (URL) sau un Formular HyperText Markup Language (HTML):
QUERY_STRING
Variabila de mediu QUERY_STRING este definit ca orice urmeaza primul ? In Adresa folosita la accesarea portalului. Aceasta informatie poate fi adaugata de un document HTML ISINDEX , sau de un Formular HTML (cu actiunea GET ). Ar putea fi integrat manual ca HTML hypertext link, sau anchor, ce face trimitere spre portal. Acest sir, o sa fie o interogare de informatii, e.g. ce vrea sa caute utilizatorul in baza de date, sau poate rezultatele codate ale formularului de raport. Poate fi accesat in REXX folosind String=GETENV('QUERY_STRING')
sau in Perl folosind $string=$ENV('QUERY_STRING');
Acest sir este codat in formatul stardard URL care schimba spatiul cu + si codificarea caracterelor speciale %xx cu codare hexazecimala . O sa trebuiasca sa-l decodezi ca sa-l folosesti. Poti sa revizuiesti cgi-lib.rxx REXX PROCEDURE DeWeb sau in Perl fragment de cod ce arata cum sa decodezi caracterele speciale.
Daca serverul nu decodeaza rezultatele dintr-un Formular, vei primi de asemenea sirul de interogare decodificat pe linia de comanda. Asta inseqamna ca sirul de interogare o sa fie disponibil in REXX prin comanda PARSE ARG
, sau in Perl $ARGV[n]
array.
De exemplu, daca aveti un URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world
si vedeti REXX command PARSE ARG Arg1 Arg2
then Arg1
o sa contina "hello"
si Arg2
o sa contina "lume"
(i.e. semnul + este inlocuit cu un spatiu).
In Perl $ARGV[1]
contine "hello"
and $ARGV[2]
contine "world"
. Daca doresti sa accesezi folosind linia de comanda, datele trebuiesc procesate mai putin inainte de folosire.
PATH_INFO
Variabila de Mediu Majoritatea timpului, vei vrea sa trimiti date spre portalurile tale de care clientul nu ar trebui sa-si bata joc . Asemenea informatie ar putea fi numele Formularului ce genereaza rezultatele trimise.
CGI permita ca extra informatii sa fie cuprinse in URL si asa poate fi folosit ca sa furnizeze informatii suplimentare specifice unui anumit context pentru script-uri. Aceasta informatie este disponibila ca "extra" informatie, dupa ce pui calea in URL. Aceasta informatie nu este encodata de server in vreun fel. Poate fi accesat in REXX folosind String=GETENV('PATH_INFO')
, sau in Perl folosind $string=$ENV('PATH_INFO');
Ca sa ilustram asta, sa zicem ca un script CGI este accesibil serverului meu si are numele foo
. Cand il accesez pe foo dintr-un document, vreau sa-i zic lui foo ca ma aflu in directorul de limba Engleza, nu directorul porc Latin. In acest caz, as putea sa-mi accesez scropt-ul intr-un document HTML precum:
<A HREF="http://www/cgi-bin/foo/language=english">foo</A>
Cad serverul executa foo, o sa rezulte PATH_INFO
of /language=english
, iar programul poate decoda asta si sa se comporte cum trebuie.
PATH_INFO si QUERY_STRING pot fi combinate. De exemplu, URL-ul:http://www/cgi-bin/htimage/usr/www/img/map?404,451
o sa faca ca serverul sa ruleze script-ul htimage
. Ramane informatia unde e calea " /usr/www/img/map
" to htimage in PATH_INFO variabila de mediu, and pass " 405,451
" in variabila QUERY_STRING . In acest caz, htimage
este un script pentru implementarea hartilor active suportate de CERN HTTPD.
Input Standard
Daca formularul tau are METHOD="POST" in eticheta formularului, programul tau CGI o sa primeasca formularul encodat pe calea corecta ( stdin
in Unix). Serverul nu o sa-ti trimita un EOF la sfarsitul datelor, in schimb, ar trebui sa folosesti CONTENT_LENGTH pentru a determina cat de multe date sa citeasca din stdin. Poti face asta in REXX folosind In=CHARIN(,1,GETENV('CONTENT_LENGTH'))
, sau in Perl folosind read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
Daca doresti sa treci intrarea standard in alt script pe care il vei apela mai tarziu, atunci vei vrea sa cgi-lib.rxx REXX PROCEDURE ReadPost.
Poti sa revizuiesti REXX Code Fragment dand un exemplu cum sa citeasca diferitele forme de introducere in script.
Procedura REXX ReadForm impreuna cu MethGet and MethPost, toate disponibile in cgi-lib.rxx, pot fi folosite sa simplifice operatiunea de introducere a datelor.
Cand scrii un formular, fiecare introducere are un name eticheta. Cand utilizatorul introduce date in aceste formulare, informatia respectiva este codata in datele formularului.Valoarea fiecarui obiect ce este data de utilizator se numeste value.
Data formularului este un sir de name=value perechi separate de caracterul (&). Fiecare name=value perechea este encodata URL, i.e. spatile se schimba in semnul plus si cateva caractere sunt codate in hexadecimal.
Pentru a decodifica datele din formular trebuie sa analizezi mai intai blocul de date formate separat in name=value perechi fara semn. Dupa trebuie parcurs name=value sa devina perechi separatein name si value. Folositi primul semn egal ca sa impartit datele. Daca exista mai mult de unu, atunci ceva este in neregula cu data. Din nou, scapati de semnele egale. La final, refacem URL-ul encodand name si value.
Poti recapitula script-ul REXX sau Perl dand exemple de decodare a formei de introducere.
Cand folosim name si value ca informatie in script, trebuie sa avem grija la:
Programele CGI pot returna foarte multe tipuri de fisiere. Pot trimite inapoi o imagine clientului, un document HTML, un document text, un Post-script sau poate chiar u fisier audio cu functiile. Pot sa returneze si referinte altor documente (ca sa economisim spatiu nu vom da exemple, mai multe informatii se pot gasi in NCSA's CGI Primer). Clientul trebuie sa stie ca documentul trimis, poate fi afisat in mod corespunzator. Ca, clinetul sa stie asta, programul CGI trebuie sa zica serverului ce tip de fisier returneaza.
Ca sa spui serverului ce tip de fisier sa trimita inapoi, CGI are nevoie de un head-er unde sa fie trecuta informatia. Acest head-er este in format ASCII, compus din linii separate fie prin linii sau se intorc urmate tot de de linii. Scrip-ul tau trebuie sa contina doua astfel de linii inainte sa ajunga la client. Aceste linii sunt folosite pentru a indica tipul de MIME al documentului urmator.
Tipuri MIME uzuale relevante pentru WWW sunt:
"text"
Content-Type ce este utilizat pentru a reprezenta informatii textuale intr-un numar de seturi de caractere si descrierea textului limbii intr-un mod standardizat.Cele mai folosite subtipuri sunt: text/plain
: text fara cerinte speciale de formatare.text/html
: text cu comenzi HTML incorporate"application"
Content-Type, ce e folosit pentru a transmite date de aplicatie sau binare. Doua subtipuri frecvent folosite sunt: application/postscript
: Data se afla in PostScript, si trebuie sa ajunga in PostScript .application/binary
: data este intr-un format binar necunoscut, cum ar fi rezultatele unui transfer."image"
Content-Type pentru transmiterea de imagine statica (poza). SUnt multe subtipuri posibile, dar cele mai des folosite sunt WWW : image/gif
: o imagine in format GIF.image/xbm
: o imagine in format X Bitmap.image/jpeg
: o imagine in format JPEG.
Ca sa zici serverului ce capacitate ai, prima linia ar trebuie sa fie asa:Content-type: type/subtype
unde type/subtype
in MIME tip si subtip pentru capacitatea ta.
Trebuie sa trimiteti urmatoarea linie. Cu specificatiile curente, A DOUA LINIE TREBUIE SA FIE GOALA. Asta inseamna ca nu trebuie sa aiba ceva in ea. Odata ce serverul primeste linia, stie ca ai terminat de zis serverului ce linii sa introduca si le serveste singur. Daca sari aceasta linie, serverul o sa incerce sa analizez randamentul incercand sa afle informatii despre cererea ta si o sa devi foarte nefericit.
Putetei revedea REXX Code Fragment dand un exemplu ca Content-type
information.
Dupa ce aceste linii au fost setate spre stdout
(e.g. o commanda REXX SAY ) o sa fie introdusa in documentul trimis spre client. Capacitatea trebuie sa fie consistenta cu Content-type
header. De exemplu, daca in cap de tabel este specificat Content-type text/html
atunci rezultatul trebuie sa includa formatarea HTML asa
or
pentru a incepe linie noua pentru inlaturarea formatarii automate HTML's .
Din moment ce stdout
este inclus in document, trimite spre diagnosticare cu comanda SAY, o sa apara in document. Puteti sa revedeti un cod REXX cum arata un exemplu de raport de diagnoza.
Daca apar erori (e.g. nu sunt introduse date, s-au gasit caracatere invalide, prea multe argumente specificate, cererea unei comenzi invalide sa fie executata, sintaxa invalida sau variabila nedefinita intalnita in script-uri REXX ) scrip-ul ar trebui sa dea informatii detaliate ce e ok si ce nu este. Poate fi foarte folositor pentru a furniza informatii cu privire la setarea diverselor variabile de mediu WWW ce sunt setate.
CGIerror, CGIdie si MyURL REXX PROCEDUREs in cgi-lib.rxx furnizeaza asistenta in furnizarea erorilor. Pe langa REXX fragmente de cod ce folosesc CGIerror si CGIdie si de asemenea tipic CGIerror output and CGIdie output.
Ca serverul tau sa ruleze script-uri CGI trebuie:
chmod
, e.g. chmod o+x /u/sf/cottrell/bin/cgi1.rxx
chmod u+x /u/sf/cottrell/bin/cgi1.rxx
Web Masterii vor vrea sa se asigure de aspectele de siguranta ale script-urilor tale inaitne sa-l adauge in fisierul cu reguli.
Marea parte a textului provine din documente NCSA. Informatii folositoare au fost obtineute de la The World-Wide Web: How Servers Work, de Mark Handley si John Crowcroft, publicata in ConneXions, Februarie 1995.
We believe in helping people and that matter to us more than anything else. Since the very beginning of our company, our team have been willing and wishing to help.