Kiolesura cha Kawaida cha Lango (CGI). Kwa nini ninahitaji FastCGI wakati tayari nina PHP, Ruby, Python, Perl, nk? Misingi ya mwingiliano kati ya seva ya Wavuti na hati ya CGI

Mtumiaji anapojaza fomu ya html na kubofya kuwasilisha, data hutumwa kwa seva ya wavuti. Seva ya wavuti, iwe Apache, IIS au nyingine, huendesha programu iliyoainishwa kama thamani sifa ya kitendo. Kwa upande wetu hii ni test.cgi. Seva ya wavuti huendesha test.cgi na kuipitisha vigezo katika mfumo wa mfuatano wa maandishi wenye maudhui yafuatayo: name1=value1&name2=value2&....nameN=valueN, i.e. parameter_name=thamani. Mfuatano huu hupitishwa kwa ingizo la kawaida (STDIN) au kama thamani ya kigezo cha QUERY_STRING cha mazingira. Ipasavyo, mstari huu unaweza kusomwa katika programu kwa moja ya njia mbili:

Katika kesi ya kwanza, vigezo vinapitishwa Mbinu ya POST, na ya pili kwa kutumia njia ya GET. Katika kesi ya kwanza, tunasoma kamba kutoka STDIN. Tunapata urefu wa mstari kutoka kwa thamani ya kigezo cha mazingira CONTENT_LENGTH. Katika pili, huhifadhiwa katika kigeugeu cha mazingira cha QUERY_STRING. Thamani ya utofauti wa mazingira inaweza kupatikana kwa kupiga kazi ya getenv. Njia ambayo mfuatano wa vigezo hupitishwa kwa programu ya CGI inaweza kufafanuliwa kama ifuatavyo: strcmp(getenv("REQUEST_METHOD"),"POST"). Ifuatayo utalazimika kuchanganua kamba na kupata maadili ya parameta inayohitajika. Ili sio lazima kufanya hivi kila wakati, tuliandika maktaba ndogo lakini rahisi sana ya ITCGI kwa kuandika hati za CGI. Maktaba hii hukuruhusu kujiondoa kabisa kutoka kwa njia ambayo vigezo hupitishwa, kutoka kwa usimbaji, kutoka kwa kuchanganua kamba. Unaita tu kazi ya GetParamByName, ambayo unapitisha jina la parameta unayopenda na anwani ya mstari ambapo kuokoa thamani. Maktaba pia hukupa idadi ya vitendaji vya kuandika hati za CGI zenye ufanisi na zisizoweza kuguswa.
Katika hali rahisi, wakati programu yako haihitaji vigezo, hutahitaji kuchanganua na kusimbua kamba mwenyewe, wala kutumia maktaba yetu kwa hili. Mpango rahisi zaidi wa CGI utakuwa: Kichwa ni sehemu inayohitajika. Inapitishwa kwa seva ya wavuti na huamua kinachofuata. Katika hali nyingi, hii ndio kichwa chako kitakuwa. Inaambia seva ya wavuti ni nambari gani ya HTML inakuja ijayo. Tutafahamu aina nyingine za vichwa baadaye. Kichwa kinaweza kuwa na mistari kadhaa. Mwisho wa kichwa unaonyeshwa na mabadiliko mawili kwa mstari mpya- \n\n. Kusanya programu hii na kuweka faili inayoweza kutekelezwa katika saraka ya /cgi-bin ya tovuti yako. Ipe jina upya ili test.cgi. Hati hii inaweza kupatikana moja kwa moja kupitia kivinjari kwa kuandika kwa mstari wa amri URL, kwa mfano, kwangu inaonekana kama hii http://site/cgi-bin/test.cgi Kwa hivyo, kwenye kivinjari chako utaona mstari: "Hujambo, Ulimwengu!"
Ifuatayo tutaangalia programu ya CGI ya aina moja. Haikubali vigezo vyovyote, lakini inazalisha zaidi habari muhimu- orodha na maadili ya anuwai zote za mazingira. Hati hii itakusaidia unapotatua programu zako za CGI kwenye seva mbalimbali za wavuti. Ukweli ni kwamba vigezo vya mazingira hutofautiana kwenye seva tofauti za wavuti. Kwa hivyo, kwa mfano, kwa Seva ya wavuti ya Apache, njia ya saraka ya tovuti imehifadhiwa katika mabadiliko ya mazingira ya DOCUMENT_ROOT. Kwa seva ya wavuti Mtandao wa Microsoft Seva ya Taarifa thamani hii imehifadhiwa katika PATH_TRANSLATED tofauti. KATIKA mfumo wa uendeshaji Hati ya UNIX ya kuonyesha anuwai zote inaonekana kama hii.
#!/bin/sh echo "aina ya maudhui: maandishi/wazi\n\n" mwangwi env
Angalia kichwa cha CGI. Ni tofauti na ile tuliyokuwa nayo katika mfano uliopita. wazi inamaanisha kuwa hati haitatoa nambari ya HTML, lakini maandishi safi. Kivinjari kitaichukulia kama maandishi wazi na pato kama lilivyo. Hakuna haja ya kuchukua nafasi ya herufi maalum kama< на их эквиваленты <. Скопируйте этот скрипт в директорию /cgi-bin с именем env. Установите атрибут 755 (rwxr-xr-x). Вот результат выполнения такого скрипта на моем unix-сервере:
GATEWAY_INTERFACE=CGI/1.1 REMOTE_USER=itsoft REMOTE_ADDR=192.168.34.134 QUERY_STRING= REMOTE_PORT=1781 HTTP_USER_AGENT=Mozilla/4.0 (inayotangamana; MSIE 5.0; Windows 98; DigusDOcal=WWWWWWT_tsoloft) SERVER_SIGNATURE=
Apache/1.3.12 Seva katika itsoft..3.12 (Unix) PHP/3.0.17 HTTP_CONNECTION=Keep-Alive HTTP_COOKIE=/cgi-bin/authenticate.cgi_LAST=956345778 PATH=/sbin:/usr/sbin:/bin:/ usr/bin:/usr/local/sbin: /usr/local/bin:/usr/X11R6/bin HTTP_ACCEPT_LANGUAGE=ru SERVER_PROTOCOL=HTTP/1..226.32.34 SERVER_PORT=80 SCRIPT_NAME=/cgi-bin/web/env SERVER_NAME=tovuti
Programu ya C ya Windows na seva ya wavuti ya Seva ya Habari ya Mtandao itaonekana kama hii:
#pamoja na #pamoja na void main() ( char *text; char str; int length; FILE *in; sprintf(str,"command.com /c set>%s\\temp\\env.dmp",getenv("PATH_TRANSLATED")) ; mfumo(str); sprintf(str,"%s\\temp\\env.dmp", getenv("PATH_TRANSLATED")); katika = fopen(str, "rb"); if(!in) ( printf( "Aina ya maudhui: maandishi/wazi\n\n"Haiwezi" kufungua faili %s.", str); return; ) fseek(katika, 0, SEEK_END); urefu = ftell(in); fseek(katika, 0, SEEK_SET ); maandishi = (char*)malloc(urefu+1); fread(maandishi, 1, urefu, ndani); maandishi = 0; funga(ndani); printf("Aina ya maudhui: maandishi/wazi\n\n% s", maandishi); bure (maandishi); )
Kwanza, endesha amri command.com /c set>c:\www\mysite\temp\env.dmp. Matokeo ya kutekeleza amri kama hiyo itakuwa orodha ya anuwai ya mazingira, ambayo huhifadhiwa kwenye faili. Ifuatayo, tunasoma faili hii na kurudisha yaliyomo kwenye seva ya wavuti. Unaweza kugundua kuwa katika kesi hii, kama katika mfano uliopita, hatuchapishi msimbo wa html, lakini maandishi safi, na kwa hivyo tuna kichwa: Aina-yaliyomo: maandishi/wazi. Usisahau pia kwamba hati hii ya cgi itafanya kazi chini ya Seva ya Habari ya Mtandao tu. Kwa seva ya wavuti ya Apache, unapaswa kuchukua nafasi ya getenv("PATH_TRANSLATED") na getenv("DOCUMENT_ROOT").
Chini ni matokeo ya hati hii kwenye WindowsNT, unaweza kuona ni vigezo ngapi vinavyopatikana kupitia anuwai ya mazingira. Hati kama hiyo ya cgi itakuwa muhimu kwako wakati wa kusanidi hati zako kwenye seva ya mtu mwingine, ambapo anuwai za mazingira zinaweza kutofautiana na zile za karibu nawe. COMSPEC=C:\WINNT\SYSTEM32\COMMAND.COM COMPUTERNAME=JUPITER CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=image/gif, image/x-xbitmap, picha/jpeg, picha/pjpeg, application/vnd.ms-power , application/vnd.ms-excel, applic HTTP_ACCEPT_LANGUAGE=ru HTTP_CONNECTION=Keep-Alive HTTP_HOST=www.oxygensoftware.com HTTP_USER_AGENT=Mozilla/4.0 (inapatana; MSIE 5.01; Windows NT 5.0) HTTP_ACCEPTzipNCSDEVING=off C:\Program Files\Mts\Include INSTANCE_ID=1410 LIB=C:\Program Files\Mts\Lib LOCAL_ADDR=168.144.29.178 NUMBER_OF_PROCESSORS=2 OS2LIBPATH=C:\WINNT\system32\os2\dll; OS=Windows_NT PATH=C:\WINNT\system32;C:\WINNT;C:\Program Files\Mts PATH_TRANSLATED=e:\InetPub\Clients\oxygensoftware.com PATHEXT=.COM;.EXE;.BAT;.CMD; TE_HOST = 194.226.32.34 REQUEST_METHOD=PATA SCRIPT_NAME=/cgi-bin/env.exe SERVER_NAME=www.oxygensoftware.com SERVER_PORT=80 SERVER_PORT_SECURE=0 SERVER_PROTOCOL=HTTP/1.1 SERVER_IOTSYS/EMSTIVE =Microsoft-SOFTWARE=DREMSTIVE=Microsoft. \ WINNT TEMP=C:\temp TMP=C:\temp USERPROFILE=C:\WINNT\Profiles\Mtumiaji Chaguomsingi Ifuatayo, kabla ya kuendelea na uzingatiaji wa hati za cgi zinazokubali na kuchakata vigezo vya kuunda, tutaandika programu rahisi ambayo hutoa vigezo vya fomu ya html ya mstari. Soma hapo juu juu ya jinsi vigezo vya fomu vinasomwa; hapa ninatoa nambari ya chanzo ya programu na matokeo yake kwa fomu ya html iliyoelezewa katika sura ya nne.
#pamoja na #pamoja na batili kuu() ( char* query=NULL; if(!strcmp(getenv("REQUEST_METHOD"),"POST")) ( int len ​​haijasainiwa; len = atoi(getenv("CONTENT_LENGTH")); swala = (char* )malloc(len+1); fread(swali, 1, len, stdin); swala = 0; ) vinginevyo ikiwa(!strcmp(getenv("REQUEST_METHOD"),"GET")) (swali=(char*)malloc (strlen(getenv("QUERY_STRING"))); strcpy(query,getenv("QUERY_STRING")); ) else printf("haijulikani REQUEST_METHOD\n"); printf("Aina ya Maudhui: maandishi/wazi\n\n %s", swala); bure(swali);)
Tunga nambari hii. Ni jukwaa huru, kwa hivyo unaweza kuikusanya chini ya Unix na Windows. Chukua fomu ya HTML kutoka sura ya nne, unaweza kuchukua nyingine yoyote. Katika uwanja wa kitendo, ingiza njia ya programu hii kwenye seva yako ya wavuti. Matokeo baada ya kubofya kitufe cha "Chapisha":
text=zero&text=zero&list=0&list2=0&textarea=%C7%E4%E5%F1%FC+%F2%E5%EA%F1%F2+%EF%EE+%F3%EC%EE%EB%F7%E0%ED%E8 %FE

Huu ni mfuatano ambao una orodha ya vigezo vyote. Kisha, unaweza kutumia maktaba yetu ya ITCGI au uchanganue mfuatano huu wa vigezo mwenyewe. Soma kuhusu maktaba na matumizi yake ya vitendo katika aya inayofuata.

Utangulizi.

Katika makala hii nataka kuzungumza juu ya interface ya CGI kwa ujumla, utekelezaji wake kwa Windows na matumizi ya lugha ya mkutano hasa wakati wa kuandika programu za CGI. Upeo wa kifungu hiki haujumuishi maelezo kamili ya CGI, kwani kuna bahari ya nyenzo kwenye suala hili kwenye mtandao na sioni sababu ya kuelezea tena yote hapa.

NadhariaCGI.

CGI - (Kiolesura cha Kawaida cha Lango) - Kiolesura cha Kawaida cha Lango. Kama unavyoweza kudhani, kiolesura hiki hutumika kama lango kati ya seva (hapa ninamaanisha programu ya seva) na programu fulani ya nje iliyoandikwa kwa OS ambayo seva hii hii inafanya kazi. Kwa hivyo, CGI inawajibika kwa jinsi data itahamishwa kutoka kwa programu ya seva hadi programu ya CGI na kurudi. Kiolesura haitoi vizuizi vyovyote juu ya kile ambacho programu ya CGI inapaswa kuandikwa ndani; inaweza kuwa faili ya kawaida ya kutekelezwa au faili nyingine yoyote - jambo kuu ni kwamba seva inaweza kuiendesha (katika mazingira ya Windows, kwa mfano, inaweza kuwa faili iliyo na kiendelezi kilichofungwa kwa programu yoyote).

Kuanzia wakati ulipopiga simu (kwa mfano, ulibofya kitufe cha fomu ambacho simu ya programu ya CGI imeambatishwa) mpango wa CGI hadi upokee matokeo kwenye dirisha la kivinjari chako, yafuatayo hufanyika:

