3. Duomenų išvedimas iš CGI

  1. CGI ir atsakymo antraštės
  2. Priimami tipai ir Turinio tipai
  3. "Content-length" antraštė
  4. Serverio peradresavimas
  5. "Expires" ir "Pragma" antraštės
  6. Būsenos kodai
  7. Savikontrolės klausimai

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.

3.1. CGI ir atsakymo antraštės

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ę:

3.2. Priimami tipai ir Turinio tipai

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;
}
.
.
.

3.3. "Content-length" antraštė

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.

3.4. Serverio peradresavimas

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);

Pavyzdys 3.4

Svartu žinoti, kad naudojant serverio peradresavimą, negalima gražinti jokių "Content-type" antraščių. Gražinant nurodytą failą, tuo pasirūpina serveris.

3.5. "Expires" ir "Pragma" antraštės

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";
.
.
.

3.6. Būsenos kodai

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ų.

"No Response" kodas

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.

3.7. Savikontrolės klausimai

  1. Kokius duomenis serveriui perduoda CGI programos?
  2. Kam naudojamos antraštės?
  3. Kuo ypatinga antraštė "Location"?
  4. Kam naudojamas būsenos kodas "No Response"?

Atsakymai