[[oktatas:web:cgi|< CGI]] ====== CGI áttekintése ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2012, 2013, 2015, 2017 * Licenc: GNU Free Documentation License 1.3 * Web: http://szit.hu ===== Bevezetés ===== A CGI a **Common Gateway Interface** szavak rövidítése, amelyet a NCSA (National Center for Supercomputing Applications) fejlesztett Perl, C és PHP programok számára. Egy protokoll szabvány, melynek segítségével egy rendszerhez kapcsolhatjuk a Perl, C és PHP vagy más programjainkat. A CGI technológiát általában webszerver mellett használjuk, amelyen dinamikus weblapok generálása a cél. Jelenleg érvényes verziója: CGI/1.1. Alternatívája a JavaServer Pages (Sun) vagy az Active Server Pages (Microsoft). A web kezdeteinél csak ez a technológia adott lehetőséget az interaktív weblapok készítésére. A CGI nélkül a weboldalaink egyszerű statikus weboldalak. A CGI interaktívvá teszi a weboldalakt. Az interaktív weboldalak által lehetőségeink bővülnek: * feldolgozható adatok * tárolható adatok * elérhető adatbázisok Amivel foglalkozunk: * webes alkalmazások * CGI rövid története * a CGI program meghatározása * hogyan működik a CGI? * érvek és ellenérvek a CGI mellett * programozási nyelvek a CGI-ban A webes alkalmazás olyan mint bármely más alkalmazás. Kivéve, hogy csak böngészőn keresztül érhető el. A webes alkalmazások eredetileg fórumok, webáruházak, visszajelzést megvalósító webhelyek voltak. Ma már azonban sok asztali alkalmazás megvalósításra került a webes világban. Olyanok mint rajzolás, irodai alkalmazások, térkép szolgáltatások, határidő naplók, stb. A JavaScript segítségével növelhetjük egy weboldal interaktivitást, képeket tologathatunk, legördülő menüket alkothatunk, eseményeket kezelhetünk, animációkat készíthetünk. ===== A CGI története ===== Az első webszerverek egyike a **NCSA HTTPD** volt. A gyártó National Center for Supercomputing Applications, ahol a Netscape legtöbb alapítója is dolgozott. A Netscape dolgozat ki a Mosaic böngészőt. A NCSA HTTPD egyik legfontosabb tulajdonsága a CGI volt, amely a szerver 1.0-ás kiadásában már jelen volt. A CERN szervere mellett az NCSA HTTPD volt az egyik széles körben használt webszerver, így CGI de facto szabvánnyá vált. Megjegyzés: **CERN httpd** az első webszerver, amelyet Tim Berners-Lee, Ari Luotonen és Henrik Frystyk Nielsen készített, 1990-től (A CERN-nél). 1990 karácsony napján ment élseben. Eredetileg NeXT Computer-on fejlesztették, amelyen NeXTSTEP operációs rendszer futott. A CERN httpd később a W3C fejleszti tovább. Az utolsó kiadás a 3.0A verzió volt, 1996-ban. Később átírják Unixra. A NCSA HTTPd a CERN httpd szerver után, valamikor a 90-es évek elején kezdik fejleszteni, az utolsó kiadása szintén 1996. Fejlesztője Robert McCool. Az NCSA HTTPD alapkódját átvette az Apache projekt. Ez után még az NCSA HTTPD szervernek megjelent az 1.5-s kiadása, utoljára. Ebben az időben a webszerverek 95%-a NCSA HTTPD. Később mindenki Apache-ra váltott. Azóta az NCSA HTTPD kódrész eltávolították az Apacheból, újraírták. 2011-ben már webszerverek 60%-a Apache. * http://en.wikipedia.org/wiki/Comparison_of_web_server_software Abban az időben az NCSA HTTPD CGI megoldása volt az egyetlen lehetőség interaktív weboldalak készítésére. Ennek és a nyílt forráskódjának köszönhetően népszerű lett. Ma az összes webszer támogatja a CGI-t. Néhány hasonló webszerver alkalmazás a JavaServer Pages, a Microsoft's Active Server Pages, PHP, stb. ===== A CGI programról ===== A CGI programot a webszerver hajtja végre, és az eredményt visszaküldi a böngésző számára. A webszerver ebben a folyamatban közvetítőként működik. Szinte bármilyen programozási nyelven lehet CGI programot írni. A CGI programmal a felhasználónak nincs közvetlen kapcsolata. Nem jelenít meg grafikus felületet, bár lehet vele képeket generálni. Egy CGI programnak a következőknek kell megfelelnie: * A parancs egyszerűen begépelhető kell legyen parancssorban. * A Java programok például nem teljesen alkalmasak erre * A programnak létre kell hozni egy érvényes content-type fejrészt. A CGI program kimenete bármilyen típusú tartalom lehet: * HTML kód, képek, szöveges fájlok, word dokumentum, hangfájl, stb. * A content-type sorral mondjuk meg, milyen típusú tartalmat küldünk. ===== Hogyan működnek a CGI programok ===== {{:oktatas:web:cgi:szerveroldali_scriptek.png|}} A CGI megismeréséhez szükséges a unix alapú operációs renszerek fogalmainak ismerete. A CGI tehát egy webszerveren keresztül kommunikál a felhasználóval. Ha egy egyszerű statikus HTML oldalt kell feldolgozni, akkor az URL a következőhöz hasonló lehet: * http://zold.and/konyvtarnev/index.html A webszerver fájlrendszerének szintjén ez megfelelhet például a következőnek: * /home/virtual-www/zold.and/htdocs/konyvtarnev/index.html A webszerver gyökere az URL szintjén a következő: * http://zold.and A webszerver fájlrendszerének szintjén: * /home/virtual-www/zold.and/htdocs/ Amikor az URL-ben egy CGI programra hivatkozunk, az a következő lehet: http://zold.and/cgi-bin/pelda.cgi Az esetünkben pelda.cgi nevű CGI programot kéri egy kliens. Miután a webszerver megállapítja, hogy a kért erőforrás egy CGI program, végrehajtja azt és visszaadja a kimenetét a kliensnek. A webszerverenk több dolgot kell figyelembe vennie. * Hol található a kért erőforrás? * A kért erőforrás egy CGI program? * A program végrehajtható? * A program hiba nélkül végrehajtható? * A program kimenet egy érvényes HTML oldal? Ha a válasz mindegyikre igen, akkor a kérés teljesítésre kerül. Ha nem, akkor a webszerver hibát ad vissza. ===== A kérés teljesítése ===== Mint azt fentebb írtam, a CGI programnak meg kell adnia, hogy a visszaadott tartalom milyen típusú lesz, egy ContentType fejléc sorral. Más esetekben a kiszolgáló a típust a kiterjesztésből veszi. Itt viszont ez .cgi, amely különféle tartalmakat generálhat. A típust a MIME szabvánnyal adjuk meg. ^ MIME típusok kivonata ^^ | text/html | HTML dokumentum | | text/plain | Szöveges dokumentum | | image/jpeg | JPEG kép | | image/png | PNG kép | | image/gif | GIF kép | | vodeo/mp4 | MPEG4 vidó | | application/octet-stream | Bináris fájl | Ha a CGI által generált tartalom egy HTML oldal, akkor a content-type fejléc tartalma: Content-type: text/html Ezt az információt a webszerver fogadja, majd más fejlécekkel együtt elküldi a böngészőnek. Content-type: text/html cím Weboldal Vegyük észre, hogy a Content-type sor két üres sorral van elválasztva a tartalomtól. A webszerver ezzel együtt más fejlécsorokat is hozzá szokott adni: 200 OK Connection: close Date: Thu, 30 Feb 2015 19:49:05 CET Server: Apache/2.4.18 Content-Type: text/html Client-Date: Thu, 16 Feb 2015 19:49:05 CET Client-Peer: 190.195.86.50:80 cím Weboldal ===== Adatok átadása a CGI programnak ===== A CGI programok az adatokat webes űrlapokból veszik, vagy az URL-ben van kódolva. ===== Érvek és ellenérvek a CGI mellett ===== ==== Előnyök ==== * cross-platformos technika - a webszerver minden OS-en fut * nyelfüggetlen * például a Perl, Python minden OS-re van * nem szükséges speciális programozói könyvtárak használat * az alapértelmezett be- és kiemenetet használjuk ==== Hátrányok ==== * ha script nyelvet használsz, futási időben mindig fordítani kell a programot. * akkor hatékony ha nem nagy a webszerver forgalma * persze meg lehet írni a programot C nyelven is * nem egyszerű a webprogramozó dolga a webszerveren, ha CGI programot akar írni ===== CGI programozási nyelvek ===== ==== Perl ==== A Perl nyelv domináns szerepet tölt be a CGI programok írásánál. Ez nem jelenti azt, hogy ez a legjobb egy CGI program megírására, de ez a legelterjedtebb, ha CGI-ról van szó. Az elterjedését segítette, hogy azonnal szerkeszthető. CGI.pm modul számos feladat ellátását könnyíti meg ha Perlt használunk. Sok Perl nyelven írt CGI program tölthető le az Internetről. ==== Unix Shell ==== Unix rendszereken gyakori választás. Általában olyanok választják, akik eleve ismerik a Shell programozást, például rendszergazdák. Más nyelvek alkalmasabbak általában komplex CGI program megírására, de Shell szinten sok hasznos parancs állhat eleve a rendelkezésünkre. ==== C nyelv ==== Fő szempont a Script nyelvekkel szemben, hogy nagyon jó teljesítménye van. A program végrehajtás kevesebb időt igényel. A hátránya az, hogy nem CGI specifikus nyelv. A Perl nyelven egy-egy szövegfeldolgozási feladat sokkal kevesebb sorból megoldható, szemben a C-vel. Hiba esetén újra kell fordítani a programot. ==== Python ==== Minden népszerű operációsrendszerre elérhető, mint a Perl nyelv. Általános célú, számos feladatra alkalmas, többek között CGI programozásra is. Számos webes alkalmazást hoztak létre Python nyelven.