Mteja wa wavuti (kama vile kivinjari) huunda muunganisho kwa seva iliyobainishwa kwenye URL;

Mteja wa wavuti hutuma ombi kwa seva, ombi hili kawaida hufanywa kwa kutumia njia mbili za GET au POST;

Data kutoka kwa ombi la mteja (kwa mfano, maadili ya uwanja wa fomu) hupitishwa na seva, kwa kutumia interface ya CGI, kwa programu ya CGI iliyotajwa kwenye URL;

Mpango wa CGI huchakata data ya mteja iliyopokelewa kutoka kwa seva na, kwa kuzingatia usindikaji huu, hutoa majibu kwa mteja, ambayo husambaza kupitia interface sawa ya CGI kwa seva, na, kwa upande wake, huipeleka moja kwa moja kwa mteja;

Seva hufunga muunganisho na mteja.

Vipimo vya kawaida vya CGI huchukulia kuwa seva inaweza kuwasiliana na programu kwa njia zifuatazo:

Vigezo vya mazingira - vinaweza kuwekwa na seva wakati programu inapoanza;

Mkondo wa pembejeo wa kawaida (STDIN) - kwa msaada wake, seva inaweza kuhamisha data kwenye programu;

Mkondo wa pato la kawaida (STDOUT) - programu inaweza kuandika matokeo yake ndani yake, ambayo hupitishwa kwa seva;

Mstari wa amri - ndani yake seva inaweza kupitisha baadhi ya vigezo kwenye programu.

Mito ya kawaida ya pembejeo / pato ni rahisi sana na hutumiwa sana kwenye mifumo ya UNIX, ambayo haiwezi kusema kuhusu Windows, kwa hiyo kuna vipimo vya CGI vilivyotengenezwa mahsusi kwa mifumo ya Windows, inayoitwa "Windows CGI". Lakini, bila shaka, mitiririko ya kawaida ya pembejeo / pato inaweza pia kutumika katika programu ya CGI ya windows. Hapa sitagusa kiwango cha "Windows CGI", na kuna angalau sababu mbili za hii - ya kwanza, na muhimu zaidi, ni kwamba kwa sasa sio seva zote za http za Windows zinazounga mkono uainishaji huu (haswa, ninayopenda zaidi. Apache 1.3.19) . Unaweza kuona sababu ya pili kwa kuandika "Windows CGI" katika injini yoyote ya utafutaji. Nitazingatia maelezo ya jumla tu kuhusu kiolesura hiki - data zote kutoka kwa seva hadi kwa mteja huhamishwa kupitia faili ambayo ni ya kawaida kwa Windows * .ini, jina ambalo hupitishwa kwa programu kwenye mstari wa amri. Katika hali hii, data yote kwenye faili tayari imegawanywa kwa uangalifu katika sehemu na seva na unachotakiwa kufanya ni kutumia vitendaji vya "GetPrivateProfile*" ili kuzitoa kutoka hapo. Jibu linatumwa kwa seva tena kupitia faili ambayo jina lake limeonyeshwa kwenye ingizo linalolingana kwenye faili ya ini.

Je, ni data gani inayoweza kuhamishwa na mteja kwenye programu ya CGI? - karibu yoyote. Kwa ujumla, programu hupitishwa maadili ya uwanja wa fomu ambao mteja hujaza, lakini pia inaweza kuwa aina fulani ya data ya binary, kwa mfano, faili iliyo na picha au muziki. Data inaweza kuhamishwa kwa seva kwa njia mbili tofauti - njia ya GET na njia ya POST. Tunapounda fomu ya kujaza kwenye ukurasa wetu, tunaonyesha kwa uwazi ni ipi kati ya mbinu zilizotolewa tunataka kutuma data iliyoingizwa na mtumiaji, hii inafanywa katika lebo kuu ya fomu kitu kama hiki:

pata action="/cgi-bin/name_script">

Wakati wa kutuma data kwa kutumia mbinu ya GET, kivinjari husoma data kutoka kwa fomu na kuiweka baada ya URL ya hati, ikifuatiwa na alama ya swali; ikiwa kuna sehemu kadhaa muhimu katika fomu, basi zote hupitishwa kupitia "&" saini, jina la uwanja na thamani yake imeandikwa kwenye URL kupitia ishara "="" Kwa mfano, ombi linalotolewa na kivinjari kutoka kwa fomu unapobofya kitufe ambacho hati "/cgi-bin/test.exe" imeambatishwa, kwa kuzingatia kwamba sehemu ya kwanza ya fomu inaitwa "your_name" , ya pili - "umri_wako", inaweza kuonekana kama hii:

PATA /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0

Kutumia njia ya GET ina udhaifu kadhaa - ya kwanza na muhimu zaidi ni kwa sababu Data hupitishwa katika URL, basi ina kikomo kwa kiasi cha data hii iliyopitishwa. Udhaifu wa pili unafuata tena kutoka kwa URL - hii ni usiri, na uhamishaji kama huo data inabaki wazi kabisa. Kwa hiyo, ni vizuri ikiwa tuna mashamba madogo 2-3 katika fomu ... swali linatokea, nini cha kufanya ikiwa kuna data zaidi? Jibu ni kutumia njia ya POST!

Wakati wa kutumia njia ya POST, data hupitishwa kwa seva kama kizuizi cha data, na sio katika URL, ambayo kwa kiasi fulani huweka mikono yetu ili kuongeza kiwango cha habari inayopitishwa; kwa mfano hapo juu wa fomu ya POST, kizuizi kilitumwa. kwa seva itakuwa kitu kama hiki:

POST /cgi-bin/test.exe HTTP/1.0

Kubali: maandishi/wazi

Kubali: maandishi/html

