Taustaa CGI-ohjelmointi CGI = Common Gateway Interface Hyvin yksinkertainen ja helppo tapa toteuttaa dynaamisuutta ja interaktivisuutta htmldokumentteihin Kehitetty tiedon siirtoon palvelimen ja asiakasselaimen välillä Tyypillisin CGI-sovellus on HTML-lomake, jonka täytettyään käyttäjä voi lähettää tiedot palvelimelle webselain httppyyntö HTML vastaus Kuva 1:CGI-ohjelmisto www palvelin Ympäristömuut tujat +data HTML-sivu CGI-ohjelma STDIN STDOUT palvelimen tietokannat Kuten kuvasta 1. näkyy CGI-ohjelma käynnistyy web-palvelinohjelmiston kautta Palvelinohjelmisto välittää CGI-ohjelmalle joukon ympäristömuuttujia ja selaimen lähettämät syöttötiedot Syöttötiedot johdetaan standardisyöttövirtaan (kuvassa STDIN) Tulostus standarditulostusvirtaan (kuvassa STDLIST) CGI-ohjelman tulostuksen tulee olla web-selaimen ymmärtämää muotoa eli HTML, XHTML, jpg tai gif grafiikkaa jne... Web-palvelinohjelmisto lähettää CGI-ohjelman tulostuksen sellaisenaan selaimelle Selain ei erota millään lailla CGI-ohjelman tuottamaa sivua staattisesta HTML-sivusta
Palvelimen ja asiakasselaimen välinen yhteys muodostetaan sockettien avulla socket on verkon yli luotava yhteys, joka loogisesti toimii kuin tiedosto, johon voidaan kirjoittaa ja lukea. Yhteydessä noudatetaan määrämuotoa eli http-protokollaa Katso http://staff.cs.utu.fi/kurssit/tietokoneverkot/nwluento14.pdf CGI-ohjelmoinnin etuja/haittoja Edut yksinkertainen tapa toteuttaa tiedonvälitys asiakkaalta palvelimelle ja takaisin ei sidoksissa määrättyyn ohjelmointikieleen lähdekoodi pysyy piilossa käyttäjältä Haitat Hidas tapa toteuttaa dynaamisuutta html-sivuihin, jos vertaa esim. JavaScriptiin Turvallisuus usein ohjelmoijan vastuulla Vaatii usein oikeuksia palvelinohjelmiston asetusten muuttamiseen Hieman työläämpi ohjelmoitava verrattuna ASP,PHP yms. Pyyntö Usein web-palvelimet on konfiguroitu siten, että ohjelmat toimivat vain tietyissä hakemistossa Palvelin saa selaimelta http-protokollan mukaisen pyynnön: GET /cgi-bin/welcome.cgi HTTP/1.1 Accept: www/source Accept: text/html User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT ) From: penrii@it.utu.fi Vastaus Pyynnön saatuaan web-palvelin käynnistää vastaavan ohjelman Ohjelma käyttää palvelinkoneen resursseja siis muistia tiedostoja, kiintolevyä yms. Ohjelman standardisyöttövirtaan tekemä tulostus ohjataan www-selaimelle, kun ohjelma on pysähtyny Vastauksen http-protokollan mukainen alku: HTTP/1.1 200 OK Date: Tuesday, 11-March-03 12:25 GMT Server: Apache/1.3.23 (Unix) AxKit/1.5 mod_perl/1.26 MIME-version: 1.0 Content-type: text/html Content-length: 2000
Ohjelmointikielen valinta CGI-ohjelmointi on kielen suhteen riippumaton, mutta seuraavia ominaisuuksia valitulla kielellä tulisi olla Helppo tekstin manipulointi Helpot liittymät ohjelmistoihin ja ohjelmistokirjastoihin Ympäristömuuttujien käsittely Ensimmäinen cgi-ohjelma perl-versio: #!/usr/bin/perl print Content-type: text/html\n\n ; print <html>\n<head><title> ; print Eka cgi-ohjelma ; print </title></head>\n ; print <body><h1>eka ohjelma</h1></body>\n ; print </html>\n ; exit 0; http://bioinf.uta.fi/cgi-bin/welcome.cgi http-protokollan mukaisista vastausmäärittelyistä vain Content-type-määrittely tarvitaan, sillä kaiken muun hoitaa serveriohjelmisto Huom: Content-type määrittelyn jälkeen tarvitaan vähintään kaksi rivinvaihtoa Selaimen kannalta skriptin welcome.cgi tuottama sivu ei poikkea mitenkään staattisesta web-sivusta Yleisesti CGI-ohjelman serveriltä saama tieto sisältää kolmenlaista informaatiota Asiakasohjelma-, palvelinohjelma- ja käyttäjäinformaatiota Lomakkeen ja kutsuparametrien tiedot tiedostopolkuja koskevaa tietoa Parametrien välitys (get) Niukka-peli http://dna.uta.fi/cgi-bin/niukka.cgi?34+77+78 Selaimen url :n yhteyteen lisätään parametrejä? ja + -merkein erotettuina Jos ohjelmaa käytetään html-lomakkeista kenttien erottimena on &-merkki, arvot erotetaan kenttien nimistä =-merkillä Huom : Esimerkistä niukka.cgi puuttuu merkkien dekoodaus
Ympäristömuuttujien käyttö http://dna.uta.fi/cgi-bin/server.cgi Eräissä tapauksissa ympäristömuuttujat sisältävät tarpeellista ja välttämätöntä tietoa CGI-ohjelman suorittamiseksi Lomake get-metodilla Staattinen http://dna.uta.fi/niukka.html On myös mahdollista luoda lomake suoraan cgi-skriptistä ja palauttaa se samalle skriptille Lomakkeen datan välittäminen getmetodilla tapahtuu ympäristömuuttujan QUERY_STRING avulla Get-metodilla voi lähettää suhteellisen pieniä informaatiomääriä Post-metodi post-metodin käsittely on monimutkaisempaa kuin get-metodilla tapahtuva tiedonvälitys Soveltuu suurienkin tietomäärien siirtämiseen Lomakkeen sisältämä tavumäärä tallentuu ympäristömuuttujaan CONTENT_LENGTH Data luetaan em. tavumäärä standardisyöttövirrasta Esimerkki http://dna.uta.fi/niukka2.html Dekoodaus Useat merkit lomakkeiden kentissä koodataan selainohjelmassa heksadesimaalimerkeiksi esimerkiksi ()[]{} ä å ö + -jne.. ennen niiden lähettämistä palvelimelle koodaus pitää purkaa kuin arvoja käytetään: sub decode { my $value=shift; $value=~tr/+/ /; $value=~s/%([\da-fa-f][\da-fa-f])/pack("c",hex($1))/eg; return $value; }
Lomakkeiden käsittelyperiaate 1. Selvitä pyynnön tyyppi (GET tai POST) tarkistamalla REQUEST_METHOD ymp. muuttuja 2. Jos GET, niin lue tieto ymp.muuttujasta QUERY_STRING 3. Jos POST, niin tarkista tiedon määrä ymp.muuttujasta CONTENT_LENGTH ja lue standardisyöttövirrasta tuo tavumäärä dataa 4. Jaa luettu data kenttiin &-merkin avulla 5. Dekoodaa merkit 6. Käsittele tieto Perlin CGI-luokka Perlin (5.8.0) mukana oleva CGI-moduli tai luokka helpottaa huomattavasti CGI-ohjelmointia Luokka sisältää metodit kaikkien HTMLelementtien luomiseen ja käsittelyyn Tässä rajoitumme lähinnä lomakkeiden käsittelyyn Lomakkeiden käsittely on jopa edellä esitettyä helpompaa CGI-modulin dokumentaatio: http://perldoc.perl.org/cgi.html moduli otetaan käyttöön käskyllä use CGI; koska moduli on tehty olio-ohjelmointityyliin luontevinta on luoda CGI olio: my $query=new CGI; Jos CGI-skripti on kutsuttu lomakkeesta POST tai GET metodilla, luonti new käskyllä merkitsee, että data luetaan ja dekoodataan Dataan pääsee käsiksi param-metodilla: $numerot=$query->param( luvut ) Lomakkeen kenttien nimet saa myös param metodilla: @names=$query->param; Lomake luodaan metodilla start_form ja lopetetaan metodilla end_form: print $query->start_form(-method=> $method, -action=>$action, -enctype=> $encoding);... lomakkeen käsittely... print $query->endform; Esimerkki http://dna.uta.fi/cgi-bin/formesim.cgi
SSI Server Side Includes Liittyy läheisesti CGI-ohjelmointiin HTML (shtml) sivulle voidaan upottaa CGIohjelmien tai eräiden ympäristömuuttujien tuloksia Toimii myös PHP ja ASP sivujen yhteyksissä Katso http://httpd.apache.org/docs/1.3/howto/ssi.html