Skirtumas tarp CGI programų ir paprastų dokumentų yra tas, kad vietoj statinių dokumentų, serveris įvykdo programą ir išveda jos gražinamus duomenis. CGI programa turi pasirūpinti, kad išvedami duomenys patenkintų kliento naršyklę.
Dažniausiai CGI programos išveda duomenis paprastų dokumentų: teksto arba HTML, pavidalu. Tačiau galimi ir kitokie išvedamų duomenų tipai:
Kiekvienas iš šių metodų reikalauja gilesnių žinių apie CGI programos gražinamas papildomas antraštes.
Kol kas mes pasitenkindavome paprasastomis CGI programomis, kurios kūrė paprastus virtualius dokumentus, tokius, kaip šis:
Eilutė, išvedanti "Content-type" antraštę buvo savaime suprantama. Tačiau tai tik viena iš antraščių, kurias gali naudoti CGI programos. "Content-type" yra antraštė, kuri apibudina toliau einančių duomenų formatą. Kitos antraštės apibudina:
Šiame skyriuje panagrinėsime, kokią įtaką turi antraštės CGI dokumentams. Pradžiai lentelėje 3.1 pateikiamas dažniausiai vartojamų antraščių sąrašas:
Lentelė 3.1 Dažniausiai vartojamos antraštės
Antraštė |
Apibrėžimas |
Content-length | Išvedamų duomenų srauto ilgis baitais. Naudojamas su binariniais duomenimis. |
Content-type | Išvedamų duomenų srauto MIME turinio tipas. |
Expires | Data ir laikas, kada dokumentas daugiau nėra teisingas ir turi būti atnaujintas (perkrautas) kliento naršyklėje. |
Location | Serverio peradresavimas (negali būti siunčiamas kaip pilnos antraštės dalis).. |
Pragma | Dokumento kešavimo įjungimas ir išjungimas |
Status | Užklausimo būsena (negali būti siunčiamas kaip pilnos antraštės dalis). |
Dar dvi antraštės, kurias supranta tik su "Netscape" suderintos naršyklės (Netscape Navigator ir Microsoft Internet Explorer).
Antraštė |
Apibrėžimas |
Refresh | Web klientas perkrauna pažymėtą dokumentą |
Set-Cookie | Web klientas išsaugo pažymėtus duomenis. Naudingas duomenų sekimui tarp užklausų. |
Pilną HTTP antraščių sąrašą galima rasti šiuo adresu:
http://www.w3.org/hypertext/WWW/Protocols/HTTP/Object_Headers.html
Dar yra pora dalykų, kuriuos reikia žinoti apie antraščių sintaksę:
CGI programos gali gražinti bet kokio tipo virtualius dokumentus, tačiau Web klientas ne visus juos gali teisingai priimti. Dėl to klientas pasiunčia sąrašą "priimamų tipų" , kuriuos jis palaiko. Serveris šią informaciją patalpina sisteminiame kintamajame HTTP_ACCEPT, ir CGI programa gali patikrinti šį kintamąjį, tam kad užtikrinti, jog gražinamo failo formatas yra suprantamas vartotojo peržiūros programai (naršyklei).
Taip pat dėl to gražinamame dokumente CGI programa turi naudoti "Content-type" antraštę, kad nurodyti klientui, kokio tipo duomenys bus siunčiami. Taigi, peržiūros programa galės juos teisingai apdoroti ir atvaizduoti.
Štai trumpa programos ištrauka, kuri tikrina, ar peržiūros programa gali atvaizduoti JPEG ar GIF paveiksliukus:
#!/usr/local/bin/perl $gif_image = "logo.gif"; $jpeg_image = "logo.jpg"; $plain_text = "logo.txt"; $accept_types = $ENV('HTTP_ACCEPT'); if ($accept_types =~ m|image/gif|) { $html_document = $gif_image; } elsif ($accept_types =~ m|image/jpeg|) { $html_document = $jpeg_image; } else { $html_document = $plain_text; } . . .
Kaip matėme iš praeito pavyzdžio, mes nesame apriboti tik HTML tekstu, bet galime išvesti dokumentus, suformuotus įvairiais būdais: paprastas tekstas, GIF ar JPEG paveiksliukai ir netgi AIFF garso klipai. Štai programa, kuri gražina GIF paveiksliuką:
Pirmiausiai, ką pastebime, tai kad "Content-type" yra image/gif. Tai įspėją peržiūros programą, kad bus siunčiamas GIF paveiksliukas, ir ji žino, kaip jį atvaizduoti.
Antras dalykas - "Content-lenght" antraštės panaudojimas.Ši antraštė praneša serveriui siunčiamų duomenų dydį.
Siunčiamų duomenų dydžiui sužinoti naudojame komandą stat. Ji gražina 13 elementų masyvą su informacija apie nurodytą failą. Šio masyvo aštuntasis elementas (indeksas 7) parodo failo dydį baitais.
Šiame pavyzdyje nuskaitomas iškarto visas failas. Tai tinka dirbant su mažais grafiniais failais, bet neproduktyvu - su didesniais. Sekantis pavyzdys atvaizduoja grafinį failą mažom porcijom:
Čia vieno ciklo metu nuskaitomas ir atvaizduojamas tik dešimtadalis failo.
Mes nagrinėjome pavyzdžius, kurie gražina virtualius dokumentus. Tačiau CGI programa vietoj to gali liepti serveriui rasti tam tikrą dokumentą ir jį išvesti. Tai vadinama serverio peradresavimu.
Tam, kad atlikti serverio peradresavimą, reikia nusiųsti "Location" antraštę, nurodant serveriui, kurį dokumentą siųsti. Serveris paims nurodytą dokumentą iš Web'o ir nusiųs jį klientui, lyg klientas kreiptųsi ne į jūsų programą, o į tą dokumentą.
Tai gali būti naudinga, kai mes norime gražinti dokumentą, turintį tik statinę informaciją. Pavyzdžiui, tarkime kad mes norime padėkoti vartotojui, kuris užpildė tam tikrą formą. Tam mes sukuriame specialų failą (thanks.htm). Norint jį atvaizduoti, užtenka parašyti tokią programėlę:
#!/usr/local/bin/perl print "Location: http://www.soften.ktu.lt/~virga/CGI_knyga/thanks.htm exit (0);
Svartu žinoti, kad naudojant serverio peradresavimą, negalima gražinti jokių "Content-type" antraščių. Gražinant nurodytą failą, tuo pasirūpina serveris.
Dauguma peržiūros programų kešuoja (išsaugo lokaliam diske) dokumentus, į kuriuos jūs kreipiatės. Tai leidžia sutaupyti daug resursų, nes kiekviena kartą kreipiantis į dokumentą, jis neužkraunamas iš Web'o, o paimamas iš kešo. Tačiau naudojant virtualius dokumentus, sukurtus CGI programų, dėl to gali iškilti problemų.
Ši programa parodo dabartinį laiką bei nuorodą į save. Jeigu mes spragtelėtume ant nuorodos, tam kad įvykdyti programą iš naujo, laikas turėtų pasikeisti. Tačiau taip nėra, nes peržiūros programa atvaizduoja dokumentą iš kešo. (Gali būti kad šis pavyzdys neveiks, nes dokumentas bus atvaizduojamas ne iš kešo, tada norimam vizualiam rezultatui gauti naudokite naršyklės klavišus "Back" ir "Forward"). Norint vėl įvykdyti programą, jums reikia liepti naršyklei perkrauti dokumentą.
Sprendžiant šią problemą, naudojame "Expires" arba "Pragma" antraštes, kurios liepia serveriui nekešuoti dokumento.
#!/usr/local/bin/perl print "Content-type: text/html", "\n"; print "Pragma: no-cache", "\n\n"; . . . arba #!/usr/local/bin/perl print "Content-type: text/html", "\n"; print "Expires: Wednesday, 27-Dec-98", "\n\n"; . . .
Būsenos kodus naudoja HTTP protokolas, norėdamas nustatyti užklausimo būseną. Pavyzdžiui, jei dokumentas neegzistuoja, serveris peržiūros programai gražins būsenos kodą "404". Jeigu dokumentas buvo perkeltas, gražinamas būsenos kodas "301".
CGI programos gali siųsti būsenos kodus, kaip virtualaus dokumento dalį. Štai pavyzdys, kuris gražina "taip", jei "REMOTE_HOST" yra bu.edu, ir "false" priešingu atveju.
"Status" antraštė susideda iš trijų skaitmenų kodo ir paaiškinamojo teksto:
print "Status: 200 OK"; print "Status: 400 Bad Request"
Be šių dviejų, yra daugybė kitų būsenos kodų, kuriuos galima vartoti priklausomai nuo situacijos: autorinių teisių trūkumas, uždrausta užklausa ir t.t. Lentelėje 3.2 pateikiami dažniausiai vartojami būsenų kodai:
Lentelė 3.2 Būsenų kodai
Būsenos kodas |
Pranešimas |
200 |
Sėkmė |
204 |
Nėra atsakymo |
301 |
Dokumentas perkeltas |
401 |
Nesankcionuotas |
403 |
Uždraustas |
404 |
Nerastas |
500 |
Vidinė serverio klaida |
501 |
Neįgyvendintas |
Pilną būsenų kodų sąrašą galima peržiūrėti adresu:
http://www.w3.org/hypertext/WWW/Protocols/HTTP/HTRESP.html
Gaila, bet dauguma peržiūros programų nepalaiko jų visų.
Tai labai svarbus būsenos kodas, nes naršyklė iš CGI programos gavusi būsenos kodą "204", neužkraudinės naujo puslapio.
"No response" būsenos kodas gali būti vartojamas kartu su formomis. Pavyzdžiui, jei vartotojas įvedė neteisingą reikšmę formos lauke, ar spragtelėjo neleistinoje vietoje, galima gražinti šį kodą, tam kad liepti klientui neužkraudinėti naujo puslapio.