Kubali: */*

Aina ya maudhui: application/x-www-form-urlencoded

Urefu wa yaliyomo: 36

jina_lako=Pupu&umri_wako=90

Kama ilivyoelezwa hapo juu, baada ya kupokea data, seva lazima ibadilishe na kuipitisha kwa programu ya CGI. Katika vipimo vya kawaida vya CGI, ingizo la mteja kwa ombi la GET linawekwa na seva katika muundo wa mazingira wa programu "QUERY_STRING". Ombi la POST linapofanywa, data huwekwa kwenye mkondo wa kawaida wa uingizaji wa programu, ambapo inaweza kusomwa nayo. Kwa kuongeza, kwa ombi kama hilo, seva huweka vigezo viwili zaidi vya mazingira - CONTENT_LENGTH na CONTENT_TYPE, ambayo mtu anaweza kuhukumu urefu wa ombi kwa byte na maudhui yake.

Kwa kuongezea data yenyewe, seva pia huweka anuwai za mazingira ya programu inayoitwa; hapa kuna baadhi yao:

REQUEST_METHOD

Inaeleza hasa jinsi data ilipatikana

Mfano:REQUEST_METHOD=GET

QUERY_STRING

Mfuatano wa hoja ikiwa mbinu ya GET ilitumika

Mfano:QUERY_STRING= your_name=Pupkin&your_age=90&hobby=asm

CONTENT_LENGTH

Urefu katika baiti za mwili wa ombi

Mfano:CONTENT_LENGTH=31

CONTENT_TYPE

Omba aina ya mwili

GATEWAY_INTERFACE

Toleo la itifaki ya CGI

Mfano:GATEWAY_ INTERFACE= CGI/1.1

REMOTE_ADDR

Anwani ya IP ya seva pangishi ya mbali, yaani, mteja aliyebofya kitufe katika fomu

Mfano:REMOTE_ADDR=10.21.23.10

REMOTE_HOST

Jina la mwenyeji wa mbali, hili linaweza kuwa jina la kikoa chake au, kwa mfano, jina la kompyuta katika mazingira ya Windows; ikiwa haya hayawezi kupatikana, basi uwanja una IP yake.

Mfano:REMOTE_HOST=wasm.ru

SCRIPT_NAME

Jina la hati iliyotumiwa katika ombi.

Mfano:SCRIPT_NAME=/cgi-bin/gols.pl

SCRIPT_FILENAME

Jina la faili ya hati kwenye seva.

Mfano:SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl

MTUMISHI _ SOFTWARE

Programu ya seva

Mfano: Apache/1.3.19 (SHINDA32)

Kwa ujumla, hii yote ni kwa kifupi, kwa maelezo zaidi kuhusu Kiolesura cha Kawaida cha Lango, angalia nyaraka maalum, nilifanya maelezo haya ili kukukumbusha, na ikiwa hujui, basi kukuletea hadi sasa. Hebu jaribu kufanya kitu kwa vitendo.

Sehemu ya vitendo.

Kwa mazoezi, tutahitaji angalau vitu 3 - aina fulani ya seva ya http kwa Windows, nilijaribu mifano yote kwenye Apache 1.3.19 kwa Windows, seva ni bure, unaweza kuipakua kutoka http://httpd.apache. org/download.cgi . Ndio, na tutahitaji seva, sio seva yoyote tu, lakini iliyosanidiwa kuendesha hati za CGI! Tazama hati za jinsi ya kufanya hivi kwa seva unayotumia. Jambo la pili tunalohitaji ni, kwa kweli, mkusanyaji; inahitajika pia kwamba mkusanyaji aunge mkono uundaji wa programu za koni za WIN32, ninatumia Tasm, lakini Fasm na Masm na *asms zingine nyingi ni kamili. Na hatimaye, jambo muhimu zaidi ni kwamba tamaa hii inahitajika.

Kwa hivyo, nadhani seva iliwekwa kwa ufanisi na kusanidiwa na wewe, ili katika saraka ya mizizi ya nyaraka za seva kuna index.html faili, ambayo inaonyeshwa kikamilifu kwenye kivinjari unapoandika anwani http://127.0. .0.1. Pia nitazingatia kwamba mahali fulani katika jungle la folda za seva kuna folda ya "cgi-bin" ambayo maandiko yanaruhusiwa kukimbia.

Hebu tuangalie mipangilio ya seva, na wakati huo huo kuandika script ndogo. Hati yetu itakuwa faili ya kawaida ya *.bat. Ninaona maswali - vipi? kweli? Ndio, hii ni faili ya batch ya kawaida, kama ilivyotajwa hapo juu, uainishaji wa CGI hautofautishi kati ya aina za faili, jambo kuu ni kwamba seva inaweza kuiendesha, na, kwa upande wake, ina ufikiaji wa stdin/stdout na anuwai za mazingira, faili ya bat, hata sio kikamilifu, lakini kwa mfano itatufaa vizuri. Wacha tuunde faili iliyo na takriban maudhui yafuatayo:

@echo off rem Ombi la kichwa echo aina ya Maudhui: maandishi/html mwangwi. omba mwangwi wa mwili" Habari!
mwangwi "Ombi la GET lilituma data ifuatayo: %QUERY_STRING%

Wacha tuite faili test.bat na kuiweka kwenye saraka ya hati zinazoendesha, uwezekano mkubwa itakuwa saraka ya "cgi-bin". Jambo linalofuata tunalohitaji kufanya ni kuita hati hii kwa njia fulani, kimsingi, hii inaweza kufanywa moja kwa moja kwa kuandika kitu kama kifuatacho "http://127.0.0.1/cgi-bin/test.bat" kwenye anwani ya kivinjari. dirisha, lakini hebu tuiite kutoka kwa ukurasa wetu kuu, na wakati huo huo angalia uendeshaji wa njia ya GET. Wacha tuunde index.html ya faili kwenye mzizi wa seva na yaliyomo yafuatayo:

Ingiza data ili kuhamisha kwa seva:
Data:


Sasa, unapoingia seva (http://127.0.0.1 kwenye upau wa anwani ya kivinjari), fomu inapaswa kuonekana, andika kitu ndani yake na ubofye kitufe cha "tuma", ikiwa kila kitu kilifanyika kwa usahihi, utaona majibu. kutoka kwa bat- kwenye hati ya dirisha la kivinjari. Sasa hebu tuone kile tulichofikia hapo.

Kama unavyoweza kukisia, amri ya "echo" hutoa matokeo kwa stdout; kwanza kabisa, tunapitisha kichwa cha majibu yetu kwa seva - "aina ya Yaliyomo mwangwi: maandishi/html". Hiki ni kichwa cha kawaida cha vipimo vya CGI, kikionyesha kwamba tunataka kuhamisha maandishi au hati ya html; kuna vichwa vingine. Jambo muhimu sana ni kichwa. lazima ikitenganishwa na kikundi cha majibu kwa laini tupu, ambayo ndiyo tunafanya kwa amri ifuatayo ya "echo". Ifuatayo, sehemu ya majibu yenyewe hupitishwa - hii ni hati ya kawaida ya html. Katika mwili wa hati, kwa uwazi, ninaonyesha mojawapo ya vigeu vya mazingira vilivyopitishwa kwetu na seva - "QUERY_STRING", kama ilivyotajwa tayari. njia ya GET (na hii ndio kesi yetu), kila kitu hupitishwa katika data hii iliyoingizwa na mtumiaji, ambayo tunaweza kuona katika majibu ya hati. Labda umegundua "alama za nukuu hazipo mahali" katika mistari 2 ya mwisho ya faili, mara tu baada ya "echo", ziko hapo kwa sababu ya upendeleo wa faili za popo, kwani unaweza kuona lebo za html zimezungukwa na wahusika "<» и «>", wakati huo huo, alama hizi hutumika kama uelekezaji wa pembejeo/pato katika faili za popo, na kwa hivyo hatuwezi kuzitumia kwa uhuru hapa.

Ninapendekeza kucheza kidogo na maandishi kama hayo ya popo, inaweza kuwa muhimu sana, jaribu kuangalia anuwai za mazingira. Nitasema kidogo, nikitoka kwenye mada, kwenye mifumo ya UNIX, lugha za mkalimani wa amri zimekuzwa sana na mstari kati ya programu katika lugha ya mkalimani wa amri na programu katika lugha ya "halisi" ya programu ni wazi sana. baadhi ya matukio, hivyo hati rahisi mara nyingi huandikwa kwenye mifumo ya UNIX hasa katika lugha za mkalimani wa amri, lakini mkalimani wa Windows cmd.exe au, mapema, command.com ni wazi dhaifu kwa madhumuni haya.

Sasa hebu tuendelee kwenye kazi muhimu zaidi ya makala hii, kwa kweli kuandika programu ya CGI katika mkusanyiko. Kimsingi, ikiwa tutazingatia yote hapo juu kuhusu CGI, tunaweza kupata hitimisho kuhusu kile kiolesura cha CGI kinahitaji kutoka kwa programu yetu:

2. Programu lazima iweze kuandika kwa mkondo wa pato la kawaida (stdout) ili kusambaza matokeo ya kazi yake kwa seva;

3. Kutoka kwa pointi mbili za kwanza inafuata kwamba ili seva itume kitu kwa programu yetu katika stdin, na ili kuijibu katika stdout, programu ya CGI lazima iwe maombi ya console;

Hii inatosha kuunda programu kamili ya CGI.

Hebu tuanze na hatua ya mwisho. Ili kupata ufikiaji wa anuwai ya mazingira ya programu ya Windows, kazi ya API "GetEnvironmentStrings" inatumiwa, chaguo la kukokotoa halina hoja na inarudisha kiashiria kwenye safu ya anuwai ya mazingira (NAME=VALUE) iliyotenganishwa na sifuri, safu imefungwa na. sifuri mara mbili, wakati programu inapozinduliwa na seva katika mazingira ya programu kwa kuongeza vijiti vya kawaida, anuwai maalum za CGI zilizoelezewa hapo juu huongezwa; unapoendesha programu kutoka kwa safu ya amri, hautaziona, kwa asili.

Ili kuandika kitu kwa stdout au kusoma kutoka stdin, tunahitaji kwanza kupata vipini vya mitiririko hii, hii inafanywa kwa kutumia kazi ya API "GetStdHandle", moja ya maadili yafuatayo hupitishwa kama parameta ya kazi:

STD_INPUT_HANDLE - kwa stdin (pembejeo ya kawaida);

STD_OUTPUT_HANDLE - kwa stdout (matokeo ya kawaida);

STD_ERROR_HANDLE - kwa stderr.

Chaguo la kukokotoa litarudisha kishiko tunachohitaji kwa shughuli za kusoma/kuandika. Kitu kinachofuata tunachohitaji kufanya ni kuandika/kusoma mipasho hii. Hii inafanywa na shughuli za kawaida za kusoma / kuandika faili, i.e. ReadFile na AndikaFile. Kuna ujanja mmoja hapa, unaweza kufikiria kuwa AndikaConsole/ReadConsole inaweza kutumika kwa madhumuni haya, lakini hii ni kweli kwa consoles na itafanya kazi vizuri, matokeo, kama vile WriteFile, yatatolewa kwa koni, lakini hii itaendelea hadi tutakapoendesha programu yetu kama hati kwenye seva. Hii hutokea kwa sababu programu yetu inapozinduliwa na seva, vishikizo vinavyorejeshwa na chaguo la kukokotoa la "GetStdHandle" havitakuwa tena vishikizo vya kiweko, vitakuwa vipini vya bomba, ambayo ni muhimu kwa kuunganisha programu mbili.

Hapa kuna mfano mdogo wa jinsi programu ya CGI inapaswa kuonekana katika lugha ya kusanyiko; nadhani haitakuwa ngumu sana kuisuluhisha:>

386 .mfano gorofa,stdcall includelib import32.lib .const PAGE_READWRITE = 4h MEM_COMMIT = 1000h MEM_RESERVE = 2000h STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 nje ya data . hStdin dd ? hMem dd ? kichwa: db "Aina ya Maudhui: maandishi/html",13,10,13,10,0 start_html: db " Mazingira ya programu ya CGI yanaonekana kama hii:
",13,10,0 kwa_stdin: db" STDIN ya programu ina:
",13,10,0 mwisho_html: db"

",13,10,0 nwritten dd ? toscr db 10 dup (32) db " - Aina ya faili",0 .code _start: xor ebx,ebx call GetStdHandle,STD_OUTPUT_HANDLE mov hStdout,eax call GetStdHandle,STD_INPUTx call write_stdout, offset header call write_stdout, offset start_html call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE mov hMem,eax mov edi,eax call GetEnvironmentStringsA mov esi,eax next_string,al string,moal_symbol: : cmpsb jmp fupi next_symbol end_string: mov ,">rb<" add edi,3 cmp byte ptr ,0 jnz next_string inc edi stosb call write_stdout, hMem call write_stdout, offset for_stdin call GetFileSize,,ebx mov edi,hMem call ReadFile,,edi, eax,offset nwritten, ebx add edi, mov byte ptr ,0 call write_stdout, hMem call write_stdout, offset end_html call VirtualFree,hMem call ExitProcess,-1 write_stdout proc bufOffs:dword call lstrlen,bufOffs call WriteFile,,bufOffs,eax,offset nwritten,0 ret write_stdout endp extrn GetEnvironmentStringsA:near extrn GetStdHandle:near extrn ReadFile:near extrn WriteFile:near extrn GetFileSize:near extrn VirtualAlloc:near extrn VirtualFree:near extrn ExitProcess:near extrn lstrlen:near ends end _start

Faili inayoweza kutekelezwa imejengwa na amri:

tasm32.exe /ml test.asm

tlink32.exe /Tpe /ap /o test.obj

Usisahau kwamba programu lazima iwe programu ya console.

Hifadhi na programu.

Unaweza kupiga programu hii kwa kutumia fomu ya html iliyoelezwa hapo juu, unahitaji tu kubadilisha jina test.bat katika fomu ya test.exe na kuinakili kwa /cgi-bin/ ipasavyo, unaweza kuiweka POST kwa njia ya ombi. , programu huichakata.

Pia nataka kutambua kwamba unaweza kuita programu kwa njia nyingine, unaweza kuunda faili kwenye saraka ya cgi-bin, kwa mfano test.cgi, na mstari mmoja "#!c:/_path_/test.exe" na iite kwa maombi, na seva kwa upande wake, itasoma mstari wake wa kwanza na kuzindua faili ya exe; kwa hili, ni muhimu kwamba kiendelezi cha *.cgi kibainishwe katika mipangilio ya seva ya http kama kiendelezi cha hati. Kwa njia hii, seva itazindua programu yetu na safu ya amri "test.exe path_to_test.exe" hii ina faida kadhaa - ya kwanza ni kwamba mtu anayeendesha hati yetu hata hata nadhani hati imeandikwa ndani, ya pili ni. kwamba inapitishwa kwetu jina la faili na laini yetu, tunaweza, kwa mfano, kuongeza mipangilio yoyote ya hati yetu kwenye faili hii, ambayo hurahisisha utatuzi, kwa njia, hivi ndivyo wakalimani wote hufanya kazi - labda umegundua. kwamba katika programu zote za perl/php/etc kuna mstari sawa - unaoonyesha mkalimani wa amri yenyewe. Kwa hivyo, seva inapoanza programu ya cgi, ikiwa ugani wa programu umesajiliwa kama hati katika mipangilio, inasoma mstari wa kwanza wa faili, na ikiwa inageuka kuwa katika muundo ulioelezwa hapo juu, basi inazindua programu. iliyoainishwa kwenye mstari na jina la faili hii ikifuatiwa na nafasi, wacha tuseme kwamba katika Mtafsiri wa lulu ameonyeshwa kwenye mstari; baada ya kupokea zawadi kama hiyo, huanza utekelezaji wake, kwa sababu Maoni katika Perl ni ishara ya "#", kisha inaruka mstari wa kwanza na script inaendelea kutekelezwa, kwa ujumla ni jambo rahisi.

Hiyo ndiyo yote nilitaka kuandika kuhusu, sijui jinsi yote haya yatakuwa na manufaa kwako, lakini nitasema kuwa nina seva ya intranet inayoendesha kwa kutumia maandishi ya mkusanyiko. Ninakiri, hakukuwa na sababu kubwa ya kufanya hivi, lakini hata hivyo, nilifanya mwanzoni kwa sababu za urembo na kusitasita kujifunza lulu/php au kitu kingine. LAKINI sikukatishi tamaa ya kujifunza Pearl, lakini kinyume chake, nitasema kwamba ni muhimu kufanya hivyo, na hata ni lazima sana, nilitambua hili baadaye, lakini bado nadhani kwamba kwenye seva zilizojaa sana, ambapo kasi ya utekelezaji, upakiaji na kiasi cha kumbukumbu ulichukua na maombi ina jukumu scripts cgi iliyoandikwa katika assembler itachukua nafasi yao halali.



Kiolesura cha Kawaida cha Lango (CGI, Kiolesura cha Kawaida cha Lango cha Kirusi) ni mbinu ya kawaida ya kudhibiti maudhui ya kurasa za wavuti kwa kutumia programu maalum zinazoendeshwa kwenye upande wa seva ya wavuti. Programu hizi huitwa washughulikiaji wa CGI au lango, lakini mara nyingi zaidi - hati za CGI, kwa sababu ... kwa kawaida huandikwa katika lugha za uandishi, hasa Perl.

Kwa sababu matini asilia ni tuli, ukurasa wa wavuti hauwezi kuingiliana moja kwa moja na mtumiaji. Kabla ya ujio wa JavaScript, hakukuwa na njia nyingine ya kujibu vitendo vya mtumiaji isipokuwa kupitisha data waliyoingiza kwenye seva ya wavuti kwa usindikaji zaidi. Katika kesi ya CGI, usindikaji huu unafanywa kwa kutumia programu za nje na maandiko, ambayo yanapatikana kwa njia ya kawaida (angalia RFC 3875: CGI Version 1.1) interface - lango la kawaida. Mfano uliorahisishwa unaoonyesha utendakazi wa CGI umeonyeshwa kwenye Mtini. 1.

Je, CGI inafanya kazi vipi?

Algorithm ya jumla ya kufanya kazi kupitia CGI inaweza kuwasilishwa kama ifuatavyo:

  1. Mteja huomba ombi la CGI kwa kutumia URI yake.
  2. Seva ya wavuti inakubali ombi na kuweka vigezo vya mazingira, kupitia ambayo data na maelezo ya huduma hupitishwa kwa programu.
  3. Seva ya wavuti huelekeza upya maombi kupitia ingizo la kawaida (stdin) kwa ingizo la programu inayoitwa.
  4. Programu ya CGI hufanya shughuli zote muhimu na hutoa matokeo kama HTML.
  5. Maandishi ya hypertext yanayotokana yanarejeshwa kwa seva ya wavuti kupitia mkondo wa kawaida wa pato (stdout). Ujumbe wa hitilafu hutumwa kupitia stderr.
  6. Seva ya wavuti hupitisha matokeo ya ombi kwa mteja.

Maombi ya CGI

Kazi ya kawaida ambayo CGI hutumiwa ni kuundwa kwa kurasa zinazoingiliana, maudhui ambayo inategemea vitendo vya mtumiaji. Mifano ya kawaida ya kurasa hizo za wavuti ni fomu ya usajili wa tovuti au fomu ya maoni. Sehemu nyingine ya matumizi ya CGI, iliyobaki nyuma ya pazia ya mwingiliano wa watumiaji, inahusishwa na ukusanyaji na usindikaji wa habari kuhusu mteja: kuweka na kusoma "vidakuzi"; kupata data kuhusu kivinjari na mfumo wa uendeshaji; kuhesabu idadi ya ziara kwenye ukurasa wa wavuti; ufuatiliaji wa trafiki ya wavuti, nk.

Uwezo huu hutolewa na ukweli kwamba hati ya CGI inaweza kushikamana na hifadhidata au kufikia mfumo wa faili wa seva. Kwa hivyo, hati ya CGI inaweza kuhifadhi habari katika jedwali la hifadhidata au faili na kuzipata kutoka hapo kwa ombi, ambazo haziwezi kufanywa kwa kutumia HTML.

TAFADHALI KUMBUKA: CGI si lugha ya programu! Ni itifaki rahisi ambayo inaruhusu seva ya wavuti kupitisha data kupitia stdin na kuisoma kutoka kwa stdout. Kwa hivyo, programu yoyote ya seva inayoweza kufanya kazi na mitiririko ya kawaida ya pembejeo/pato inaweza kutumika kama kidhibiti cha CGI.

Salamu, Dunia!

Mfano wa hati rahisi ya CGI katika Perl imeonyeshwa katika Orodha ya 1. Ukihifadhi msimbo huu katika faili inayoitwa hello (jina linaweza kuwa chochote, kiendelezi kinaweza kuwa sawa), weka faili kwenye saraka ya seva ya cgi-bin. (kwa usahihi zaidi, katika saraka hiyo ya seva ya wavuti , ambayo imekusudiwa kwa matumizi ya CGI na imeainishwa katika mipangilio ya seva ya wavuti) na kuweka haki za utekelezaji za faili hii (chmod uo+x hujambo), basi itapatikana kwa anwani kama http. ://servername/cgi-bin/hello.

Kuorodhesha 1. Mfano hati ya CGI (Perl)

#!/usr/bin/perl chapisha "Aina ya Maudhui: maandishi/html\n\n"; chapa< CGI sema Hello

Salamu, Dunia!



Toka kwa HTML;

Katika nambari hii, mstari #!/usr/bin/perl unabainisha njia kamili ya mkalimani wa Perl. Mstari wa aina ya Maudhui: text/html\n\n ni kichwa cha http kinachobainisha aina ya maudhui (aina ya mime). Herufi ya kukatika kwa mistari miwili (\n\n) inahitajika; inatenganisha vichwa na sehemu kuu ya ujumbe.

Vigezo vya Mazingira

Programu zote za CGI zinaweza kufikia vigezo vya mazingira vilivyowekwa na seva ya wavuti. Vigezo hivi vina jukumu muhimu wakati wa kuandika programu za CGI. Jedwali linaorodhesha baadhi ya vigeu vinavyopatikana kwa CGI.

Tofauti ya mazingiraMaelezo
CONTENT_TYPE Aina ya data iliyotumwa kwa seva. Hutumika wakati mteja anatuma data, kama vile kupakua faili.
CONTENT_LENGTHOmba ukubwa wa maudhui. Tofauti hii inafafanuliwa kwa maombi ya POST.
HTTP_COOKIEHurejesha seti ya vidakuzi kama jozi za thamani-msingi.
HTTP_USER_AGENTMaelezo ya wakala wa mtumiaji (kivinjari).
PATH_INFONjia ya saraka ya CGI
QUERY_STRINGMfuatano wa hoja (URL-iliyosimbwa) hupitishwa na mbinu ya GET.
REMOTE_ADDRAnwani ya IP ya mteja anayetuma ombi.
REMOTE_HOSTJina kamili (FQDN) la mteja. (Ikiwa inapatikana)
REQUEST_METHODNjia ambayo ombi linatekelezwa. Mara nyingi PATA au POST.
SCRIPT_FILENAMENjia kamili ya hati iliyoombwa (katika mfumo wa faili wa seva).
SCRIPT_NAMEJina la hati
SERVER_NAMEJina la seva
SERVER_ADDRAnwani ya IP ya seva
SERVER_SOFTWARETaarifa kuhusu programu ya seva

Orodha ya 2 inaonyesha nambari ya programu ndogo ya Perl inayochapisha orodha ya anuwai ya mazingira. Matokeo ya kazi yake yanaonyeshwa kwenye Mtini. 2.

Kuorodhesha 2. Vigezo vya mazingira

#!/usr/bin/perl chapisha "Aina ya Maudhui: maandishi/html\n\n"; chapa" \n \n

Mazingira

\n"; foreach (panga vitufe %ENV) ( chapisha " $_: $ENV($_)
\n"; ) chapisha "

\n"; Utgång;

Uhamisho wa data: Mbinu ya GET

Mbinu ya GET inatumika kupitisha data iliyo na msimbo kupitia mfuatano wa hoja. Anwani ya rasilimali iliyoombwa (hati ya CGI) na data iliyohamishiwa kwayo hutenganishwa na ishara "?". Mfano wa anwani kama hii:

http://example.com/cgi-bin/script.cgi?key1=value1&key2=value2

Mbinu ya GET hutumiwa kwa chaguo-msingi kwa data iliyoingizwa kwenye upau wa anwani wa kivinjari. Kamba sawa inaweza kuzalishwa wakati wa kutuma data kutoka kwa fomu ya wavuti (tag

) ikiwa mbinu ya kuwasilisha fomu haijabainishwa. Taarifa zote zinazotumwa na mbinu ya GET hutumwa kwa maandishi wazi, kwa hivyo hupaswi kamwe kuzitumia kutuma nenosiri au taarifa nyingine sawa kwa seva. Mbinu ya GET ina kikomo cha ukubwa: mfuatano wa hoja lazima usiwe na zaidi ya vibambo 1024.

Taarifa zinazotumwa na mbinu ya GET hutumwa katika kichwa cha QUERY_STRING kama mfuatano unaojumuisha jozi za fomu. ufunguo=thamani, hati ya CGI inaweza kuipata kupitia utofauti wa mazingira wa jina moja.

Kuorodhesha 3. Kutuma data kutoka kwa fomu ya wavuti kwa kutumia mbinu ya GET

Uandishi rahisi wa CGI: Kutuma data kwa kutumia njia ya GET Jina lako: jina = "mtumiaji">
Unatoka wapi?: jina = "kutoka">



Baada ya kuingiza data kwenye fomu kutoka kwa Orodha ya 3 na kubofya kitufe cha "Wasilisha", kamba ya hoja kama hii itatolewa:

http://example.com/cgi-bin/ sema hello?mtumiaji=maandishi fulani&kutoka=maandishi mengine

wapi: sayhello - jina la hati ya CGI; mtumiaji na kutoka ni majina ya vigezo; maandishi fulani na maandishi mengine ni maadili yaliyoingizwa na mtumiaji ya vigezo vinavyolingana.

Kuorodhesha 4 ni mfano wa hati ambayo inaweza kuchakata data ya fomu kutoka kwa Orodha ya 3.

Kuorodhesha 4. Kutuma data kutoka kwa fomu ya wavuti kwa kutumia mbinu ya GET

#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # Changanua mazingira $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; ikiwa ($ENV(" REQUEST_METHOD") eq" PATA") ( $bafa = $ENV(" QUERY_STRING"); ) # Gawanya kamba ya hoja katika jozi za ufunguo/thamani @pairs = split(/&/, $buffer); foreach $pair (@pairs) ( ($name, $value) = split(/=/, $ jozi); thamani ya $ =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM($name) = thamani ya $; # Tunahifadhi data katika safu) # Tuma chapisho cha kichwa "Aina ya Yaliyomo: maandishi/html\n\n"; # Tuma chapa ya maandishi makubwa< CGI sema Hello

Hujambo, $FORM(mtumiaji) kutoka $FORM(kutoka)!



Toka kwa HTML;

Uhamisho wa data: Mbinu ya POST

Kwa ujumla, njia ya POST inafaa zaidi kwa kupitisha habari kwa hati ya CGI. Kizuizi cha data iliyopitishwa huundwa kwa njia sawa na kwa njia ya GET, lakini maambukizi halisi yanafanywa katika mwili wa ombi. Data huingia kwenye programu ya CGI kupitia uingizaji wa kawaida (stdin).

Ili kutuma data kwa kutumia mbinu hii, lazima ibainishwe kwa uwazi katika maelezo ya fomu (action="POST").

Ili kuchakata ingizo, hati ya CGI lazima isomeke stdin, na ili kufanya hivi kwa usahihi, inahitaji kujua ukubwa wa ujumbe kutoka kwa tofauti ya CONTENT_LENGTH. Ili kuonyesha hili, wacha turekebishe kizuizi cha uchambuzi wa mazingira katika Orodha ya 4 kwa kuibadilisha na nambari ifuatayo:

... # Changanua mazingira $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; ikiwa ($ENV(" REQUEST_METHOD") eq" POST")( soma ( STDIN, $bafa, $ENV(" CONTENT_LENGTH"}); } ...

Usindikaji zaidi wa vigezo na thamani zao zilizohifadhiwa katika tofauti ya $bafa hufanywa kwa njia sawa na wakati wa kutumia mbinu ya GET.

Faida za CGI

Uwezo mwingi wa CGI sasa umenakiliwa na teknolojia kama vile DHTML, ActiveX au applets za Java. Faida kuu za kutumia maandishi ya seva ni kwamba unaweza kuwa na uhakika kwamba wateja wote (isipokuwa nadra, kawaida huhusishwa na kuzuia ufikiaji wa rasilimali fulani kwenye kiwango cha firewall) wataweza kufanya kazi na programu ya seva. Programu za mteja zinaweza kuzimwa tu kwenye kivinjari, au hazitumiki kabisa.

Hasara za CGI

Hasara kubwa ya teknolojia hii ni kuongezeka kwa mahitaji ya utendaji wa seva ya wavuti. Ukweli ni kwamba kila simu kwa ombi la CGI husababisha kuibuka kwa mchakato mpya, pamoja na mhudumu wote. Ikiwa maombi imeandikwa na makosa, basi hali inawezekana wakati, kwa mfano, inaingia kwenye kitanzi. Kivinjari kitazima muunganisho wakati muda wa kuisha umekwisha, lakini kwa upande wa seva mchakato utaendelea hadi msimamizi alazimishe kusitishwa. Katika suala hili, scripts za mteja zina faida kubwa, kwa sababu wananyongwa ndani ya nchi.

Ubaya mwingine wa CGI ni kwamba seva ya wavuti haina usalama mdogo kuliko suluhisho zingine. Kuweka kwa usahihi haki za ufikiaji kwa rasilimali za seva kutoka kwa programu ya CGI kunaweza kuhatarisha sio tu utendakazi wa seva ya wavuti, lakini pia usalama wa habari. Hata hivyo, teknolojia yoyote ya mtandao inaweza kuchukuliwa kuwa si salama kwa ufafanuzi.

Anwani ya kudumu ya ukurasa huu:

Shukrani kwa Mtandao Wote wa Ulimwenguni, karibu mtu yeyote anaweza kutoa taarifa mtandaoni kwa njia ambayo ni rahisi machoni na inaweza kusambazwa kwa wingi. Bila shaka umepitia Mtandao na kuona tovuti zingine, na sasa pengine unajua kwamba vifupisho vya kutisha kama "HTTP" na "HTML" ni mkato wa "Wavuti" na "njia ya maelezo yanavyoonyeshwa kwenye Mtandao." Huenda tayari una uzoefu wa kuwasilisha taarifa kwenye Mtandao.

Mtandao umethibitika kuwa njia bora ya kusambaza habari, kama inavyoonekana kutokana na umaarufu wake mkubwa na maendeleo yaliyoenea. Ingawa wengine wametilia shaka manufaa ya Mtandao na kuhusisha maendeleo na umaarufu wake ulioenea hasa kwa utangazaji unaoingilia, bila shaka mtandao ni njia muhimu ya kuwasilisha kila aina ya habari. Sio tu kwamba kuna huduma nyingi zinazopatikana ili kutoa maelezo ya kisasa (habari, hali ya hewa, matukio ya michezo ya moja kwa moja) na nyenzo za marejeleo kielektroniki, pia kuna kiasi kikubwa cha aina nyingine za data zinazopatikana. IRS, ambayo ilisambaza fomu zake zote za kurejesha kodi za 1995 na taarifa nyingine kupitia Mtandao Wote wa Ulimwenguni, hivi majuzi ilikubali kupokea barua za mashabiki kwa Tovuti yake. Nani angefikiria kuwa IRS ingewahi kupokea barua kutoka kwa mashabiki? Hii haikuwa kwa sababu tovuti yake iliundwa vizuri, lakini kwa sababu ilikuwa imethibitishwa kuwa chombo muhimu sana kwa maelfu, labda mamilioni ya watu.

Ni nini hufanya Wavuti kuwa ya kipekee na huduma ya habari ya kuvutia? Kwanza kabisa, hutoa interface ya hypermedia kwa data. Fikiria juu ya diski kuu ya kompyuta yako. Kwa kawaida, data inaonyeshwa kwa mtindo wa mstari, sawa na mfumo wa faili. Kwa mfano, una idadi ya folda, na ndani ya kila folda kuna nyaraka au folda nyingine. Wavuti hutumia dhana tofauti kueleza habari inayoitwa hypermedia. Kiolesura cha maandishi cha hypertext kina hati na viungo. Viungo ni maneno ambayo yamebofya ili kuona hati zingine au kupata aina zingine za habari. Wavuti hupanua dhana ya hypertext kujumuisha aina zingine za media, kama vile michoro, sauti, video (kwa hivyo jina "hypermedia"). Kuchagua maandishi au michoro kwenye hati hukuruhusu kuona taarifa zinazohusiana kuhusu kipengee kilichochaguliwa katika idadi yoyote ya fomu.

Takriban kila mtu anaweza kufaidika kutokana na njia hii rahisi na ya kipekee ya kuwasilisha na kusambaza taarifa, kuanzia wasomi wanaotaka kutumia data mara moja na wenzao hadi wafanyabiashara wanaoshiriki taarifa kuhusu kampuni yao na kila mtu. Walakini, ingawa kutoa habari ni muhimu sana, katika miaka michache iliyopita wengi wamehisi kuwa kupokea habari ni mchakato muhimu sawa.

Ingawa Wavuti hutoa kiolesura cha kipekee cha hypermedia kwa habari, kuna njia zingine nyingi nzuri za kusambaza data. Kwa mfano, huduma za mtandao kama vile Itifaki ya Uhamisho wa Faili (FTP) na kikundi cha habari cha Gopher zilikuwepo muda mrefu kabla ya Mtandao Wote wa Ulimwenguni. Barua za kielektroniki zimekuwa njia kuu ya mawasiliano na upashanaji habari kwenye Mtandao na mitandao mingine mingi tangu mwanzo kabisa wa mitandao hii. Kwa nini Intaneti imekuwa njia maarufu sana ya kusambaza habari? Kipengele cha media titika cha Mtandao kimechangia kwa kiasi kikubwa mafanikio yake ambayo hayajawahi kushuhudiwa, lakini ili Mtandao uwe na ufanisi zaidi, ni lazima uwe na mwingiliano.

Bila uwezo wa kupokea ingizo la mtumiaji na kutoa taarifa, Mtandao ungekuwa mazingira tuli kabisa. Taarifa hiyo itapatikana tu katika muundo uliobainishwa na mwandishi. Hii inaweza kudhoofisha mojawapo ya uwezo wa kompyuta kwa ujumla: habari shirikishi. Kwa mfano, badala ya kulazimisha mtumiaji kutazama hati nyingi kana kwamba anatafuta kitabu au kamusi, itakuwa bora kumruhusu mtumiaji kutambua maneno muhimu kwenye mada inayokuvutia. Watumiaji wanaweza kubinafsisha uwasilishaji wa data badala ya kutegemea muundo thabiti unaofafanuliwa na mtoa huduma wa maudhui.

Neno "Seva ya Wavuti" linaweza kupotosha kwa sababu linaweza kurejelea mashine halisi na programu inayotumia kuwasiliana na vivinjari vya Mtandao. Wakati kivinjari kinaomba anwani fulani ya Wavuti, kwanza huunganisha kwa mashine kupitia Mtandao, kutuma programu ya seva ya Wavuti ombi la hati. Programu hii huendesha kila wakati, ikingojea maombi kama haya kufika na kujibu ipasavyo.

Ingawa seva zinaweza kutuma na kupokea data, seva yenyewe ina utendakazi mdogo. Kwa mfano, seva ya zamani zaidi inaweza tu kutuma faili inayohitajika kwa kivinjari. Seva kawaida haijui la kufanya na hii au ingizo la ziada. Ikiwa ISP haitaambia seva jinsi ya kushughulikia maelezo haya ya ziada, seva itapuuza ingizo.

Ili seva iweze kufanya shughuli zingine kando na kutafuta na kutuma faili kwenye kivinjari cha Mtandao, unahitaji kujua jinsi ya kupanua utendaji wa seva. Kwa mfano, seva ya Wavuti haiwezi kutafuta hifadhidata kulingana na neno kuu lililowekwa na mtumiaji na kurudisha hati nyingi zinazolingana isipokuwa kama uwezo huo umeratibiwa kwenye seva kwa njia fulani.

CGI ni nini?

Kiolesura cha Kawaida cha Lango (CGI) ni kiolesura cha seva kinachokuruhusu kupanua utendakazi wa seva. Kwa kutumia CGI, unaweza kuingiliana kwa maingiliano na watumiaji wanaofikia tovuti yako. Katika kiwango cha kinadharia, CGI inaruhusu seva kuwa na uwezo wa kuchanganua (kutafsiri) ingizo kutoka kwa kivinjari na kurudisha habari kulingana na ingizo la mtumiaji. Kwa kiwango cha vitendo, CGI ni kiolesura kinachoruhusu mpangaji programu kuandika programu zinazowasiliana kwa urahisi na seva.

Kwa kawaida, ili kupanua uwezo wa seva, itabidi urekebishe seva mwenyewe. Suluhisho hili halifai kwa sababu linahitaji kuelewa safu ya chini ya programu ya mtandao wa Itifaki ya Mtandao. Hii pia itahitaji kuhariri na kurejesha msimbo wa chanzo cha seva au kuandika seva maalum kwa kila kazi. Hebu tuseme unataka kupanua uwezo wa seva ili ifanye kazi kama lango la Wavuti-kwa-barua-pepe, kuchukua maelezo yaliyoingizwa na mtumiaji kutoka kwa kivinjari na kutuma barua pepe kwa mtumiaji mwingine. Seva italazimika kuingiza msimbo ili kuchanganua ingizo kutoka kwa kivinjari, kuisambaza kupitia barua pepe kwa mtumiaji mwingine, na kurudisha majibu kwa kivinjari kupitia muunganisho wa mtandao.

Kwanza, kazi kama hiyo inahitaji ufikiaji wa nambari ya seva, ambayo haiwezekani kila wakati.

Pili, ni ngumu na inahitaji maarifa ya kina ya kiufundi.

Tatu, hii inatumika tu kwa seva maalum. Iwapo unahitaji kuhamisha seva yako hadi kwenye jukwaa lingine, itabidi uendeshe au angalau utumie muda mwingi kusambaza msimbo kwenye jukwaa hilo.

Kwa nini CGI?

CGI inatoa suluhu ya kubebeka na rahisi kwa matatizo haya. Itifaki ya CGI inafafanua njia ya kawaida ya programu kuwasiliana na seva ya Wavuti. Bila ujuzi wowote maalum, unaweza kuandika programu katika lugha yoyote ya mashine ambayo inaingiliana na kuwasiliana na seva ya Wavuti. Mpango huu utafanya kazi na seva zote za Wavuti zinazoelewa itifaki ya CGI.

Mawasiliano ya CGI hufanywa kwa kutumia pembejeo na matokeo ya kawaida, ambayo inamaanisha kuwa ikiwa unajua jinsi ya kuchapisha na kusoma data kwa kutumia lugha yako ya programu, unaweza kuandika programu ya seva ya Wavuti. Kando na uchanganuzi wa pembejeo na matokeo, programu za CGI za upangaji ni karibu sawa na kutayarisha programu nyingine yoyote. Kwa mfano, kupanga programu ya "Hujambo, Ulimwengu!", unatumia vitendaji vya uchapishaji vya lugha yako na umbizo lililobainishwa kwa programu za CGI ili kuchapisha ujumbe unaofaa.

Kuchagua lugha ya programu

Kwa sababu CGI ni kiolesura cha ulimwengu wote, hauzuiliwi na lugha yoyote mahususi ya mashine. Swali muhimu ambalo huulizwa mara nyingi ni: ni lugha gani za programu zinaweza kutumika kwa programu ya CGI? Unaweza kutumia lugha yoyote inayokuruhusu kufanya yafuatayo:

  • Chapisha hadi pato la kawaida
  • Soma kutoka kwa ingizo la kawaida
  • Soma kutoka kwa hali tofauti

Takriban lugha zote za programu na lugha nyingi za uandishi hufanya mambo haya matatu, na unaweza kutumia yoyote kati yao.

Lugha huanguka katika moja ya madarasa mawili yafuatayo: kutafsiriwa na kufasiriwa. Lugha iliyotafsiriwa kama vile C au C++ kawaida huwa ndogo na haraka zaidi, ilhali lugha zinazofasiriwa kama vile Perl au Rexx wakati mwingine huhitaji mkalimani mkubwa kupakiwa wakati wa kuanza. Zaidi ya hayo, unaweza kusambaza misimbo binary (msimbo unaotafsiriwa katika lugha ya mashine) bila msimbo wa chanzo ikiwa lugha yako inaweza kutafsiriwa. Kusambaza hati zinazoweza kufasiriwa kwa kawaida humaanisha kusambaza msimbo wa chanzo.

Kabla ya kuchagua lugha, kwanza unahitaji kuzingatia vipaumbele vyako. Unahitaji kupima faida za kasi na ufanisi wa lugha moja ya programu dhidi ya urahisi wa programu ya nyingine. Ikiwa una nia ya kujifunza lugha nyingine, badala ya kutumia unayojua tayari, pima kwa uangalifu faida na hasara za lugha zote mbili.

Lugha mbili zinazotumiwa sana kwa programu ya CGI ni C na Perl (zote mbili zimeangaziwa katika kitabu hiki). Wote wawili wana faida na hasara za wazi. Perl ni lugha ya kiwango cha juu sana, na wakati huo huo lugha yenye nguvu, inayofaa hasa kwa uchanganuzi wa maandishi. Ingawa urahisi wake wa matumizi, kunyumbulika, na nguvu huifanya kuwa lugha ya kuvutia kwa programu ya CGI, saizi yake kubwa kiasi na utendakazi polepole wakati mwingine huifanya isifae kwa baadhi ya programu. Programu za C ni ndogo, zinafaa zaidi, na hutoa udhibiti wa mfumo wa kiwango cha chini, lakini ni ngumu zaidi katika kupanga, hazina taratibu za uchakataji wa maandishi zilizojumuishwa ndani, na ni ngumu zaidi kusuluhisha.

Ni lugha gani inayofaa zaidi kwa programu ya CGI? Ile ambayo unaona inafaa zaidi kutoka kwa mtazamo wa programu. Zote mbili zinafaa kwa utayarishaji wa programu za CGI, na kwa maktaba zinazofaa, zote zina uwezo sawa. Hata hivyo, ikiwa una seva ngumu kufikia, unaweza kutumia programu ndogo, zilizotafsiriwa za C. Ikiwa unahitaji haraka kuandika programu ambayo inahitaji kazi nyingi za usindikaji wa maandishi, unaweza kutumia Perl badala yake.

Tahadhari

Kuna njia mbadala muhimu kwa programu za CGI. Seva nyingi sasa zinajumuisha upangaji wa API, ambayo hurahisisha kupanga upanuzi wa seva moja kwa moja kinyume na programu za CGI zilizojitegemea. Seva za API kwa ujumla ni bora zaidi kuliko programu za CGI. Seva zingine ni pamoja na utendakazi uliojengewa ndani ambao unaweza kushughulikia vipengele maalum visivyo vya CGI, kama vile kuunganisha hifadhidata. Hatimaye, baadhi ya programu zinaweza kushughulikiwa na teknolojia mpya za upande wa mteja (badala ya upande wa seva) kama Java. Kwa mabadiliko hayo ya haraka ya teknolojia, CGI itapitwa na wakati haraka?

Vigumu. CGI ina faida kadhaa juu ya teknolojia mpya.

  • Ni hodari na inabebeka. Unaweza kuandika programu ya CGI kwa kutumia karibu lugha yoyote ya programu kwenye jukwaa lolote. Baadhi ya njia mbadala, kama vile API ya seva, huweka kikomo kwa lugha fulani na ni ngumu zaidi kujifunza.
  • Haiwezekani kwamba teknolojia za upande wa mteja kama vile Java zitachukua nafasi ya CGI, kwa sababu kuna baadhi ya programu ambazo programu za upande wa seva zinafaa zaidi kuendeshwa.
  • Vikwazo vingi vya CGI ni vikwazo vya HTML au HTTP. Viwango vya Mtandao kwa ujumla vinabadilika, ndivyo uwezo wa CGI unavyoongezeka.

Muhtasari

Kiolesura cha Kawaida cha Lango ni itifaki ambayo programu huingiliana na seva za Wavuti. Uwezo mwingi wa CGI huwapa waandaaji programu uwezo wa kuandika programu za lango katika karibu lugha yoyote, ingawa kuna biashara nyingi zinazohusiana na lugha tofauti. Bila uwezo huu, kuunda kurasa za Wavuti zinazoingiliana itakuwa ngumu, ikihitaji marekebisho bora ya seva, na mwingiliano haungepatikana kwa watumiaji wengi ambao si wasimamizi wa tovuti.

Sura ya 2: Misingi

Miaka kadhaa iliyopita, niliunda ukurasa wa chuo kikuu cha Harvard ambapo watu wangeweza kuwasilisha maoni kuwahusu. Wakati huo, mtandao ulikuwa mchanga na nyaraka zilikuwa chache. Mimi, kama wengine wengi, nilitegemea uhifadhi wa nyaraka fupi na mifumo ya programu iliyoundwa na wengine ili kujifundisha upangaji programu wa CGI. Ingawa njia hii ya utafiti ilihitaji utaftaji fulani, majaribio mengi, na kuunda maswali mengi, ilikuwa nzuri sana. Sura hii ni matokeo ya kazi yangu ya mapema na CGI (na marekebisho machache, bila shaka).

Ingawa inachukua muda kuelewa kikamilifu na kusimamia kiolesura cha kawaida cha lango, itifaki yenyewe ni rahisi sana. Mtu yeyote ambaye ana ujuzi wa kimsingi wa kupanga na anafahamu Wavuti anaweza kujifunza kwa haraka kupanga programu changamano za CGI kama vile mimi na wengine tulijifunza kufanya miaka kadhaa iliyopita.

Madhumuni ya sura hii ni kuwasilisha misingi ya CGI kwa njia ya kina, ingawa imefupishwa. Kila dhana inayojadiliwa hapa imewasilishwa kwa undani katika sura zinazofuata. Walakini, baada ya kukamilisha sura hii, unaweza kuanza mara moja kupanga programu za CGI. Mara tu unapofikia kiwango hiki, unaweza kujifunza ugumu wa CGI, ama kwa kusoma sehemu nyingine ya kitabu hiki au kwa kujaribu peke yako.

Unaweza kuchemsha programu ya CGI kwa kazi mbili: kupokea habari kutoka kwa kivinjari cha Wavuti na kutuma habari kwa kivinjari. Hii inafanywa kwa njia ya angavu mara tu unapofahamu matumizi ya kawaida ya programu za CGI. Mara nyingi mtumiaji anaulizwa kujaza fomu fulani, kwa mfano, ingiza jina lake. Mara tu mtumiaji atakapojaza fomu na bonyeza Enter, habari hii inatumwa kwa programu ya CGI. Mpango wa CGI lazima ubadilishe taarifa hii kuwa kitu inachoelewa, uichakate ipasavyo, na kisha uirejeshe kwa kivinjari, iwe uthibitisho rahisi au matokeo ya utafutaji katika hifadhidata ya madhumuni mbalimbali.

Kwa maneno mengine, programu ya CGI inahitaji kuelewa jinsi ya kupokea ingizo kutoka kwa kivinjari cha Mtandao na jinsi ya kutuma pato nyuma. Kinachotokea kati ya hatua za uingizaji na utoaji wa programu ya CGI inategemea lengo la msanidi programu. Utapata kwamba ugumu kuu katika programu ya CGI upo katika hatua hii ya kati; Mara tu unapojifunza jinsi ya kufanya kazi na pembejeo na matokeo, hiyo inatosha kuwa msanidi wa CGI.

Katika sura hii, utajifunza kanuni za uwekaji na matokeo ya CGI, pamoja na ujuzi mwingine msingi utakaohitaji kuandika na kutumia CGI, ikijumuisha mambo kama kuunda fomu za HTML na kutaja programu zako za CGI. Sura hii inashughulikia mada zifuatazo:

  • Programu ya jadi "Halo, Ulimwengu!";
  • Pato la CGI: Kutuma taarifa nyuma kwa ajili ya kuonyeshwa kwenye kivinjari cha Mtandao;
  • Inasanidi, kusakinisha na kuendesha programu. Utajifunza kuhusu majukwaa na seva tofauti za Wavuti;
  • Ingizo la CGI: Ufafanuzi wa habari iliyotumwa na kivinjari cha Wavuti. Utangulizi wa baadhi ya maktaba za programu muhimu kwa kuchanganua ingizo kama hilo;
  • Mfano rahisi: inashughulikia masomo yote katika sura iliyotolewa;
  • Mkakati wa kupanga.

Kwa sababu ya asili ya sura hii, ninagusa tu mada fulani. Usijali; Mada hizi zote zimefunikwa kwa kina zaidi katika sura zingine.

Salamu, Dunia!

Unaanza na tatizo la utangulizi wa kitamaduni. Utaandika programu inayoonyesha "Habari, Ulimwengu!" kwenye kivinjari chako cha Wavuti. Kabla ya kuandika programu hii, lazima uelewe ni habari gani kivinjari cha Wavuti kinatarajia kupokea kutoka kwa programu za CGI. Pia unahitaji kujua jinsi ya kuendesha programu hii ili uweze kuiona katika vitendo.

CGI haitegemei lugha, kwa hivyo unaweza kutekeleza programu hii katika lugha yoyote. Lugha kadhaa tofauti hutumiwa hapa kuonyesha uhuru wa kila lugha. Huko Perl, programu ya "Habari, Ulimwengu!" inavyoonyeshwa katika Orodha 2.1.

Kuorodhesha 2.1. Salamu, Dunia! katika Perl. #!/usr/local/bin/perl # Hello.cgi - Chapisha mpango wangu wa kwanza wa CGI "Aina ya Maudhui: maandishi/html\n\n"; chapa" \n"; chapisha" Salamu, Dunia!"; chapisha"\n"; chapisha" \n"; chapisha"

Salamu, Dunia!

\n"; chapisha"

\n";

Hifadhi programu hii kama hello.cgi, na uisakinishe katika eneo linalofaa. (Ikiwa huna uhakika ni wapi, usijali; utapata katika sehemu ya "Kusakinisha na Kuendesha Programu ya CGI" baadaye katika sura hii.) Kwa seva nyingi, saraka unayohitaji ni cgi-bin. . Sasa, piga programu kutoka kwa kivinjari chako cha Wavuti. Kwa wengi, hii inamaanisha kufungua kitafuta rasilimali sare (URL) ifuatayo:

http://hostname/directoryname/hello.cgi

Jina la mpangishaji ni jina la seva yako ya Wavuti, na jina la saraka ni saraka ambapo unaweka hello.cgi (labda cgi-bin).

Kugawanyika hello.cgi

Kuna mambo machache ya kuzingatia kuhusu hello.cgi.

Kwanza, unatumia amri rahisi za kuchapisha. Programu za CGI hazihitaji maelezo yoyote maalum ya faili au maelezo ya pato. Ili kutuma pato kwa kivinjari, chapisha tu ili stdout.

Pili, kumbuka kuwa maudhui ya taarifa ya kwanza ya kuchapisha (Aina ya Maudhui: maandishi/html) haionekani kwenye kivinjari chako cha Wavuti. Unaweza kutuma maelezo yoyote unayotaka kwa kivinjari (ukurasa wa HTML, michoro au sauti), lakini kwanza, unahitaji kumwambia kivinjari ni aina gani ya data unayoituma. Mstari huu huambia kivinjari aina gani ya habari ya kutarajia - katika kesi hii, ukurasa wa HTML.

Tatu, programu inaitwa hello.cgi. Huhitaji kila wakati kutumia kiendelezi cha .cgi chenye jina la programu yako ya CGI. Ingawa msimbo wa chanzo wa lugha nyingi pia hutumia kiendelezi cha .cgi, haitumiwi kuonyesha aina ya lugha, lakini ni njia ya seva kutambua faili kama faili inayoweza kutekelezwa badala ya faili ya michoro, faili ya HTML, au faili ya maandishi. Seva mara nyingi husanidiwa ili kujaribu tu kutekeleza faili hizo zilizo na kiendelezi hiki, kuonyesha maudhui ya wengine wote. Ingawa kutumia kiendelezi cha .cgi hakuhitajiki, bado inachukuliwa kuwa mazoezi mazuri.

Kwa ujumla, hello.cgi ina sehemu kuu mbili:

  • huambia kivinjari habari gani ya kutarajia (Aina ya Yaliyomo: maandishi/html)
  • huambia kivinjari kile cha kuonyesha (Hujambo, Ulimwengu!)

Salamu, Dunia! katika C

Ili kuonyesha uhuru wa lugha ya programu za CGI, Orodha ya 2.2 inaonyesha sawa na mpango wa hello.cgi ulioandikwa katika C.

Kuorodhesha 2.2. Salamu, Dunia! katika C. /* hello.cgi.c - Hello, World CGI */ #include int main() ( printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); chapisha(" Salamu, Dunia!\n"); chapisha("\n"); chapisha(" \n"); chapisha("

Salamu, Dunia!

\n"); chapisha("

\n");)

Kumbuka

Kumbuka kuwa toleo la Perl la hello.cgi linatumia uchapishaji wa Aina ya Maudhui ": text/html\n\n "; Wakati toleo C linatumia Printf("Content-Type: text/html\r\n\r\n");

Kwa nini Perl huchapisha opereta inaisha na laini mbili mpya (\n) huku C printf inaisha na marejesho mawili ya gari na laini mpya (\r\n)?

Kitaalam, vichwa (matokeo yote kabla ya laini tupu) vinatarajiwa kutengwa na urejeshaji wa gari na laini mpya. Kwa bahati mbaya, kwenye mashine za DOS na Windows, Perl hutafsiri \r kama laini nyingine badala ya kurudi kwa gari.

Ingawa ubaguzi wa Perl \rs sio sahihi kiufundi, itafanya kazi kwa karibu itifaki zote na inaweza kubebeka kwa usawa kwenye majukwaa yote. Kwa hivyo, katika mifano yote ya Perl kwenye kitabu hiki, ninatumia vichwa vya habari mpya badala ya kurudi kwa gari na mistari mpya.

Suluhisho linalofaa kwa tatizo hili limetolewa katika Sura ya 4, Hitimisho.

Seva ya Wavuti wala kivinjari haijali ni lugha gani inatumiwa kuandika programu. Ingawa kila lugha ina faida na hasara kama lugha ya programu ya CGI, ni bora kutumia lugha ambayo unafaa zaidi kufanya kazi nayo. (Chaguo la lugha ya programu linajadiliwa kwa undani zaidi katika Sura ya 1, "Common Gateway Interface (CGI)").

Utoaji wa CGI

Sasa unaweza kuangalia kwa karibu suala la kutuma habari kwa kivinjari cha Wavuti. Kutoka kwa mfano "Hujambo, Ulimwengu!", unaweza kuona kwamba vivinjari vya Wavuti vinatarajia seti mbili za data: kichwa, ambacho kina habari kama vile habari ya kuonyesha (kwa mfano, Aina ya Yaliyomo: mstari) na habari halisi (nini kivinjari cha Wavuti. maonyesho). Habari hizi mbili zimetenganishwa na mstari tupu.

Kichwa kinaitwa kichwa cha HTTP. Inatoa habari muhimu kuhusu habari ambayo kivinjari kitapokea. Kuna aina tofauti za vichwa vya HTTP, na kinachojulikana zaidi ni kile ambacho umetumia hapo awali: Aina ya Maudhui: kichwa. Unaweza kutumia michanganyiko tofauti ya vichwa vya HTTP, vinavyotenganishwa na urejeshaji wa gari na laini mpya (\r\n). Mstari tupu unaotenganisha kichwa kutoka kwa data pia unajumuisha urejeshaji wa gari na laini mpya (kwa nini zote zinahitajika inajadiliwa kwa ufupi katika dokezo lililotangulia na kuelezewa kwa kina katika Sura ya 4). Utajifunza kuhusu vichwa vingine vya HTTP katika Sura ya 4; Hivi sasa unashughulika na Aina ya Yaliyomo: kichwa.

Aina ya Yaliyomo: Kijaju kinaelezea aina ya data ambayo CGI inarudisha. Umbizo linalofaa kwa kichwa hiki ni:

Aina ya Maudhui: aina ndogo/aina

Ambapo aina ndogo/aina ni aina sahihi ya Viendelezi vya Barua Pepe za Wavuti (MIME). Aina ya kawaida ya MIME ni aina ya HTML: text/html. Jedwali 2.1 linaorodhesha aina chache za kawaida za MIME ambazo zitajadiliwa; Uorodheshaji kamili zaidi na uchanganuzi wa aina za MIME umetolewa katika Sura ya 4.

Kumbuka

MIME ilivumbuliwa ili kuelezea yaliyomo kwenye miili ya ujumbe wa barua pepe. Imekuwa njia ya kawaida ya kuwakilisha maelezo ya Aina ya Maudhui. Unaweza kusoma zaidi kuhusu MIME katika RFC1521. RFCs kwenye Mtandao husimamia Maombi ya Maoni, ambayo ni muhtasari wa maamuzi yaliyotolewa na vikundi kwenye Mtandao vinavyojaribu kuweka viwango. Unaweza kutazama matokeo ya RFC1521 katika anwani ifuatayo: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Jedwali 2.1. Baadhi ya aina za MIME za kawaida. Ufafanuzi wa Aina ya MIME Maandishi/html Lugha ya Alama ya Maandishi ya Juu (HTML) Maandishi/Faili za maandishi wazi Picha/gif Faili za picha GIF Picha/jpeg Faili za picha zilizobanwa JPEG Faili za Sauti/msingi za Sauti Sun *.au Sikizi/x-wav Faili za Windows *. wav

Baada ya kichwa na mstari tupu, unachapisha tu data katika fomu unayohitaji. Ikiwa unatuma HTML, basi chapisha lebo za HTML na data ili stdout baada ya kichwa. Unaweza pia kutuma michoro, sauti na faili zingine za binary kwa kuchapisha tu yaliyomo kwenye faili kwa stdout. Mifano kadhaa ya hii imetolewa katika Sura ya 4.

Kufunga na Kuendesha Programu ya CGI

Sehemu hii inapotoka kwa kiasi fulani kutoka kwa programu ya CGI na inazungumza kuhusu kusanidi seva yako ya Wavuti kutumia CGI, kusakinisha na kuendesha programu. Utatambulishwa kwa seva tofauti za majukwaa tofauti kwa undani zaidi au kidogo, lakini itabidi uchimbe kwa undani nyaraka za seva yako ili kupata chaguo bora zaidi.

Seva zote zinahitaji nafasi kwa faili za seva na nafasi kwa hati za HTML. Katika kitabu hiki, eneo la seva linaitwa ServerRoot, na eneo la hati linaitwa DocumentRoot. Kwenye mashine za UNIX, ServerRoot kawaida huwa ndani /usr/local/etc/httpd/, na DocumentRoot kawaida iko /usr/local/etc/httpd/htdocs/. Walakini, hii haitaleta tofauti yoyote kwenye mfumo wako, kwa hivyo badilisha marejeleo yote ya ServerRoot na DocumentRoot na ServerRoot yako mwenyewe na DocumentRoot.

Unapofikia faili kwa kutumia kivinjari chako cha Wavuti, unabainisha faili katika URL inayohusiana na DocumentRoot. Kwa mfano, ikiwa anwani ya seva yako ni mymachine.org, basi unafikia faili hii kwa URL ifuatayo: http://mymachine.org/index.html

Inasanidi seva kwa CGI

Seva nyingi za Wavuti zimesanidiwa awali ili kuruhusu matumizi ya programu za CGI. Kwa kawaida vigezo viwili vinaonyesha kwa seva ikiwa faili ni programu ya CGI au la:

  • Saraka iliyoteuliwa. Seva zingine hukuruhusu kubaini kuwa faili zote kwenye saraka iliyoteuliwa (kawaida huitwa cgi-bin kwa chaguo-msingi) ni CGI.
  • Viendelezi vya jina la faili. Seva nyingi zina usanidi huu wa awali ambao unaruhusu faili zote zinazoishia kwa .cgi kufafanuliwa kama CGI.

Njia ya saraka iliyoteuliwa ni kitu cha masalio ya zamani (seva za kwanza ziliitumia kama njia pekee ya kuamua ni faili gani zilikuwa programu za CGI), lakini ina faida kadhaa.

  • Huweka programu za CGI kuwa kati, kuzuia saraka nyingine kuwa na vitu vingi.
  • Hauzuiliwi na kiendelezi chochote cha jina la faili, kwa hivyo unaweza kutaja faili zako chochote unachotaka. Seva zingine hukuruhusu kuteua saraka kadhaa tofauti kama saraka za CGI.
  • Pia inakupa udhibiti zaidi juu ya nani anayeweza kurekodi CGI. Kwa mfano, ikiwa una seva na unaauni mfumo ulio na watumiaji wengi na hutaki watumie hati zao za CGI bila kukagua kwanza programu kwa sababu za kiusalama, unaweza kuteua faili hizo tu katika orodha ndogo, ya kati kama CGI. . Watumiaji watalazimika kukupa programu za CGI za kusakinisha, na unaweza kwanza kukagua msimbo ili kuhakikisha kuwa programu haina masuala makubwa ya usalama.

Nukuu ya CGI kupitia kiendelezi cha jina la faili inaweza kuwa muhimu kwa sababu ya kubadilika kwake. Hauzuiliwi na saraka moja ya programu za CGI. Seva nyingi zinaweza kusanidiwa ili kutambua CGI kupitia kiendelezi cha jina la faili, ingawa sio zote zimesanidiwa kwa njia hii kwa chaguo-msingi.

Onyo

Kumbuka umuhimu wa masuala ya usalama unaposanidi seva yako kwa CGI. Vidokezo vingine vitashughulikiwa hapa, na Sura ya 9, Kulinda CGI, inashughulikia vipengele hivi kwa undani zaidi.

Kufunga CGI kwenye seva za UNIX

Bila kujali jinsi seva yako ya UNIX imesanidiwa, kuna hatua kadhaa unazohitaji kuchukua ili kuhakikisha kuwa programu zako za CGI zinaendeshwa inavyotarajiwa. Seva yako ya Wavuti kwa kawaida itaendeshwa kama mtumiaji ambaye hayupo (yaani, mtumiaji wa UNIX hakuna mtu - akaunti ambayo haina ruhusa za faili na haiwezi kuingia). Hati za CGI (zilizoandikwa kwa Perl, ganda la Bourne, au lugha nyingine ya hati) lazima zitekelezwe na kusomeka ulimwenguni kote.

Dokezo

Ili kufanya faili zako zisomeke na kutekelezwa ulimwenguni, tumia amri ifuatayo ya ruhusa za UNIX: chmod 755 filename.

Ikiwa unatumia lugha ya uandishi kama vile Perl au Tcl, toa njia kamili ya mkalimani wako kwenye mstari wa kwanza wa hati yako. Kwa mfano, hati ya Perl inayotumia perl kwenye saraka ya /usr/local/bin ingeanza na safu ifuatayo:

#!/usr/local/bin/perl

Onyo

Usiweke kamwe mkalimani (perl, au Tcl Wish binary) kwenye saraka ya /cgi-bin. Hii husababisha hatari ya usalama kwenye mfumo wako. Hili linajadiliwa kwa undani zaidi katika Sura ya 9.

Baadhi ya seva za kawaida za UNIX

Seva za NCSA na Apache zina faili za usanidi zinazofanana kwa sababu seva ya Apache ilitokana na msimbo wa NCSA. Kwa chaguo-msingi, zimeundwa ili faili yoyote kwenye saraka ya cgi-bin (iko kwa chaguo-msingi katika ServerRoot) ni programu ya CGI. Ili kubadilisha eneo la saraka ya cgi-bin, unaweza kuhariri faili ya usanidi ya conf/srm.conf. Umbizo la kusanidi saraka hii ni

ScriptAlias ​​​​fakedirectoryname realdirectoryname

ambapo fakedirectoryname ni jina la saraka pseudo (/cgi-bin) na realdirectoryname ndio njia kamili ambapo programu za CGI huhifadhiwa. Unaweza kusanidi zaidi ya ScriptAlias ​​kwa kuongeza mistari zaidi ya ScriptAlias.

Usanidi chaguo-msingi unatosha kwa mahitaji ya watumiaji wengi. Unahitaji kuhariri laini katika faili ya srm.conf katika hali yoyote ili kubaini jina sahihi la saraka. Ikiwa, kwa mfano, programu zako za CGI ziko ndani /usr/local/etc/httpd/cgi-bin, mstari wa ScriptAlias ​​katika faili yako ya srm.conf inapaswa kuwa kitu kama hiki:

ScriptAlias ​​​​/cgi-bin/ /usr/local/etc/httpd/cgi-bin/

Ili kufikia au kuunganisha kwa programu za CGI zilizo katika saraka hii, tumia URL ifuatayo:

Http://hostname/cgi-bin/programname

Ambapo jina la mpangishaji ni jina la mwenyeji wa seva yako ya Wavuti, na jina la programu ni jina la CGI yako.

Kwa mfano, tuseme unakili programu ya hello.cgi kwenye saraka yako ya cgi-bin (km /usr/local/etc/httpd/cgi-bin) kwenye seva yako ya Wavuti iitwayo www.company.com. Ili kufikia CGI yako, tumia URL ifuatayo: http://www.company.com/cgi-bin/hello.cgi

Iwapo ungependa kusanidi seva yako ya NCSA au Apache ili kutambua faili yoyote iliyo na kiendelezi cha .cgi kama CGI, unahitaji kuhariri faili mbili za usanidi. Kwanza, katika faili ya srm.conf, toa maoni kwa mstari ufuatao:

AddType application/x-httpd-cgi .cgi

Hii itahusisha CGI ya aina ya MIME na kiendelezi cha .cgi. Sasa, tunahitaji kubadilisha faili ya access.conf ili tuweze kuendesha CGI katika saraka yoyote. Ili kufanya hivyo, ongeza chaguo la ExecCGI kwenye mstari wa Chaguo. Itaonekana kitu kama safu ifuatayo:

Fahirisi za Chaguo FollowSymLinks ExecCGI

Sasa, faili yoyote iliyo na kiendelezi cha .cgi inachukuliwa kuwa CGI; ifikie kama vile faili yoyote kwenye seva yako.

Seva ya CERN imesanidiwa kwa njia sawa na seva za Apache na NCSA. Badala ya ScriptAlias, seva ya CERN hutumia amri ya Exec. Kwa mfano, katika faili ya httpd.conf, utaona mstari ufuatao:

Tekeleza /cgi-bin/* /usr/local/etc/httpd/cgi-bin/*

Seva zingine za UNIX zinaweza kusanidiwa kwa njia sawa; Hii imeelezewa kwa undani zaidi katika nyaraka za seva.

Kufunga CGI kwenye Windows

Seva nyingi zinazopatikana kwa Windows 3.1, Windows 95 na Windows NT zimesanidiwa kwa kutumia mbinu ya "kiendelezi cha jina la faili" kwa utambuzi wa CGI. Kwa ujumla, kubadilisha usanidi wa seva inayotegemea Windows inahitaji tu kuendesha programu ya usanidi wa seva na kufanya mabadiliko yanayofaa.

Wakati mwingine kusanidi seva ili kuendesha hati (kama vile Perl) kwa usahihi inaweza kuwa ngumu. Katika DOS au Windows, hutaweza kubainisha mkalimani kwenye mstari wa kwanza wa hati, kama ilivyo kwa UNIX. Baadhi ya seva zina usanidi uliofafanuliwa awali ili kuhusisha viendelezi fulani vya jina la faili na mkalimani. Kwa mfano, seva nyingi za Wavuti za Windows huchukulia kuwa faili zinazoishia kwa .pl ni hati za Perl.

Ikiwa seva haitekelezi aina hii ya uhusiano wa faili, unaweza kufafanua faili ya bechi ya kifurushi ambayo huita mkalimani na hati. Kama ilivyo kwa seva ya UNIX, usisakinishe mkalimani katika saraka ya cgi-bin au saraka yoyote inayoweza kufikiwa na Wavuti.

Kufunga CGI kwenye Macintosh

Chaguo mbili za seva zinazojulikana zaidi za Macintosh ni WebStar StarNine na mtangulizi wake MacHTTP. Zote mbili zinatambua CGI kwa kiendelezi cha jina la faili.

MacHTTP inaelewa viendelezi viwili tofauti: .cgi na .acgi, ambayo inasimamia CGI isiyo ya kawaida. Programu za kawaida za CGI zilizosakinishwa kwenye Macintosh (yenye kiendelezi cha .cgi) zitaweka seva ya Wavuti katika hali ya shughuli nyingi hadi CGI ikamilishe kufanya kazi, na kusababisha seva kusimamisha maombi mengine yote. Asynchronous CGI, kwa upande mwingine, inaruhusu seva kukubali maombi hata wakati inafanya kazi.

Msanidi wa CGI Macintosh anayetumia mojawapo ya seva hizi za Wavuti lazima, ikiwezekana, atumie kiendelezi cha .acgi badala ya kiendelezi cha .cgi. Inapaswa kufanya kazi na programu nyingi za CGI; ikiwa haifanyi kazi, badilisha jina la programu kuwa .cgi.

Utekelezaji wa CGI

Mara baada ya kusakinisha CGI, kuna njia kadhaa za kuitekeleza. Ikiwa programu yako ya CGI ni programu ya kutoa tu, kama vile programu ya Hello,World!, basi unaweza kuitekeleza kwa kufikia URL yake.

Programu nyingi huendesha kama programu ya seva kwenye fomu ya HTML. Kabla ya kujifunza jinsi ya kupata taarifa kutoka kwa fomu hizi, kwanza soma utangulizi mfupi kuhusu kuunda fomu hizo.

Mafunzo ya haraka juu ya fomu za HTML

Lebo mbili muhimu zaidi katika fomu ya HTML ni

Na . Unaweza kuunda aina nyingi za HTML ukitumia lebo hizi mbili pekee. Katika sura hii, utachunguza lebo hizi na kikundi kidogo cha aina au sifa zinazowezekana. . Mwongozo kamili na kiungo cha fomu za HTML kiko katika Sura ya 3, HTML na Fomu.

Lebo

Lebo hutumika kubainisha ni sehemu gani ya faili ya HTML inafaa kutumika kwa maelezo yaliyowekwa na mtumiaji. Hii inarejelea jinsi kurasa nyingi za HTML huita programu ya CGI. Sifa za lebo hubainisha jina la programu na eneo - iwe ndani au kama URL kamili, aina ya usimbaji unaotumika, na mbinu ya kuhamisha data inayotumiwa na programu.

Mstari unaofuata unaonyesha vipimo vya lebo :

< ACTION FORM = "url" METHOD = ENCTYPE = "..." >

Sifa ya ENCTYPE haina jukumu maalum na kwa kawaida haijumuishwi kwenye lebo . Maelezo ya kina kuhusu lebo ya ENCTYPE yametolewa katika Sura ya 3. Njia moja ya kutumia ENCTYPE imeonyeshwa katika Sura ya 14, "Viendelezi vyenye Chapa."

Sifa ya ACTION inarejelea URL ya programu ya CGI. Mtumiaji akishajaza fomu na kutoa taarifa, taarifa zote husimbwa na kuhamishiwa kwa mpango wa CGI. Mpango wa CGI yenyewe hutatua tatizo la kusimbua na kusindika habari; Kipengele hiki kinajadiliwa katika "Kukubali Ingizo kutoka kwa Kivinjari," baadaye katika sura hii.

Hatimaye, sifa ya METHOD inaeleza jinsi mpango wa CGI unapaswa kupokea pembejeo. Mbinu hizo mbili, GET na POST, hutofautiana katika jinsi zinavyopitisha habari kwenye programu ya CGI. Zote mbili zinajadiliwa katika "Kukubali Ingizo kutoka kwa Kivinjari."

Ili kivinjari kiruhusu ingizo la mtumiaji, lebo zote za fomu na taarifa lazima zizungukwe na lebo . Usisahau lebo ya kufunga

ili kuonyesha mwisho wa fomu. Huwezi kuwa na fomu ndani ya fomu, ingawa unaweza kuunda fomu ambayo inakuwezesha kuwasilisha vipande vya habari katika maeneo tofauti; kipengele hiki kimejadiliwa kwa kina katika Sura ya 3.

Lebo

Unaweza kuunda pau za kuingiza maandishi, vitufe vya redio, visanduku vya kuteua, na njia nyinginezo za kukubali ingizo kwa kutumia lebo . Sehemu hii inashughulikia sehemu za maandishi pekee. Ili kutekeleza uwanja huu, tumia lebo na sifa zifuatazo:

< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >

NAME ni jina la ishara la kigezo ambacho kina thamani iliyowekwa na mtumiaji. Ukijumuisha maandishi katika sifa ya VALUE, maandishi hayo yatawekwa kama chaguo-msingi katika sehemu ya uingizaji maandishi. Sifa ya SIZE hukuruhusu kubainisha urefu wa mlalo wa sehemu ya ingizo jinsi itakavyoonekana kwenye dirisha la kivinjari. Hatimaye, MAXLENGTH inabainisha idadi ya juu zaidi ya herufi ambazo mtumiaji anaweza kuingia kwenye uga. Tafadhali kumbuka kuwa VALUE, SIZE, MAXLENGTH sifa ni za hiari.

Uwasilishaji wa Fomu

Ikiwa una sehemu moja tu ya maandishi ndani ya fomu, mtumiaji anaweza kuwasilisha fomu kwa kuandika tu maelezo kwenye kibodi na kubonyeza Enter. Vinginevyo, lazima kuwe na njia nyingine kwa mtumiaji kuwasilisha taarifa. Mtumiaji huwasilisha maelezo kwa kutumia kitufe cha wasilisha chenye lebo ifuatayo:

< Input type=submit >

Lebo hii huunda kitufe cha Wasilisha ndani ya fomu yako. Mtumiaji anapomaliza kujaza fomu, anaweza kuwasilisha maudhui yake kwa URL iliyobainishwa na sifa ya fomu ya ACTION kwa kubofya kitufe cha Wasilisha.

Inakubali ingizo kutoka kwa kivinjari

Hapo juu kulikuwa na mifano ya kurekodi programu ya CGI ambayo hutuma habari kutoka kwa seva hadi kwa kivinjari. Kwa kweli, programu ya CGI inayotoa data pekee haina programu nyingi (baadhi ya mifano imetolewa katika Sura ya 4). Uwezo muhimu zaidi wa CGI ni kupokea habari kutoka kwa kivinjari - kipengele kinachopa Wavuti tabia yake ya mwingiliano.

Programu ya CGI inapokea aina mbili za habari kutoka kwa kivinjari.

  • Kwanza, inapata vipande mbalimbali vya habari kuhusu kivinjari (aina yake, nini inaweza kuona, mwenyeji wa jeshi, na kadhalika), seva (jina lake na toleo, bandari yake ya utekelezaji, na kadhalika), na programu ya CGI. yenyewe ( jina la programu na mahali iko). Seva inatoa habari hii yote kwa programu ya CGI kupitia vigeu vya mazingira.
  • Pili, programu ya CGI inaweza kupokea pembejeo ya mtumiaji. Taarifa hii, baada ya kusimbwa na kivinjari, inatumwa ama kupitia kigeu cha mazingira (GET mbinu) au kupitia pembejeo ya kawaida (stdin - POST mbinu).

Vigezo vya Mazingira

Ni muhimu kujua ni anuwai gani ya mazingira inapatikana kwa programu ya CGI, wakati wa mafunzo na kwa utatuzi. Jedwali 2.2 linaorodhesha baadhi ya vigeu vya mazingira vinavyopatikana vya CGI. Unaweza pia kuandika programu ya CGI ambayo hutoa vigeu vya mazingira na maadili yao kwa kivinjari cha Wavuti.

Jedwali 2.2. Baadhi ya Vigeu Muhimu vya Mazingira ya CGI Mazingira Yanayobadilika Madhumuni REMOTE_ADDR Anwani ya IP ya mashine ya mteja. REMOTE_HOST Mpangishi wa mashine ya mteja. HTTP _ACCEPT Inaorodhesha aina za data za MIME ambazo kivinjari kinaweza kufasiri. HTTP _USER_AGENT Maelezo ya kivinjari (aina ya kivinjari, nambari ya toleo, mfumo wa uendeshaji, n.k.). REQUEST_METHOD GET au POST. CONTENT_LENGTH Ukubwa wa ingizo ukitumwa kupitia POST. Ikiwa hakuna pembejeo au ikiwa mbinu ya GET inatumiwa, parameter hii haijafafanuliwa. QUERY_STRING Ina taarifa ya ingizo inapopitishwa kwa kutumia mbinu ya GET. PATH_INFO Inaruhusu mtumiaji kubainisha njia kutoka kwa safu ya amri ya CGI (kwa mfano, http://hostname/cgi-bin/programname/path). PATH_TRANSLATED Inatafsiri njia ya jamaa katika PATH_INFO hadi njia halisi kwenye mfumo.

Kuandika programu ya CGI inayoonyesha vigeu vya mazingira, unahitaji kujua jinsi ya kufanya mambo mawili:

  • Fafanua anuwai zote za mazingira na maadili yao yanayolingana.
  • Chapisha matokeo kwa kivinjari.

Tayari unajua jinsi ya kufanya operesheni ya mwisho. Katika Perl, anuwai za mazingira huhifadhiwa katika safu ya ushirika %ENV, ambayo inaletwa kwa jina la utofauti wa mazingira. Orodha ya 2.3 ina env.cgi, programu ya Perl inayotimiza lengo letu.

Kuorodhesha 2.3. Programu ya Perl, env.cgi, ambayo huchapisha anuwai zote za mazingira za CGI.

#!/usr/local/bin/perl print "Content-type: text/html\n\n"; chapa" \n"; chapisha" Mazingira ya CGI\n"; chapisha"\n"; chapisha" \n"; chapisha"

Mazingira ya CGI

\n"; foreach $env_var (funguo %ENV) ( chapisha " $env_var= $ENV($env_var)
\n"; ) chapisha "

\n";

Mpango kama huo unaweza kuandikwa katika C; nambari kamili iko kwenye Orodha 2.4.

Kuorodhesha 2.4. Env.cgi.c katika C. /* env.cgi.c */ #include char ya nje **mazingira; int main() ( char **p = environ; printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); chapisha(" Mazingira ya CGI\n"); chapisha("\n"); chapisha(" \n"); chapisha("

Mazingira ya CGI

\n"); huku(*p != NULL) printf("%s
\n",*p++); printf("

\n");)

PATA au POST?

Kuna tofauti gani kati ya njia za GET na POST? GET hupitisha mfuatano wa ingizo uliosimbwa kupitia utofauti wa mazingira wa QUERY_STRING, huku POST inaupitisha kupitia stdin. POST ndiyo njia inayopendekezwa, hasa kwa fomu zilizo na data nyingi, kwa sababu hakuna vikwazo kwa kiasi cha taarifa iliyotumwa, wakati kwa mbinu ya GET kiasi cha nafasi ya midia ni chache. GET hata hivyo ina mali fulani muhimu; hii imeelezewa kwa kina katika Sura ya 5, Ingizo.

Ili kubainisha ni mbinu ipi inatumika, mpango wa CGI hukagua utofauti wa mazingira REQUEST_METHOD, ambao utawekwa kuwa ama GET au POST. Ikiwekwa kuwa POST, urefu wa maelezo yaliyosimbwa huhifadhiwa katika utofauti wa mazingira CONTENT_LENGTH.

Ingizo lenye Msimbo

Mtumiaji anapowasilisha fomu, kivinjari kwanza husimba maelezo kabla ya kuyatuma kwa seva na kisha kwa programu ya CGI. Unapotumia lebo , kila shamba limepewa jina la mfano. Thamani iliyoingizwa na mtumiaji inawakilishwa kama thamani ya kutofautisha.

Kuamua hili, kivinjari hutumia vipimo vya usimbaji vya URL, ambavyo vinaweza kuelezewa kama ifuatavyo:

  • Hutenganisha sehemu tofauti na ampersand (&).
  • Hutenganisha jina na maadili kwa ishara sawa (=), na jina upande wa kushoto na thamani upande wa kulia.
  • Hubadilisha nafasi kwa alama za kuongeza (+).
  • Hubadilisha herufi zote "zisizo za kawaida" kwa ishara ya asilimia (%) ikifuatiwa na msimbo wa heksi wa tarakimu mbili kwa herufi.

Mfuatano wako wa mwisho uliosimbwa utakuwa sawa na ufuatao:

Name1=value1&name2=value2&name3=value3 ...

Kumbuka: Maelezo ya usimbaji wa URL yanapatikana katika RFC1738.

Kwa mfano, tuseme ulikuwa na fomu iliyouliza jina na umri. Msimbo wa HTML ambao ulitumiwa kuonyesha fomu hii umeonyeshwa katika Orodha ya 2.5.

Kuorodhesha 2.5. Msimbo wa HTML wa kuonyesha jina na fomu ya umri.

Jina na Umri

Ingiza jina lako:

Weka umri wako:



Wacha tuseme mtumiaji anaingia Joe Schmoe kwenye uwanja wa jina na 20 kwenye uwanja wa umri. Ingizo litasimbwa katika mfuatano wa ingizo.

Jina=Joe+Schmoe&age=20

Ingizo la kuchanganua

Ili maelezo haya yawe ya manufaa, unahitaji kutumia taarifa juu ya kitu ambacho kinaweza kutumiwa na programu zako za CGI. Mikakati ya pembejeo ya uchanganuzi imefunikwa katika Sura ya 5. Kwa mazoezi, hutawahi kufikiria jinsi ya kuchanganua pembejeo, kwa sababu wataalam kadhaa tayari wameandika maktaba ambayo hufanya uchanganuzi, kupatikana kwa kila mtu. Maktaba mbili kama hizo zimewasilishwa katika sura hii katika sehemu zifuatazo: cgi -lib.pl kwa Perl (iliyoandikwa na Steve Brenner) na cgihtml kwa C (iliyoandikwa na mimi).

Lengo la jumla la maktaba nyingi zilizoandikwa katika lugha mbalimbali ni kuchanganua mfuatano uliosimbwa na kuweka jozi za jina na thamani katika muundo wa data. Kuna faida dhahiri ya kutumia lugha ambayo ina miundo ya data iliyojengewa ndani kama Perl; hata hivyo, maktaba nyingi za lugha za kiwango cha chini kama vile C na C++ zinajumuisha muundo wa data na utekelezaji wa utaratibu mdogo.

Si lazima kufikia ufahamu kamili wa maktaba; ni muhimu zaidi kujifunza jinsi ya kuzitumia kama zana ili kurahisisha kazi ya mtayarishaji programu wa CGI.

Cgi-lib.pl

Cgi-lib.pl hutumia safu shirikishi za Perl. &ReadParse chaguo za kukokotoa huchanganua mfuatano wa ingizo na kuingiza kila jozi ya jina/thamani kwa jina. Kwa mfano, kamba zinazolingana za Perl zinazohitajika ili kusimbua kamba ya ingizo ya "jina/umri" iliyowasilishwa hivi karibuni itakuwa.

&SomaChanganua(*ingizo);

Sasa, ili kuona thamani iliyoingizwa kwa "jina", unaweza kufikia safu ya ushirika $input("jina"). Vile vile, ili kufikia thamani ya "umri", unahitaji kuangalia kutofautiana $ pembejeo ("umri").

Cgihtml

C haina miundo ya data iliyojengewa ndani, kwa hivyo cgihtml hutekelezea orodha yake ya kiunganishi kwa matumizi na taratibu zake za uchanganuzi za CGI. Hii inafafanua muundo wa aina ya kiingilio kama ifuatavyo:

Muundo wa Typedef ( Char *jina; Char *value; ) Entrytype;

Ili kuchanganua kamba ya kuingiza "jina/umri" katika C kwa kutumia cgihtml, ifuatayo inatumika:

/* tangaza orodha iliyounganishwa inayoitwa pembejeo */ Ingizo la Orodha; /* changanua ingizo na eneo katika orodha iliyounganishwa */ read_cgi_input(&input);

Ili kufikia maelezo ya umri, unaweza kuchanganua orodha mwenyewe au kutumia chaguo la kukokotoa la cgi _val().

#pamoja na #pamoja na Chaji *umri = malloc(sizeof(char)*strlen(cgi_val(pembejeo, "umri")) + 1); Strcpy(umri, cgi_val(pembejeo, "umri");

Thamani ya "umri" sasa imehifadhiwa katika mfuatano wa umri.

Kumbuka: Badala ya kutumia safu rahisi (kama char age ;), ninatenga nafasi ya kumbukumbu kwa umri wa kamba. Ingawa hii hufanya programu kuwa ngumu zaidi, hata hivyo ni muhimu kutoka kwa mtazamo wa usalama. Hii inajadiliwa kwa undani zaidi katika Sura ya 9.

Programu rahisi ya CGI

Utaandika programu ya CGI inayoitwa nameage.cgi ambayo inashughulikia fomu ya jina/umri. Usindikaji wa data (kile kawaida huita "vitu") ni mdogo. Nameage.cgi huamua tu ingizo na kuonyesha jina na umri wa mtumiaji. Ingawa hakuna matumizi mengi ya zana kama hii, inaonyesha kipengele muhimu zaidi cha programu ya CGI: pembejeo na matokeo.

Unatumia fomu iliyo hapo juu, kuita sehemu za "jina na umri". Usijali kuhusu uimara na ufanisi bado; kutatua tatizo lililopo kwa njia rahisi zaidi. Suluhisho za Perl na C zinaonyeshwa kwenye Orodha 2.6 na 2.7, mtawalia.

Kuorodhesha 2.6. Jina.cgi katika Perl

#!/usr/local/bin/perl # nameage.cgi inahitaji "cgi-lib.pl" &ReadParse(*input); chapisha "Aina ya Yaliyomo: maandishi/html\r\n\r\n"; chapa" \n"; chapisha" Jina na Umri\n"; chapisha"\n"; chapisha" \n"; chapisha "Hujambo, " . $input("jina") . ". Una\n"; chapisha $input("age") . " umri wa miaka.

\n"; chapisha"

\n";

Kuorodhesha 2.7. nameage.cgi katika C

/* jina.cgi.c */ #jumuisha #jumuisha "cgi-lib.h" int main() ( llist input; read_cgi_input(&input); printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); chapisha(" Jina na Umri\n"); chapisha("\n"); chapisha(" \n"); printf("Hujambo, %s. Wewe ni\n",cgi_val(ingizo,"jina")); printf("miaka %s.

\n",cgi_val(ingizo,"umri")); printf("

\n");)

Tafadhali kumbuka kuwa programu hizi mbili ni karibu sawa. Zote zina kanuni za uchanganuzi ambazo huchukua mstari mmoja tu na huchakata ingizo zima (shukrani kwa taratibu zinazolingana za maktaba). Matokeo kimsingi ni toleo lililorekebishwa la programu yako kuu ya Hello, World!.

Jaribu kuendesha programu kwa kujaza fomu na kubofya kitufe cha Wasilisha.

Mkakati wa jumla wa programu

Sasa unajua kanuni zote za msingi zinazohitajika kwa upangaji programu wa CGI. Baada ya kuelewa jinsi CGI inapokea maelezo na jinsi inavyorejesha kwa kivinjari, ubora halisi wa bidhaa yako ya mwisho unategemea uwezo wako wa jumla wa kupanga programu. Yaani, unapopanga CGI (au kitu chochote, kwa jambo hilo), kumbuka sifa zifuatazo:

  • Urahisi
  • Ufanisi
  • Uwezo mwingi

Sifa mbili za kwanza ni za kawaida: jaribu kufanya nambari yako isomeke na kwa ufanisi iwezekanavyo. Usahihishaji hutumika zaidi kwa programu za CGI kuliko programu zingine. Unapoanza kuunda programu zako za CGI, utajifunza kuwa kuna programu kadhaa za kimsingi ambazo kila mtu anataka kutengeneza. Kwa mfano, moja ya kazi za kawaida na dhahiri za programu ya CGI ni kuchakata fomu na kutuma matokeo kwa barua pepe kwa mpokeaji mahususi. Unaweza kuwa na fomu nyingi tofauti kuchakatwa, kila moja ikiwa na mpokeaji tofauti. Badala ya kuandika programu ya CGI kwa kila fomu ya mtu binafsi, unaweza kuokoa muda kwa kuandika mpango wa jumla zaidi wa CGI ambao unatumika kwa aina zote.

Kwa kuangazia vipengele vyote vya msingi vya CGI, nimekupa maelezo ya kutosha ili kuanza na upangaji programu wa CGI. Walakini, ili kuwa msanidi mzuri wa CGI, unahitaji kuwa na ufahamu wa kina wa jinsi CGI inavyowasiliana na seva na kivinjari. Sehemu iliyobaki ya kitabu hiki inashughulikia kwa kina masuala ambayo yametajwa kwa ufupi katika sura hii, pamoja na mkakati wa ukuzaji wa matumizi na faida na mapungufu ya itifaki.

Muhtasari

Sura hii ilileta kwa ufupi misingi ya upangaji programu ya CGI. Unaunda pato kwa kufomati data yako kwa usahihi na kuchapisha kwa stdout. Kupokea ingizo la CGI ni ngumu zaidi kwa sababu lazima ichanganuliwe kabla ya kutumika. Kwa bahati nzuri, maktaba kadhaa tayari zipo ambazo hufanya uchanganuzi.

Kufikia sasa unapaswa kuwa sawa na upangaji wa programu za CGI. Salio la kitabu hiki linaingia kwa undani zaidi kuhusu vipimo, vidokezo, na mikakati ya upangaji kwa matumizi ya hali ya juu zaidi na changamano.