Antara Muka Gerbang Biasa (CGI). Mengapa saya memerlukan FastCGI apabila saya sudah mempunyai PHP, Ruby, Python, Perl, dll.? Asas interaksi antara pelayan Web dan skrip CGI

Apabila pengguna mengisi borang html dan mengklik hantar, data dihantar ke pelayan web. Pelayan web, sama ada Apache, IIS atau yang lain, menjalankan program yang dinyatakan sebagai nilai atribut tindakan. Dalam kes kami ini adalah test.cgi. Pelayan web menjalankan test.cgi dan menghantar parameternya dalam bentuk rentetan teks dengan kandungan berikut: name1=value1&name2=value2&....nameN=valueN, i.e. nama_parameter=nilai. Rentetan ini dihantar ke input standard (STDIN) atau sebagai nilai pembolehubah persekitaran QUERY_STRING. Sehubungan itu, baris ini boleh dibaca dalam program dalam salah satu daripada dua cara:

Dalam kes pertama, parameter diluluskan kaedah POST, dan dalam yang kedua menggunakan kaedah GET. Dalam kes pertama, kami membaca rentetan daripada STDIN. Kami mengetahui panjang garisan daripada nilai parameter persekitaran CONTENT_LENGTH. Dalam yang kedua, ia disimpan dalam pembolehubah persekitaran QUERY_STRING. Nilai pembolehubah persekitaran boleh diperoleh dengan memanggil fungsi getenv. Kaedah yang mana rentetan parameter dihantar ke program CGI boleh ditakrifkan seperti berikut: strcmp(getenv("REQUEST_METHOD"),"POST"). Seterusnya anda perlu menghuraikan rentetan dan mendapatkan nilai parameter yang diperlukan. Untuk tidak perlu melakukan ini setiap kali, kami menulis perpustakaan ITCGI yang kecil tetapi sangat mudah untuk menulis skrip CGI. Pustaka ini membolehkan anda mengabstraksi sepenuhnya daripada kaedah yang mana parameter diluluskan, daripada pengekodan, daripada menghuraikan rentetan. Anda hanya perlu memanggil fungsi GetParamByName, yang mana anda menghantar nama parameter yang anda minati dan alamat baris untuk menyimpan nilai. Perpustakaan ini juga menyediakan anda dengan beberapa fungsi untuk menulis skrip CGI yang cekap dan kalis gangguan.
Dalam kes paling mudah, apabila program anda tidak memerlukan parameter, anda tidak perlu menghuraikan dan menyahkod rentetan itu sendiri, atau menggunakan perpustakaan kami untuk ini. Program CGI yang paling mudah ialah: Tajuk adalah bahagian yang diperlukan. Ia dihantar ke pelayan web dan menentukan perkara yang mengikutinya. Dalam kebanyakan kes, ini adalah tajuk anda. Ia memberitahu pelayan web tentang kod HTML yang akan datang. Kami akan mengenali jenis pengepala lain sedikit kemudian. Tajuk mungkin mengandungi beberapa baris. Penghujung tajuk ditunjukkan oleh dua peralihan kepada baris baru- \n\n. Susun atur cara ini dan letakkan fail boleh laku dalam direktori /cgi-bin tapak web anda. Namakannya semula kepada test.cgi. Skrip ini boleh diakses terus melalui pelayar dengan menulis kepada baris arahan URL, sebagai contoh, bagi saya ia kelihatan seperti ini http://site/cgi-bin/test.cgi Akibatnya, dalam penyemak imbas anda, anda akan melihat baris: "Hello, World!"
Seterusnya kita akan melihat program CGI dari jenis yang sama. Ia tidak menerima sebarang parameter, tetapi ia menghasilkan lebih banyak informasi berguna- senarai dan nilai semua pembolehubah persekitaran. Skrip ini akan berguna apabila anda menyahpepijat program CGI anda pada pelbagai pelayan web. Hakikatnya ialah pembolehubah persekitaran berbeza-beza pada pelayan web yang berbeza. Jadi, sebagai contoh, untuk pelayan web Apache, laluan ke direktori tapak web disimpan dalam pembolehubah persekitaran DOCUMENT_ROOT. Untuk pelayan web Internet Microsoft Pelayan Maklumat nilai ini disimpan dalam pembolehubah PATH_TRANSLATED. DALAM sistem operasi Skrip UNIX untuk memaparkan semua pembolehubah kelihatan seperti ini.
#!/bin/sh echo "jenis kandungan: text/plain\n\n" echo env
Perhatikan tajuk CGI. Ia berbeza daripada yang kita ada dalam contoh sebelumnya. biasa bermakna bahawa skrip tidak akan mengeluarkan kod HTML, tetapi teks tulen. Pelayar akan menganggapnya sebagai teks kosong dan output betul-betul apa adanya. Tidak perlu menggantikan watak istimewa seperti< на их эквиваленты <. Скопируйте этот скрипт в директорию /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 (serasi; MSIE 5.0; Windows 98; DOTHCURTO/DigTyExt)=www. Asas SERVER_SIGNATURE=
Pelayan Apache/1.3.12 di 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=tapak
Program C untuk Windows dan pelayan web Pelayan Maklumat Internet akan kelihatan seperti ini:
#termasuk #termasuk void main() ( char *text; char str; int length; FILE *in; sprintf(str,"command.com /c set>%s\\temp\\env.dmp",getenv("PATH_TRANSLATED")) ; system(str); sprintf(str,"%s\\temp\\env.dmp",getenv("PATH_TRANSLATED")); in = fopen(str, "rb"); if(!in) ( printf( "Jenis kandungan: text/plain\n\n"Tidak boleh membuka fail %s.", str); return; ) fseek(in, 0, SEEK_END); length = ftell(in); fseek(in, 0, SEEK_SET ); teks = (char*)malloc(panjang+1); fread(teks, 1, panjang, dalam); teks = 0; fclose(dalam); printf("Jenis kandungan: teks/plain\n\n% s", teks); percuma(teks); )
Mula-mula, jalankan arahan command.com /c set>c:\www\mysite\temp\env.dmp. Hasil daripada melaksanakan arahan sedemikian akan menjadi senarai semua pembolehubah persekitaran, yang kemudiannya disimpan ke fail. Seterusnya, kami membaca fail ini dan mengembalikan kandungannya ke pelayan web. Anda mungkin perasan bahawa dalam kes ini, seperti dalam contoh sebelumnya, kami tidak mencetak kod html, tetapi teks tulen, dan oleh itu kami mempunyai tajuk: Content-type: text/plain. Jangan lupa juga bahawa skrip cgi ini hanya akan berfungsi di bawah Pelayan Maklumat Internet. Untuk pelayan web Apache, anda harus menggantikan getenv("PATH_TRANSLATED") dengan getenv("DOCUMENT_ROOT").
Di bawah ialah output skrip ini pada WindowsNT, anda boleh melihat berapa banyak parameter yang tersedia melalui pembolehubah persekitaran. Skrip cgi sedemikian akan berguna kepada anda apabila menyediakan skrip anda pada pelayan orang lain, di mana pembolehubah persekitaran mungkin berbeza daripada yang setempat anda. COMSPEC=C:\WINNT\SYSTEM32\COMMAND.COM COMPUTERNAME=JUPITER CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint , application/vnd.ms-excel, applic HTTP_ACCEPT_LANGUAGE=ru HTTP_CONNECTION=Keep-Alive HTTP_HOST=www.oxygensoftware.com HTTP_USER_AGENT=Mozilla/4.0 (serasi; MSIE 5.01; Windows NT 5.0) HTTP_ACCEPT_ENCODING= HTTP_ACCEPT_ENCODING = INCLUDE 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; .VBS;.JS. HOS = 194.226.32.34 REQUEST_METHOD=DAPATKAN SCRIPT_NAME=/cgi-bin/env.exe SERVER_NAME=www.oxygensoftware.com SERVER_PORT=80 SERVER_PORT_SECURE=0 SERVER_PROTOCOL=HTTP/1.1 SERVER_SOFTWARE-SYSTEM=Microsoftware.com C: \ WINNT TEMP=C:\temp TMP=C:\temp USERPROFILE=C:\WINNT\Profiles\Default User Seterusnya, sebelum beralih kepada pertimbangan skrip cgi yang menerima dan memproses parameter borang, kami akan menulis program ringkas yang menghasilkan parameter bentuk html baris. Baca di atas tentang cara parameter borang dibaca; di sini saya menyediakan kod sumber program dan hasilnya untuk borang html yang diterangkan dalam bab keempat.
#termasuk #termasuk void main() ( char* query=NULL; if(!strcmp(getenv("REQUEST_METHOD"),"POST")) ( unsigned int len; len = atoi(getenv("CONTENT_LENGTH")); query = (char* )malloc(len+1); fread(query, 1, len, stdin); query = 0; ) else if(!strcmp(getenv("REQUEST_METHOD"),"GET")) ( query=(char*)malloc (strlen(getenv("QUERY_STRING"))); strcpy(query,getenv("QUERY_STRING")); ) else printf("REQUEST_METHOD\n"); printf("Content-type: text/plain\n\n %s", pertanyaan); percuma(pertanyaan); )
Susun kod ini. Ia adalah platform bebas, jadi anda boleh menyusunnya di bawah kedua-dua Unix dan Windows. Ambil borang HTML dari bab keempat, anda boleh ambil yang lain. Dalam medan tindakan, masukkan laluan ke program ini pada pelayan web anda. Keputusan selepas mengklik butang "Terbitkan":
teks=sifar&teks=sifar&senarai=0&senarai2=0&kawasan teks=%C7%E4%E5%F1%FC+%F2%E5%EA%F1%F2+%EF%EE+%F3%EC%EE%EB%F7%E0%ED%E8 %FE

Ini ialah rentetan yang mengandungi senarai semua parameter. Seterusnya, anda boleh menggunakan pustaka ITCGI kami atau menghuraikan rentetan parameter ini sendiri. Baca tentang perpustakaan dan kegunaan praktikalnya dalam perenggan seterusnya.

pengenalan.

Dalam artikel ini saya ingin bercakap tentang antara muka CGI secara umum, pelaksanaannya untuk Windows dan penggunaan bahasa perhimpunan khususnya semasa menulis program CGI. Skop artikel ini tidak termasuk penerangan penuh tentang CGI, kerana terdapat banyak bahan mengenai isu ini di Internet dan saya tidak nampak gunanya menceritakan semuanya di sini.

TeoriCGI.

CGI – (Antara Muka Gerbang Biasa) – Antara Muka Gerbang Biasa. Seperti yang anda fikirkan, antara muka ini berfungsi sebagai pintu masuk antara pelayan (di sini saya maksudkan program pelayan) dan beberapa program luaran yang ditulis untuk OS di mana pelayan ini sedang berjalan. Oleh itu, CGI bertanggungjawab untuk bagaimana data akan dipindahkan dari program pelayan ke program CGI dan kembali. Antara muka tidak mengenakan sebarang sekatan pada program CGI yang harus ditulis; ia boleh sama ada fail boleh laku biasa atau mana-mana fail lain - perkara utama ialah pelayan boleh menjalankannya (dalam persekitaran Windows, contohnya, ia boleh menjadi fail dengan sambungan terikat pada mana-mana program).

Dari saat anda memanggil (contohnya, mengklik butang borang yang mana panggilan program CGI dilampirkan) program CGI sehingga anda menerima keputusan dalam tetingkap penyemak imbas anda, perkara berikut berlaku:

Pelanggan web (seperti penyemak imbas) mencipta sambungan ke pelayan yang dinyatakan dalam URL;

Pelanggan web menghantar permintaan kepada pelayan, permintaan ini biasanya dibuat menggunakan dua kaedah GET atau POST;

Data daripada permintaan pelanggan (contohnya, nilai medan borang) dihantar oleh pelayan, menggunakan antara muka CGI, kepada program CGI yang dinyatakan dalam URL;

Program CGI memproses data pelanggan yang diterima daripada pelayan dan, berdasarkan pemprosesan ini, menjana tindak balas kepada pelanggan, yang ia hantar melalui antara muka CGI yang sama kepada pelayan, dan ia, seterusnya, menghantarnya terus kepada pelanggan;

Pelayan menutup sambungan dengan klien.

Spesifikasi CGI standard menganggap bahawa pelayan boleh berkomunikasi dengan program dengan cara berikut:

Pembolehubah persekitaran – ia boleh ditetapkan oleh pelayan apabila program bermula;

Strim input standard (STDIN) - dengan bantuannya, pelayan boleh memindahkan data ke program;

Strim output standard (STDOUT) – program boleh menulis outputnya ke dalamnya, yang dihantar ke pelayan;

Baris arahan - di dalamnya pelayan boleh menghantar beberapa parameter kepada program.

Strim input/output standard sangat mudah dan digunakan secara meluas pada sistem UNIX, yang tidak boleh dikatakan tentang Windows, jadi terdapat spesifikasi CGI yang dibangunkan khusus untuk sistem Windows, dipanggil "Windows CGI". Tetapi, sudah tentu, aliran input/output standard juga boleh digunakan dalam pengaturcaraan CGI windows. Di sini saya tidak akan menyentuh standard "Windows CGI", dan terdapat sekurang-kurangnya dua sebab untuk ini - yang pertama, dan yang paling penting, ialah pada masa ini tidak semua pelayan http untuk Windows menyokong spesifikasi ini (khususnya, kegemaran saya Apache 1.3.19). Anda boleh melihat sebab kedua dengan menaip "Windows CGI" dalam mana-mana enjin carian. Saya akan ambil perhatian hanya butiran umum mengenai antara muka ini - semua data dari pelayan kepada klien dipindahkan melalui fail yang biasa untuk Windows *.ini, yang namanya dihantar ke program pada baris arahan. Dalam kes ini, semua data dalam fail telah dibahagikan dengan teliti kepada bahagian oleh pelayan dan anda hanya perlu menggunakan fungsi "GetPrivateProfile*" untuk mengekstraknya dari sana. Respons dihantar ke pelayan sekali lagi melalui fail yang namanya ditunjukkan dalam entri yang sepadan dalam fail ini.

Apakah data yang boleh dipindahkan oleh pelanggan ke program CGI? - hampir semua. Secara umum, program ini memberikan nilai medan borang yang diisi oleh pelanggan, tetapi ia juga boleh menjadi beberapa jenis data binari, contohnya, fail dengan gambar atau muzik. Data boleh dipindahkan ke pelayan melalui dua kaedah berbeza - kaedah GET dan kaedah POST. Apabila kami membuat borang untuk diisi di halaman kami, kami secara jelas menunjukkan kaedah yang mana yang kami mahu hantar data yang dimasukkan oleh pengguna, ini dilakukan dalam teg utama borang seperti ini:

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

Apabila menghantar data menggunakan kaedah GET, penyemak imbas membaca data daripada borang dan meletakkannya selepas URL skrip, diikuti dengan tanda soal; jika terdapat beberapa medan penting dalam borang, maka semuanya dihantar melalui “&” tanda, nama medan dan nilainya ditulis dalam URL melalui tanda “=” " Sebagai contoh, permintaan yang dijana oleh penyemak imbas daripada borang apabila anda mengklik butang yang dilampirkan skrip "/cgi-bin/test.exe", dengan mengambil kira bahawa medan pertama borang dipanggil "nama_anda" , yang kedua – "umur_anda", mungkin kelihatan seperti ini:

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

Menggunakan kaedah GET mempunyai beberapa kelemahan - yang pertama dan paling penting adalah kerana Data dihantar dalam URL, maka ia mempunyai had pada jumlah data yang dihantar ini. Kelemahan kedua sekali lagi mengikuti dari URL - ini adalah kerahsiaan, dengan pemindahan sedemikian, data tetap terbuka sepenuhnya. Jadi, ada baiknya jika kita mempunyai 2-3 medan kecil dalam bentuk ... timbul persoalan, apa yang perlu dilakukan jika terdapat lebih banyak data? Jawapannya gunakan kaedah POST!

Apabila menggunakan kaedah POST, data dihantar ke pelayan sebagai blok data, dan bukan dalam URL, yang sedikit sebanyak membebaskan tangan kita untuk meningkatkan jumlah maklumat yang dihantar; untuk contoh borang POST di atas, blok dihantar ke pelayan akan menjadi seperti ini:

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

Terima: teks / biasa

Terima: teks/html

Terima: */*

Jenis kandungan: application/x-www-form-urlencoded

Panjang kandungan: 36

your_name=Pupkin&your_age=90

Seperti yang dinyatakan di atas, selepas menerima data, pelayan mesti menukarnya dan menyerahkannya kepada program CGI. Dalam spesifikasi CGI standard, input klien untuk permintaan GET diletakkan oleh pelayan dalam pembolehubah persekitaran program "QUERY_STRING". Apabila permintaan POST dibuat, data diletakkan pada aliran input standard aplikasi, di mana ia boleh dibaca olehnya. Di samping itu, dengan permintaan sedemikian, pelayan menetapkan dua lagi pembolehubah persekitaran - CONTENT_LENGTH dan CONTENT_TYPE, yang mana seseorang boleh menilai panjang permintaan dalam bait dan kandungannya.

Sebagai tambahan kepada data itu sendiri, pelayan juga menetapkan pembolehubah persekitaran lain bagi program yang dipanggil; berikut adalah beberapa daripadanya:

REQUEST_METHOD

Menerangkan dengan tepat bagaimana data diperolehi

Contoh:REQUEST_METHOD=DAPATKAN

QUERY_STRING

Rentetan pertanyaan jika kaedah GET digunakan

Contoh:QUERY_STRING= nama_anda=Pupkin&umur_anda=90&hobi=asm

CONTENT_LENGTH

Panjang dalam bait badan permintaan

Contoh:CONTENT_LENGTH=31

JENIS KANDUNGAN

Permintaan jenis badan

GATEWAY_INTERFACE

Versi protokol CGI

Contoh:LALUAN_ ANTARA MUKA= CGI/1.1

REMOTE_ADDR

Alamat IP hos jauh, iaitu pelanggan yang mengklik butang dalam borang

Contoh:REMOTE_ADDR=10.21.23.10

REMOTE_HOST

Nama hos jauh, ini boleh menjadi nama domainnya atau, sebagai contoh, nama komputer dalam persekitaran Windows; jika ini tidak dapat diperoleh, maka medan tersebut mengandungi IPnya

Contoh:REMOTE_HOST=wasm.ru

SCRIPT_NAME

Nama skrip yang digunakan dalam permintaan.

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

SCRIPT_FILENAME

Nama fail skrip pada pelayan.

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

SERVER _ PERISIAN

Perisian pelayan

Contoh: Apache/1.3.19 (MENANG32)

Secara umum, ini semua secara ringkas, untuk maklumat yang lebih terperinci tentang Antara Muka Gerbang Biasa, lihat dokumentasi khusus, saya membuat penerangan ini untuk mengingatkan anda, dan jika anda tidak tahu, kemudian bawa anda terkini. Mari cuba lakukan sesuatu dalam amalan.

Bahagian praktikal.

Untuk latihan, kami memerlukan sekurang-kurangnya 3 perkara - beberapa jenis pelayan http untuk Windows, saya mencuba semua contoh pada Apache 1.3.19 untuk Windows, pelayan adalah percuma, anda boleh memuat turunnya dari http://httpd.apache. org/download.cgi . Ya, dan kami memerlukan pelayan, bukan sebarang pelayan, tetapi yang dikonfigurasikan untuk menjalankan skrip CGI! Lihat dokumentasi untuk cara melakukan ini untuk pelayan yang anda gunakan. Perkara kedua yang kita perlukan ialah, sudah tentu, pemasang; pengkompil juga perlu menyokong penciptaan aplikasi konsol WIN32, saya menggunakan Tasm, tetapi Fasm dan Masm dan banyak *asms lain adalah sempurna. Dan akhirnya, perkara yang paling penting ialah keinginan ini diperlukan.

Jadi, saya menganggap bahawa pelayan telah berjaya dipasang dan dikonfigurasikan oleh anda, supaya dalam direktori akar dokumen pelayan terdapat fail index.html, yang dipaparkan dengan sempurna dalam penyemak imbas apabila anda menaip alamat http://127.0 .0.1. Saya juga akan mengambil kira bahawa di suatu tempat di dalam hutan folder pelayan terdapat folder "cgi-bin" di mana skrip dibenarkan untuk dijalankan.

Mari kita semak tetapan pelayan, dan pada masa yang sama tulis skrip kecil. Skrip kami akan menjadi fail *.bat biasa. Saya meramalkan soalan - bagaimana? betul ke? Ya, ini adalah fail kelompok biasa, seperti yang dinyatakan di atas, spesifikasi CGI tidak membezakan antara jenis fail, perkara utama ialah pelayan boleh menjalankannya, dan ia, seterusnya, mempunyai akses kepada pembolehubah stdin/stdout dan persekitaran, fail kelawar, walaupun tidak sepenuhnya, tetapi sebagai contoh ia akan sesuai dengan kita dengan baik. Mari buat fail dengan lebih kurang kandungan berikut:

@echo off rem Minta gema pengepala Jenis kandungan: teks/html gema. rem Minta gema badan " hello!
echo "Permintaan GET menghantar data berikut: %QUERY_STRING%

Mari kita panggil fail test.bat dan letakkannya dalam direktori untuk menjalankan skrip, kemungkinan besar ia akan menjadi direktori "cgi-bin". Perkara seterusnya yang perlu kita lakukan ialah memanggil skrip ini dalam beberapa cara, pada dasarnya, ini boleh dilakukan secara langsung dengan menaip sesuatu seperti berikut "http://127.0.0.1/cgi-bin/test.bat" ke dalam alamat penyemak imbas tetingkap, tetapi mari kita panggilnya dari halaman utama kami, dan pada masa yang sama semak operasi kaedah GET. Mari buat fail index.html dalam akar pelayan dengan kandungan berikut:

Masukkan data untuk dipindahkan ke pelayan:
Data:


Sekarang, apabila anda memasuki pelayan (http://127.0.0.1 dalam bar alamat penyemak imbas), borang akan muncul, taip sesuatu di dalamnya dan klik butang "hantar", jika semuanya dilakukan dengan betul, anda akan melihat respons daripada kelawar kami- dalam skrip tetingkap penyemak imbas. Sekarang mari kita lihat apa yang kita lakukan di sana.

Seperti yang anda fikirkan, arahan "gema" menghasilkan stdout; pertama sekali, kami menghantar pengepala respons kami kepada pelayan - "jenis Kandungan echo: teks/html". Ini ialah pengepala spesifikasi CGI standard, menunjukkan bahawa kami ingin memindahkan teks atau dokumen html; terdapat pengepala lain. Perkara yang sangat penting ialah tajuk. mesti dipisahkan daripada badan tindak balas dengan baris kosong, iaitu apa yang kita lakukan dengan arahan "gema." berikut. Seterusnya, badan respons itu sendiri dihantar - ini adalah dokumen html biasa. Dalam badan dokumen, untuk kejelasan, saya memaparkan salah satu pembolehubah persekitaran yang dihantar kepada kami oleh pelayan - "QUERY_STRING", seperti yang telah disebutkan dengan kaedah GET (dan ini betul-betul kes kami), semuanya dihantar dalam data yang dimasukkan pengguna berubah-ubah ini, yang boleh kita perhatikan dalam tindak balas skrip. Anda mungkin perasan "tanda petikan tidak pada tempatnya" dalam 2 baris terakhir fail, sejurus selepas "gema", ia berada di sana kerana kekhususan fail kelawar, kerana anda dapat melihat tag html dikelilingi oleh watak "<» и «>", pada masa yang sama, simbol ini berfungsi sebagai pengalihan input/output dalam fail kelawar, dan oleh itu kami tidak boleh menggunakannya secara bebas di sini.

Saya mengesyorkan bermain-main sedikit dengan skrip kelawar seperti itu, ia boleh menjadi sangat berguna, cuba lihat pembolehubah persekitaran yang lain. Saya akan katakan sedikit, menyimpang dari topik, pada sistem UNIX, bahasa penterjemah arahan sangat maju dan garis antara pengaturcaraan dalam bahasa jurubahasa arahan dan pengaturcaraan dalam bahasa pengaturcaraan "sebenar" adalah sangat, sangat kabur dalam sesetengah kes, jadi skrip mudah sering ditulis pada sistem UNIX khususnya dalam bahasa penterjemah arahan, tetapi penterjemah Windows cmd.exe atau, sebelum ini, command.com jelas lemah untuk tujuan ini.

Sekarang mari kita beralih kepada tugas yang paling penting dalam artikel ini, untuk menulis program CGI dalam penghimpun. Pada dasarnya, jika kita mengambil kira semua perkara di atas tentang CGI, kita boleh membuat kesimpulan tentang perkara yang diperlukan antara muka CGI daripada program kami:

2. Program mesti boleh menulis ke aliran keluaran standard (stdout) untuk menghantar hasil kerjanya ke pelayan;

3. Daripada dua perkara pertama, ia mengikuti bahawa untuk pelayan menghantar sesuatu ke program kami dalam stdin, dan untuk ia bertindak balas kepadanya dalam stdout, program CGI mestilah aplikasi konsol;

Ini cukup untuk mencipta aplikasi CGI yang lengkap.

Mari kita mulakan dengan titik terakhir. Untuk mendapatkan akses kepada pembolehubah persekitaran aplikasi Windows, fungsi API "GetEnvironmentStrings" digunakan, fungsi itu tidak mempunyai argumen dan mengembalikan penunjuk kepada tatasusunan pembolehubah persekitaran (NAME=VALUE) yang dipisahkan dengan sifar, tatasusunan ditutup dengan sifar berganda, apabila program dilancarkan oleh pelayan dalam persekitaran program sebagai tambahan kepada pembolehubah standard, pembolehubah CGI khusus yang diterangkan di atas ditambah; apabila anda menjalankan program dari baris arahan, anda tidak akan melihatnya, secara semula jadi.

Untuk menulis sesuatu untuk stdout atau membaca daripada stdin, pertama sekali kita perlu mendapatkan pemegang aliran ini, ini dilakukan menggunakan fungsi API "GetStdHandle", salah satu nilai berikut diluluskan sebagai parameter fungsi:

STD_INPUT_HANDLE - untuk stdin (input standard);

STD_OUTPUT_HANDLE - untuk stdout (output standard);

STD_ERROR_HANDLE - untuk stderr.

Fungsi ini akan mengembalikan pemegang yang kami perlukan untuk operasi baca/tulis. Perkara seterusnya yang perlu kita lakukan ialah menulis/membaca aliran ini. Ini dilakukan oleh operasi baca/tulis fail biasa, i.e. ReadFile dan WriteFile. Terdapat satu kehalusan di sini, anda mungkin berfikir bahawa WriteConsole/ReadConsole boleh digunakan untuk tujuan ini, tetapi ini memang benar untuk konsol dan ia akan berfungsi dengan baik, hasilnya, seperti dengan WriteFile, akan dikeluarkan kepada konsol, tetapi ini akan berterusan sehingga kami menjalankan program kami sebagai skrip pada pelayan. Ini berlaku kerana apabila program kami dilancarkan oleh pelayan, pemegang yang dikembalikan oleh fungsi "GetStdHandle" tidak lagi menjadi pemegang konsol kerana itu, ia akan menjadi pemegang paip, yang diperlukan untuk menyambungkan dua aplikasi.

Berikut ialah contoh kecil tentang rupa program CGI dalam bahasa himpunan; Saya fikir ia tidak akan terlalu sukar untuk memikirkannya:>

386 .model flat,stdcall includelib import32.lib .const PAGE_READWRITE = 4j MEM_COMMIT = 1000j MEM_RESERVE = 2000j STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 .data hStdout dd ? hStdin dd ? hMem dd ? header: db "Content-Type: text/html",13,10,13,10,0 start_html: db " Persekitaran program CGI kelihatan seperti ini:
",13,10,0 for_stdin: db " STDIN program ini mengandungi:
",13,10,0 end_html: db "

",13,10,0 nwritten dd ? toscr db 10 dup (32) db " - Jenis fail",0 .code _start: xor ebx,ebx call GetStdHandle,STD_OUTPUT_HANDLE mov hStdout,eax call,GetStdHandle mov_STDLEIN write_stdout, offset header call write_stdout, offset start_html panggilan VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE mov hMem,eax mov edi,eax call GetEnvironmentStringsA mov esi,eax next_symbol: mov al, rentetan_seterusnya : cmpsb jmp pendek 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

Fail boleh laku dibina dengan arahan:

tasm32.exe /ml test.asm

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

Jangan lupa bahawa program itu mestilah program konsol.

Arkibkan dengan program.

Anda boleh memanggil program ini menggunakan borang html yang diterangkan di atas, anda hanya perlu menukar nama test.bat dalam borang kepada test.exe dan salin ke /cgi-bin/ sewajarnya, anda boleh menetapkannya kepada POST dalam kaedah permintaan , program memprosesnya.

Saya juga ingin ambil perhatian bahawa anda boleh memanggil program dengan cara lain, anda boleh mencipta fail dalam direktori cgi-bin, contohnya test.cgi, dengan satu baris "#!c:/_path_/test.exe" dan memanggilnya dalam permintaan, dan pelayan pula akan membaca baris pertamanya dan melancarkan fail exe; untuk ini, sambungan *.cgi perlu dinyatakan dalam tetapan pelayan http sebagai sambungan untuk skrip. Dengan pendekatan ini, pelayan akan melancarkan program kami dengan baris arahan "test.exe path_to_test.exe" ini mempunyai beberapa kelebihan - yang pertama ialah orang yang menjalankan skrip kami tidak akan meneka apa yang ditulis dalam skrip, yang kedua ialah bahawa ia dihantar kepada kami nama fail dengan baris kami, kami boleh, sebagai contoh, menambah sebarang tetapan untuk skrip kami ke fail ini, yang memudahkan penyahpepijatan, dengan cara ini, ini adalah cara semua jurubahasa berfungsi - anda mungkin perasan bahawa dalam semua program perl/php/etc terdapat baris yang sama - menunjukkan kepada penterjemah arahan itu sendiri. Jadi, apabila pelayan memulakan program cgi, jika sambungan program didaftarkan sebagai skrip dalam tetapan, ia membaca baris pertama fail, dan jika ia ternyata dalam format yang diterangkan di atas, maka ia melancarkan program dinyatakan dalam baris dengan nama fail ini diikuti dengan ruang, katakan bahawa dalam Jurubahasa mutiara ditunjukkan dalam baris; setelah menerima hadiah sedemikian, ia memulakan pelaksanaannya, kerana Komen dalam Perl ialah simbol "#", kemudian ia melangkau baris pertama dan skrip terus dilaksanakan, secara amnya ia adalah perkara yang mudah.

Pada asasnya itu sahaja yang saya ingin tulis, saya tidak tahu betapa bergunanya semua ini kepada anda, tetapi saya akan mengatakan bahawa saya mempunyai pelayan intranet yang berjalan menggunakan skrip pemasang. Saya mengaku, tidak ada sebab yang bagus untuk melakukan ini, tetapi bagaimanapun, saya melakukannya pada mulanya semata-mata untuk alasan estetik dan keengganan untuk mempelajari mutiara/php atau sesuatu yang lain. TETAPI SAYA sama sekali tidak menghalang anda daripada belajar Pearl, tetapi sebaliknya, saya akan mengatakan bahawa ia adalah perlu untuk melakukan ini, dan bahkan sangat perlu, saya menyedari ini kemudian, tetapi saya masih berfikir bahawa pada pelayan yang sarat, di mana kelajuan pelaksanaan, pemuatan dan jumlah memori yang diduduki oleh aplikasi memainkan peranan skrip cgi yang ditulis dalam pemasang akan mengambil tempat yang sepatutnya.



Antara Muka Gerbang Biasa (CGI, Antara Muka Gerbang Biasa Rusia) ialah kaedah standard untuk mengurus kandungan halaman web secara dinamik menggunakan program khas yang dijalankan pada bahagian pelayan web. Program ini dipanggil pengendali atau gerbang CGI, tetapi lebih kerap - skrip CGI, kerana... mereka biasanya ditulis dalam bahasa skrip, terutamanya Perl.

Oleh kerana hiperteks bersifat statik, halaman web tidak boleh berinteraksi secara langsung dengan pengguna. Sebelum kemunculan JavaScript, tiada cara lain untuk bertindak balas terhadap tindakan pengguna selain menghantar data yang mereka masukkan ke pelayan web untuk pemprosesan selanjutnya. Dalam kes CGI, pemprosesan ini dijalankan menggunakan program dan skrip luaran, yang diakses melalui antara muka piawai (lihat RFC 3875: CGI Versi 1.1) - gerbang biasa. Model ringkas yang menggambarkan operasi CGI ditunjukkan dalam Rajah. 1.

Bagaimanakah CGI berfungsi?

Algoritma umum untuk bekerja melalui CGI boleh dibentangkan seperti berikut:

  1. Pelanggan meminta aplikasi CGI oleh URInya.
  2. Pelayan web menerima permintaan dan menetapkan pembolehubah persekitaran, yang melaluinya data dan maklumat perkhidmatan dihantar ke aplikasi.
  3. Pelayan web mengubah hala permintaan melalui input standard (stdin) kepada input program yang dipanggil.
  4. Aplikasi CGI melaksanakan semua operasi yang diperlukan dan menjana hasil sebagai HTML.
  5. Hiperteks yang dihasilkan dikembalikan ke pelayan web melalui aliran keluaran standard (stdout). Mesej ralat dihantar melalui stderr.
  6. Pelayan web menghantar hasil permintaan kepada pelanggan.

Aplikasi CGI

Tugas yang paling biasa digunakan CGI ialah penciptaan halaman interaktif, yang kandungannya bergantung pada tindakan pengguna. Contoh biasa halaman web tersebut ialah borang pendaftaran tapak web atau borang ulasan. Satu lagi bidang penggunaan CGI, kekal di belakang tabir interaksi pengguna, dikaitkan dengan pengumpulan dan pemprosesan maklumat tentang pelanggan: menetapkan dan membaca "kuki"; mendapatkan data mengenai penyemak imbas dan sistem pengendalian; mengira bilangan lawatan ke halaman web; pemantauan trafik web, dsb.

Keupayaan ini disediakan oleh fakta bahawa skrip CGI boleh disambungkan ke pangkalan data atau mengakses sistem fail pelayan. Oleh itu, skrip CGI boleh menyimpan maklumat dalam jadual atau fail pangkalan data dan mendapatkannya dari sana atas permintaan, yang tidak boleh dilakukan menggunakan HTML.

SILA AMBIL PERHATIAN: CGI bukan bahasa pengaturcaraan! Ia adalah protokol mudah yang membolehkan pelayan web menghantar data melalui stdin dan membacanya dari stdout. Oleh itu, sebarang program pelayan yang mampu berfungsi dengan aliran input/output standard boleh digunakan sebagai pengendali CGI.

Hai dunia!

Contoh skrip CGI mudah dalam Perl ditunjukkan dalam Penyenaraian 1. Jika anda menyimpan kod ini dalam fail bernama hello (nama boleh apa-apa, sambungan boleh sama), letakkan fail itu dalam direktori pelayan cgi-bin (lebih tepat lagi, dalam direktori pelayan web itu, yang bertujuan untuk aplikasi CGI dan dinyatakan dalam tetapan pelayan web) dan tetapkan hak pelaksanaan untuk fail ini (chmod uo+x hello), maka ia akan tersedia di alamat seperti http ://servername/cgi-bin/hello.

Penyenaraian 1. Contoh skrip CGI (Perl)

#!/usr/bin/perl print "Content-type: text/html\n\n"; cetak< CGI ucapkan Hello

Hai dunia!



Keluar HTML;

Dalam kod ini, baris #!/usr/bin/perl menentukan laluan penuh kepada penterjemah Perl. Baris jenis Kandungan: text/html\n\n ialah pengepala http yang menentukan jenis kandungan (jenis mime). Watak pemisah baris berkembar (\n\n) diperlukan; ia memisahkan pengepala daripada badan mesej.

Pembolehubah Persekitaran

Semua aplikasi CGI mempunyai akses kepada pembolehubah persekitaran yang ditetapkan oleh pelayan web. Pembolehubah ini memainkan peranan penting semasa menulis program CGI. Jadual menyenaraikan beberapa pembolehubah yang tersedia untuk CGI.

Pembolehubah persekitaranPenerangan
JENIS KANDUNGAN Jenis data yang dihantar ke pelayan. Digunakan apabila klien menghantar data, seperti memuat turun fail.
CONTENT_LENGTHMinta saiz kandungan. Pembolehubah ini ditakrifkan untuk permintaan POST.
HTTP_COOKIEMengembalikan set kuki sebagai pasangan nilai kunci.
HTTP_USER_AGENTMaklumat ejen pengguna (pelayar).
PATH_INFOLaluan direktori CGI
QUERY_STRINGRentetan pertanyaan (berkod URL) diluluskan oleh kaedah GET.
REMOTE_ADDRAlamat IP pelanggan yang membuat permintaan.
REMOTE_HOSTNama penuh (FQDN) pelanggan. (Jika ada)
REQUEST_METHODKaedah yang mana permintaan itu dilaksanakan. Selalunya DAPAT atau POS.
SCRIPT_FILENAMELaluan penuh ke skrip yang diminta (dalam sistem fail pelayan).
SCRIPT_NAMENama skrip
NAMA PELAYANNama pelayan
SERVER_ADDRAlamat IP pelayan
SERVER_SOFTWAREMaklumat tentang perisian pelayan

Penyenaraian 2 menunjukkan kod untuk program Perl kecil yang mencetak senarai pembolehubah persekitaran. Hasil kerjanya ditunjukkan dalam Rajah. 2.

Penyenaraian 2. Pembolehubah persekitaran

#!/usr/bin/perl print "Content-type: text/html\n\n"; cetak " \n \n

Persekitaran

\n"; foreach (kunci isih %ENV) ( cetak " $_: $ENV($_)
\n"; ) cetak "

\n"; keluar;

Pemindahan data: kaedah GET

Kaedah GET digunakan untuk menghantar data berkod urlen melalui rentetan pertanyaan. Alamat sumber yang diminta (skrip CGI) dan data yang dipindahkan kepadanya dipisahkan dengan tanda “?”. Contoh alamat sedemikian:

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

Kaedah GET digunakan secara lalai untuk data yang dimasukkan ke dalam bar alamat penyemak imbas. Rentetan yang sama boleh dijana apabila menghantar data daripada borang web (tag

) jika kaedah penyerahan borang tidak dinyatakan. Semua maklumat yang dihantar melalui kaedah GET dihantar dalam teks yang jelas, jadi anda tidak boleh menggunakannya untuk menghantar kata laluan atau maklumat lain yang serupa kepada pelayan. Kaedah GET mempunyai had saiz: rentetan pertanyaan mestilah tidak lebih daripada 1024 aksara.

Maklumat yang dihantar melalui kaedah GET dihantar dalam pengepala QUERY_STRING sebagai rentetan yang terdiri daripada pasangan borang kunci=nilai, skrip CGI boleh mendapatkannya melalui pembolehubah persekitaran dengan nama yang sama.

Penyenaraian 3. Menghantar data daripada borang web menggunakan kaedah GET

Skrip CGI yang mudah: Menghantar data menggunakan kaedah GET Nama anda: nama="pengguna">
awak dari mana?: nama="dari">



Selepas memasukkan data ke dalam borang daripada Penyenaraian 3 dan mengklik butang "Serah", rentetan pertanyaan seperti ini akan dihasilkan:

http://example.com/cgi-bin/ katakan hai?pengguna=sesuatu teks&daripada=teks lain

di mana: sayhello - nama skrip CGI; pengguna dan daripada adalah nama parameter; sometext dan anothertext ialah nilai yang dimasukkan pengguna bagi parameter yang sepadan.

Penyenaraian 4 ialah skrip contoh yang boleh memproses data borang daripada Penyenaraian 3.

Penyenaraian 4. Menghantar data daripada borang web menggunakan kaedah GET

#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # Analisis persekitaran $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; jika ($ENV(" REQUEST_METHOD")eq" DAPATKAN") ($ penimbal = $ENV(" QUERY_STRING"); ) # Pisahkan rentetan pertanyaan kepada pasangan kunci/nilai @pairs = split(/&/, $buffer); foreach $pair (@pairs) ( ($name, $value) = split(/=/, $ pasangan); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/cth; $FORM($name) = $value; # Kami menyimpan data dalam tatasusunan) # Hantar cetakan pengepala "Jenis kandungan: teks/html\n\n"; # Hantar cetakan hiperteks< CGI ucapkan Hello

Helo, $FORM(pengguna) daripada $FORM(dari)!



Keluar HTML;

Pemindahan data: kaedah POST

Secara umumnya, kaedah POST lebih sesuai untuk menghantar maklumat kepada skrip CGI. Blok data yang dihantar dibentuk dengan cara yang sama seperti kaedah GET, tetapi penghantaran sebenar dijalankan dalam badan permintaan. Data memasuki aplikasi CGI melalui input standard (stdin).

Untuk menghantar data menggunakan kaedah ini, ia mesti dinyatakan secara eksplisit dalam perihalan borang (action="POST").

Untuk memproses input, skrip CGI mesti membaca stdin, dan untuk melakukan ini dengan betul, ia perlu mengetahui saiz mesej daripada pembolehubah CONTENT_LENGTH. Untuk menggambarkan ini, mari kita ubah suai blok analisis persekitaran dalam Penyenaraian 4 dengan menggantikannya dengan kod berikut:

... # Analisis persekitaran $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; jika ($ENV(" REQUEST_METHOD")eq" POS")( baca ( STDIN, $buffer, $ENV(" CONTENT_LENGTH"}); } ...

Pemprosesan lanjut parameter dan nilainya yang disimpan dalam pembolehubah $buffer dilakukan dengan cara yang sama seperti semasa menggunakan kaedah GET.

Kelebihan CGI

Banyak keupayaan CGI kini diduplikasi oleh teknologi seperti DHTML, ActiveX atau applet Java. Kelebihan utama menggunakan skrip pelayan ialah anda boleh memastikan bahawa semua pelanggan (dengan pengecualian yang jarang berlaku, biasanya dikaitkan dengan menyekat akses kepada sumber tertentu di peringkat tembok api) akan dapat bekerja dengan aplikasi pelayan. Program pelanggan mungkin hanya dilumpuhkan dalam penyemak imbas, atau tidak disokong sama sekali.

Kelemahan CGI

Kelemahan terbesar teknologi ini ialah peningkatan keperluan prestasi pelayan web. Hakikatnya ialah setiap panggilan ke aplikasi CGI menyebabkan proses baharu terhasil, dengan semua atendan di atas kepala. Jika aplikasi ditulis dengan ralat, maka situasi mungkin berlaku apabila ia, sebagai contoh, masuk ke dalam gelung. Penyemak imbas akan menamatkan sambungan apabila tamat masa tamat, tetapi pada bahagian pelayan, proses akan diteruskan sehingga pentadbir memaksa ia ditamatkan. Dalam hal ini, skrip klien mempunyai kelebihan yang ketara, kerana mereka dilaksanakan secara tempatan.

Satu lagi kelemahan CGI ialah pelayan web kurang selamat daripada penyelesaian lain. Kesalahan menetapkan hak akses kepada sumber pelayan daripada aplikasi CGI boleh menjejaskan bukan sahaja prestasi pelayan web, tetapi juga keselamatan maklumat. Walau bagaimanapun, mana-mana teknologi rangkaian boleh dianggap berpotensi tidak selamat mengikut definisi.

Alamat tetap halaman ini:

Terima kasih kepada World Wide Web, hampir semua orang boleh memberikan maklumat dalam talian dalam bentuk yang mudah dipandang dan boleh disebarkan secara meluas. Anda sudah pasti melayari Internet dan melihat tapak lain, dan kini anda mungkin tahu bahawa akronim yang menakutkan seperti "HTTP" dan "HTML" hanyalah singkatan untuk "Web" dan "cara maklumat dinyatakan di Internet." Anda mungkin sudah mempunyai pengalaman menyampaikan maklumat di Internet.

Internet telah terbukti sebagai medium yang ideal untuk mengedarkan maklumat, seperti yang dapat dilihat daripada popularitinya yang sangat besar dan perkembangan yang meluas. Walaupun ada yang mempersoalkan kegunaan Internet dan mengaitkan perkembangan dan popularitinya yang meluas terutamanya kepada pengiklanan yang mengganggu, Internet tidak dapat dinafikan sebagai medium penting untuk menyampaikan semua jenis maklumat. Bukan sahaja terdapat banyak perkhidmatan yang tersedia untuk menyediakan maklumat terkini (berita, cuaca, acara sukan secara langsung) dan bahan rujukan secara elektronik, terdapat juga sejumlah besar jenis data lain yang tersedia. IRS, yang mengedarkan semua borang nyata cukai 1995 dan maklumat lain melalui World Wide Web, baru-baru ini mengaku menerima mel peminat untuk laman webnya. Siapa sangka IRS akan menerima mel peminat? Ini bukan kerana tapaknya direka bentuk dengan baik, tetapi kerana ia telah terbukti sebagai alat yang benar-benar berguna untuk beribu-ribu, mungkin berjuta-juta, orang.

Apakah yang menjadikan Web unik dan perkhidmatan maklumat yang begitu menarik? Pertama sekali, ia menyediakan antara muka hipermedia kepada data. Fikirkan tentang pemacu keras komputer anda. Biasanya, data dinyatakan dalam cara linear, sama dengan sistem fail. Sebagai contoh, anda mempunyai beberapa folder, dan di dalam setiap folder terdapat sama ada dokumen atau folder lain. Web menggunakan paradigma yang berbeza untuk menyatakan maklumat yang dipanggil hipermedia. Antara muka hiperteks terdiri daripada dokumen dan pautan. Pautan ialah perkataan yang diklik untuk melihat dokumen lain atau mencari jenis maklumat lain. Web memperluaskan konsep hiperteks untuk memasukkan jenis media lain, seperti grafik, bunyi, video (oleh itu dinamakan "hypermedia"). Memilih teks atau grafik pada dokumen membolehkan anda melihat maklumat berkaitan tentang item yang dipilih dalam sebarang bentuk.

Hampir semua orang boleh mendapat manfaat daripada cara penyampaian dan pengedaran maklumat yang ringkas dan unik ini, daripada ahli akademik yang ingin segera menggunakan data dengan rakan sekerja mereka kepada ahli perniagaan yang berkongsi maklumat tentang syarikat mereka dengan semua orang. Walau bagaimanapun, walaupun memberi maklumat adalah sangat penting, dalam beberapa tahun kebelakangan ini ramai yang merasakan bahawa menerima maklumat adalah proses yang sama pentingnya.

Walaupun Web menyediakan antara muka hipermedia yang unik untuk maklumat, terdapat banyak cara lain yang berkesan untuk mengedarkan data. Contohnya, perkhidmatan rangkaian seperti File Transfer Protocol (FTP) dan kumpulan berita Gopher telah wujud lama sebelum World Wide Web. Mel elektronik telah menjadi medium utama untuk komunikasi dan pertukaran maklumat di Internet dan kebanyakan rangkaian lain hampir dari awal rangkaian ini. Mengapakah Internet menjadi cara yang popular untuk menyebarkan maklumat? Aspek multimedia Internet telah menyumbang dengan ketara kepada kejayaannya yang belum pernah berlaku sebelum ini, tetapi untuk Internet menjadi paling berkesan, ia mestilah interaktif.

Tanpa keupayaan untuk menerima input pengguna dan memberikan maklumat, Web akan menjadi persekitaran statik sepenuhnya. Maklumat hanya tersedia dalam format yang ditentukan oleh pengarang. Ini akan menjejaskan salah satu keupayaan pengkomputeran secara umum: maklumat interaktif. Sebagai contoh, daripada memaksa pengguna untuk melihat berbilang dokumen seolah-olah dia sedang melihat melalui buku atau kamus, adalah lebih baik untuk membenarkan pengguna mengenal pasti kata kunci mengenai topik yang diminati. Pengguna boleh menyesuaikan persembahan data dan bukannya bergantung pada struktur tegar yang ditakrifkan oleh pembekal kandungan.

Istilah "Pelayan web" boleh mengelirukan kerana ia boleh merujuk kepada kedua-dua mesin fizikal dan perisian yang digunakan untuk berkomunikasi dengan pelayar Internet. Apabila penyemak imbas meminta alamat Web yang diberikan, ia mula-mula menyambung ke mesin melalui Internet, menghantar perisian pelayan Web permintaan untuk dokumen tersebut. Perisian ini berjalan secara berterusan, menunggu permintaan sedemikian tiba dan bertindak balas dengan sewajarnya.

Walaupun pelayan boleh menghantar dan menerima data, pelayan itu sendiri mempunyai fungsi terhad. Sebagai contoh, pelayan yang paling primitif hanya boleh menghantar fail yang diperlukan kepada penyemak imbas. Pelayan biasanya tidak tahu apa yang perlu dilakukan dengan input tambahan ini atau itu. Jika ISP tidak memberitahu pelayan cara mengendalikan maklumat tambahan ini, pelayan kemungkinan besar akan mengabaikan input.

Agar pelayan dapat melakukan operasi lain selain mencari dan menghantar fail ke pelayar Internet, anda perlu tahu cara mengembangkan fungsi pelayan. Sebagai contoh, pelayan Web tidak boleh mencari pangkalan data berdasarkan kata kunci yang dimasukkan oleh pengguna dan mengembalikan berbilang dokumen yang sepadan melainkan keupayaan sedemikian telah diprogramkan ke dalam pelayan dalam beberapa cara.

Apakah CGI?

Antara Muka Gerbang Biasa (CGI) ialah antara muka kepada pelayan yang membolehkan anda memanjangkan kefungsian pelayan. Menggunakan CGI, anda boleh berinteraksi secara interaktif dengan pengguna yang mengakses tapak anda. Pada peringkat teori, CGI membenarkan pelayan dapat menghuraikan (mentafsir) input daripada pelayar dan mengembalikan maklumat berdasarkan input pengguna. Pada peringkat praktikal, CGI ialah antara muka yang membolehkan pengaturcara menulis program yang berkomunikasi dengan mudah dengan pelayan.

Biasanya, untuk mengembangkan keupayaan pelayan, anda perlu mengubah suai pelayan itu sendiri. Penyelesaian ini tidak diingini kerana ia memerlukan pemahaman lapisan bawah pengaturcaraan rangkaian Protokol Internet. Ini juga memerlukan pengeditan dan penyusunan semula kod sumber pelayan atau menulis pelayan tersuai untuk setiap tugas. Katakan anda ingin memanjangkan keupayaan pelayan supaya ia bertindak sebagai gerbang Web-ke-e-mel, mengambil maklumat yang dimasukkan pengguna daripada penyemak imbas dan menghantarnya melalui e-mel kepada pengguna lain. Pelayan perlu memasukkan kod untuk menghuraikan input daripada penyemak imbas, memajukannya melalui e-mel kepada pengguna lain, dan memajukan respons kembali ke penyemak imbas melalui sambungan rangkaian.

Pertama, tugas sedemikian memerlukan akses kepada kod pelayan, yang tidak selalu mungkin.

Kedua, ia sukar dan memerlukan pengetahuan teknikal yang luas.

Ketiga, ini hanya terpakai pada pelayan tertentu. Jika anda perlu memindahkan pelayan anda ke platform lain, anda perlu menjalankan atau sekurang-kurangnya menghabiskan banyak masa mengalihkan kod ke platform tersebut.

Kenapa CGI?

CGI menawarkan penyelesaian mudah alih dan mudah untuk masalah ini. Protokol CGI mentakrifkan cara standard untuk program berkomunikasi dengan pelayan Web. Tanpa sebarang pengetahuan khusus, anda boleh menulis program dalam mana-mana bahasa mesin yang antara muka dan berkomunikasi dengan pelayan Web. Program ini akan berfungsi dengan semua pelayan Web yang memahami protokol CGI.

Komunikasi CGI dilakukan menggunakan input dan output standard, yang bermaksud bahawa jika anda tahu cara mencetak dan membaca data menggunakan bahasa pengaturcaraan anda, anda boleh menulis aplikasi pelayan Web. Selain daripada menghuraikan input dan output, pengaturcaraan aplikasi CGI hampir sama dengan pengaturcaraan mana-mana aplikasi lain. Contohnya, untuk memprogram program "Hello, World!", anda menggunakan fungsi cetakan bahasa anda dan format yang ditentukan untuk program CGI untuk mencetak mesej yang sesuai.

Memilih bahasa pengaturcaraan

Oleh kerana CGI ialah antara muka universal, anda tidak terhad kepada mana-mana bahasa mesin tertentu. Soalan penting yang sering ditanya ialah: apakah bahasa pengaturcaraan yang boleh digunakan untuk pengaturcaraan CGI? Anda boleh menggunakan mana-mana bahasa yang membolehkan anda melakukan perkara berikut:

  • Cetak ke output standard
  • Baca daripada input standard
  • Baca daripada mod berubah-ubah

Hampir semua bahasa pengaturcaraan dan banyak bahasa skrip melakukan tiga perkara ini, dan anda boleh menggunakan mana-mana daripadanya.

Bahasa jatuh ke dalam salah satu daripada dua kelas berikut: diterjemahkan dan ditafsir. Bahasa terjemahan seperti C atau C++ biasanya lebih kecil dan lebih pantas, manakala bahasa yang ditafsirkan seperti Perl atau Rexx kadangkala memerlukan penterjemah yang besar untuk dimuatkan semasa dimulakan. Selain itu, anda boleh mengedarkan kod binari (kod yang diterjemahkan ke dalam bahasa mesin) tanpa kod sumber jika bahasa anda boleh diterjemahkan. Mengedarkan skrip yang boleh ditafsir biasanya bermaksud mengedarkan kod sumber.

Sebelum memilih bahasa, anda perlu mempertimbangkan keutamaan anda terlebih dahulu. Anda perlu menimbang faedah kelajuan dan kecekapan satu bahasa pengaturcaraan berbanding dengan kemudahan pengaturcaraan yang lain. Jika anda mempunyai keinginan untuk mempelajari bahasa lain, daripada menggunakan bahasa yang anda sudah tahu, timbangkan kelebihan dan kekurangan kedua-dua bahasa dengan teliti.

Dua bahasa yang paling biasa digunakan untuk pengaturcaraan CGI ialah C dan Perl (kedua-duanya diliputi dalam buku ini). Kedua-duanya mempunyai kelebihan dan kekurangan yang jelas. Perl ialah bahasa peringkat tinggi, dan pada masa yang sama bahasa yang berkuasa, terutamanya sesuai untuk menghuraikan teks. Walaupun kemudahan penggunaan, fleksibiliti dan kuasanya menjadikannya bahasa yang menarik untuk pengaturcaraan CGI, saiznya yang agak besar dan operasi yang lebih perlahan kadangkala menjadikannya tidak sesuai untuk sesetengah aplikasi. Program C adalah lebih kecil, lebih cekap dan menyediakan kawalan sistem peringkat rendah, tetapi lebih kompleks untuk atur cara, tidak mempunyai rutin pemprosesan teks terbina dalam yang ringan dan lebih sukar untuk nyahpepijat.

Bahasa manakah yang paling sesuai untuk pengaturcaraan CGI? Yang anda anggap lebih mudah dari sudut pengaturcaraan. Kedua-duanya adalah sama-sama berkesan untuk pengaturcaraan aplikasi CGI, dan dengan perpustakaan yang betul, kedua-duanya mempunyai keupayaan yang sama. Walau bagaimanapun, jika anda mempunyai pelayan yang sukar dicapai, anda boleh menggunakan program C yang lebih kecil dan diterjemahkan. Jika anda perlu menulis aplikasi dengan cepat yang memerlukan banyak kerja pemprosesan teks, anda boleh menggunakan Perl sebaliknya.

Awas

Terdapat beberapa alternatif penting untuk aplikasi CGI. Banyak pelayan kini termasuk pengaturcaraan API, yang menjadikannya lebih mudah untuk memprogram sambungan pelayan langsung berbanding dengan aplikasi CGI kendiri. Pelayan API secara amnya lebih cekap daripada program CGI. Pelayan lain termasuk fungsi terbina dalam yang boleh mengendalikan elemen bukan CGI khas, seperti pemautan pangkalan data. Akhir sekali, sesetengah aplikasi boleh dikendalikan oleh beberapa teknologi sisi klien baharu (bukan bahagian pelayan) seperti Java. Dengan perubahan pesat dalam teknologi, adakah CGI akan menjadi usang dengan cepat?

hampir tidak. CGI mempunyai beberapa kelebihan berbanding teknologi yang lebih baharu.

  • Ia serba boleh dan mudah alih. Anda boleh menulis aplikasi CGI menggunakan hampir mana-mana bahasa pengaturcaraan pada mana-mana platform. Beberapa alternatif, seperti API pelayan, menghadkan anda kepada bahasa tertentu dan lebih sukar untuk dipelajari.
  • Tidak mungkin teknologi pihak pelanggan seperti Java akan menggantikan CGI, kerana terdapat beberapa aplikasi yang aplikasi sebelah pelayan lebih sesuai untuk dijalankan.
  • Kebanyakan batasan CGI adalah had HTML atau HTTP. Apabila standard Internet secara keseluruhannya berkembang, begitu juga keupayaan CGI.

Ringkasan

Antara Muka Gerbang Biasa ialah protokol yang mana atur cara berinteraksi dengan pelayan Web. Kepelbagaian CGI memberikan pengaturcara keupayaan untuk menulis program gerbang dalam hampir mana-mana bahasa, walaupun terdapat banyak pertukaran yang dikaitkan dengan bahasa yang berbeza. Tanpa keupayaan ini, mencipta halaman Web interaktif akan menjadi sukar, paling baik memerlukan pengubahsuaian pelayan, dan interaktiviti tidak akan tersedia kepada kebanyakan pengguna yang bukan pentadbir tapak.

Bab 2: Asas

Beberapa tahun yang lalu, saya mencipta halaman untuk kolej di Harvard di mana orang ramai boleh menghantar komen tentang mereka. Pada masa itu, Internet masih muda dan dokumentasi adalah terhad. Saya, seperti ramai yang lain, bergantung pada dokumentasi pendek dan sistem pengaturcaraan yang dicipta oleh orang lain untuk mengajar diri saya pengaturcaraan CGI. Walaupun kaedah kajian ini memerlukan beberapa carian, banyak eksperimen, dan mencipta banyak soalan, ia sangat berkesan. Bab ini adalah hasil kerja awal saya dengan CGI (dengan beberapa tweak, sudah tentu).

Walaupun ia mengambil sedikit masa untuk memahami sepenuhnya dan menguasai antara muka get laluan biasa, protokol itu sendiri agak mudah. Sesiapa sahaja yang mempunyai beberapa kemahiran pengaturcaraan asas dan biasa dengan Web boleh dengan cepat belajar memprogramkan aplikasi CGI yang agak kompleks seperti yang saya dan orang lain belajar lakukan beberapa tahun lalu.

Tujuan bab ini adalah untuk membentangkan asas CGI dalam cara yang komprehensif, walaupun padat. Setiap konsep yang dibincangkan di sini dibentangkan secara terperinci dalam bab-bab berikutnya. Walau bagaimanapun, selepas melengkapkan bab ini, anda boleh segera memulakan pengaturcaraan aplikasi CGI. Sebaik sahaja anda mencapai tahap ini, anda boleh mempelajari selok-belok CGI, sama ada dengan membaca seluruh buku ini atau hanya mencuba sendiri.

Anda boleh mengurangkan pengaturcaraan CGI kepada dua tugas: menerima maklumat daripada penyemak imbas Web dan menghantar maklumat kembali ke penyemak imbas. Ini dilakukan dengan agak intuitif sebaik sahaja anda membiasakan diri dengan penggunaan biasa aplikasi CGI. Selalunya pengguna diminta untuk mengisi beberapa borang, contohnya, memasukkan namanya. Setelah pengguna mengisi borang dan menekan Enter, maklumat ini dihantar ke program CGI. Program CGI kemudiannya mesti menukar maklumat ini kepada sesuatu yang difahaminya, memprosesnya dengan sewajarnya, dan kemudian menghantarnya kembali ke penyemak imbas, sama ada pengesahan ringkas atau hasil carian dalam pangkalan data pelbagai guna.

Dalam erti kata lain, pengaturcaraan CGI memerlukan pemahaman cara menerima input daripada pelayar Internet dan cara menghantar kembali output. Perkara yang berlaku antara peringkat input dan output program CGI bergantung pada matlamat pembangun. Anda akan mendapati bahawa kesukaran utama dalam pengaturcaraan CGI terletak pada peringkat pertengahan ini; Sebaik sahaja anda belajar cara bekerja dengan input dan output, itu pada asasnya cukup untuk menjadi pembangun CGI.

Dalam bab ini, anda akan mempelajari prinsip di sebalik input dan output CGI, serta kemahiran asas lain yang anda perlukan untuk menulis dan menggunakan CGI, termasuk perkara seperti mencipta borang HTML dan menamakan program CGI anda. Bab ini merangkumi topik berikut:

  • Program tradisional "Hello, World!";
  • Output CGI: Menghantar maklumat kembali untuk paparan dalam pelayar Internet;
  • Mengkonfigurasi, memasang dan menjalankan aplikasi. Anda akan belajar tentang platform dan pelayan Web yang berbeza;
  • Input CGI: Tafsiran maklumat yang dihantar oleh pelayar Web. Pengenalan kepada beberapa perpustakaan pengaturcaraan yang berguna untuk menghuraikan input tersebut;
  • Contoh mudah: ia merangkumi semua pelajaran dalam bab tertentu;
  • Strategi pengaturcaraan.

Disebabkan sifat bab ini, saya hanya menyentuh sedikit topik. Jangan risau; Semua topik ini dibincangkan dengan lebih mendalam dalam bab lain.

Hai dunia!

Anda bermula dengan masalah pengaturcaraan pengenalan tradisional. Anda akan menulis program yang memaparkan "Hello, World!" pada pelayar Web anda. Sebelum anda menulis program ini, anda mesti memahami maklumat yang diharapkan oleh penyemak imbas Web daripada program CGI. Anda juga perlu tahu cara menjalankan program ini supaya anda boleh melihatnya dalam tindakan.

CGI adalah bebas bahasa, jadi anda boleh melaksanakan program ini dalam mana-mana bahasa. Beberapa bahasa berbeza digunakan di sini untuk menunjukkan kemerdekaan setiap bahasa. Di Perl, program "Hello, World!" ditunjukkan dalam Penyenaraian 2.1.

Penyenaraian 2.1. Hai dunia! dalam Perl. #!/usr/local/bin/perl # Hello.cgi - Cetakan program CGI pertama saya "Jenis Kandungan: teks/html\n\n"; cetak " \n"; cetak " Hai dunia!"; cetak "\n"; cetak " \n"; cetak "

Hai dunia!

\n"; cetak "

\n";

Simpan program ini sebagai hello.cgi, dan pasangkannya di lokasi yang sesuai. (Jika anda tidak pasti di mana ia berada, jangan risau; anda akan mengetahui dalam bahagian "Memasang dan Menjalankan Program CGI" kemudian dalam bab ini.) Bagi kebanyakan pelayan, direktori yang anda perlukan ialah cgi-bin . Sekarang, panggil program dari penyemak imbas Web anda. Bagi kebanyakan, ini bermakna membuka pencari sumber seragam (URL) berikut:

http://hostname/directoryname/hello.cgi

Nama hos ialah nama pelayan Web anda dan nama direktori ialah direktori tempat anda meletakkan hello.cgi (mungkin cgi-bin).

Berpisah hello.cgi

Terdapat beberapa perkara yang perlu diberi perhatian tentang hello.cgi.

Pertama, anda menggunakan arahan cetakan mudah. Program CGI tidak memerlukan sebarang deskriptor fail khas atau deskriptor output. Untuk menghantar output ke penyemak imbas, hanya cetak ke stdout.

Kedua, ambil perhatian bahawa kandungan pernyataan cetakan pertama (Content-Type: text/html) tidak muncul pada penyemak imbas Web anda. Anda boleh menghantar sebarang maklumat yang anda mahu kembali ke penyemak imbas (halaman HTML, grafik atau bunyi), tetapi pertama sekali, anda perlu memberitahu penyemak imbas jenis data yang anda hantar. Baris ini memberitahu penyemak imbas jenis maklumat yang diharapkan - dalam kes ini, halaman HTML.

Ketiga, program ini dipanggil hello.cgi. Anda tidak semestinya perlu menggunakan sambungan .cgi dengan nama program CGI anda. Walaupun kod sumber untuk banyak bahasa juga menggunakan sambungan .cgi, ia tidak digunakan untuk menunjukkan jenis bahasa, tetapi merupakan cara untuk pelayan mengenal pasti fail tersebut sebagai fail boleh laku dan bukannya fail grafik, fail HTML atau fail teks. Pelayan sering dikonfigurasikan untuk hanya cuba melaksanakan fail yang mempunyai sambungan ini, memaparkan kandungan semua yang lain. Walaupun menggunakan sambungan .cgi tidak diperlukan, ia masih dianggap sebagai amalan yang baik.

Secara umum, hello.cgi terdiri daripada dua bahagian utama:

  • memberitahu pelayar maklumat yang diharapkan (Jenis Kandungan: teks/html)
  • memberitahu pelayar perkara yang hendak dipaparkan (Hello, World!)

Hai dunia! dalam C

Untuk menunjukkan kebebasan bahasa program CGI, Penyenaraian 2.2 menunjukkan persamaan program hello.cgi yang ditulis dalam C.

Penyenaraian 2.2. Hai dunia! dalam C. /* hello.cgi.c - Helo, CGI Dunia */ #include int main() ( printf("Jenis Kandungan: text/html\r\n\r\n"); printf(" \n"); printf(" Hai dunia!\n"); printf("\n"); printf(" \n"); printf("

Hai dunia!

\n"); printf("

\n");)

Catatan

Ambil perhatian bahawa versi Perl hello.cgi menggunakan cetakan Jenis Kandungan ": text/html\n\n "; Walaupun versi C menggunakan Printf("Content-Type: text/html\r\n\r\n");

Mengapakah Perl mencetak operator berakhir dengan dua baris baharu (\n) manakala C printf berakhir dengan dua pemulangan gerabak dan baris baharu (\r\n)?

Secara teknikal, pengepala (semua output sebelum baris kosong) dijangka akan dipisahkan oleh pemulangan pengangkutan dan baris baharu. Malangnya, pada mesin DOS dan Windows, Perl menterjemah \r sebagai satu lagi baris baharu dan bukannya sebagai pemulangan pengangkutan.

Walaupun pengecualian \rs Perl secara teknikal tidak betul, ia akan berfungsi pada hampir semua protokol dan sama mudah alih merentas semua platform. Oleh itu, dalam semua contoh Perl dalam buku ini, saya menggunakan pengepala pemisah baris baharu dan bukannya pulangan pengangkutan dan baris baharu.

Penyelesaian yang sesuai untuk masalah ini dibentangkan dalam Bab 4, Kesimpulan.

Pelayan Web mahupun penyemak imbas tidak peduli bahasa yang digunakan untuk menulis program. Walaupun setiap bahasa mempunyai kelebihan dan kekurangan sebagai bahasa pengaturcaraan CGI, sebaiknya gunakan bahasa yang anda paling selesa bekerja dengannya. (Pilihan bahasa pengaturcaraan dibincangkan dengan lebih terperinci dalam Bab 1, “Antaramuka Gerbang Biasa (CGI)”).

Penyampaian CGI

Kini anda boleh melihat dengan lebih dekat isu penghantaran maklumat ke penyemak imbas Web. Daripada contoh "Hello, World!", anda boleh melihat bahawa penyemak imbas Web mengharapkan dua set data: pengepala, yang mengandungi maklumat seperti maklumat yang hendak dipaparkan (cth Jenis Kandungan: baris) dan maklumat sebenar (apa pelayar Web paparan). Kedua-dua maklumat ini dipisahkan oleh baris kosong.

Pengepala dipanggil pengepala HTTP. Ia memberikan maklumat penting tentang maklumat yang akan diterima oleh penyemak imbas. Terdapat beberapa jenis pengepala HTTP yang berbeza, dan yang paling biasa ialah pengepala yang pernah anda gunakan sebelum ini: Jenis Kandungan: pengepala. Anda boleh menggunakan gabungan pengepala HTTP yang berbeza, dipisahkan oleh pemulangan pengangkutan dan baris baharu (\r\n). Baris kosong yang memisahkan pengepala daripada data juga terdiri daripada pemulangan pengangkutan dan baris baharu (mengapa kedua-duanya diperlukan dibincangkan secara ringkas dalam nota sebelumnya dan diperincikan dalam Bab 4). Anda akan belajar tentang pengepala HTTP lain dalam Bab 4; Pada masa ini anda sedang berurusan dengan Content-Type: header.

Jenis Kandungan: Pengepala menerangkan jenis data yang CGI pulangkan. Format yang sesuai untuk pengepala ini ialah:

Jenis Kandungan: subjenis/jenis

Di mana subjenis/jenis ialah jenis Sambungan Mel Internet Serbaguna (MIME) yang betul. Jenis MIME yang paling biasa ialah jenis HTML: text/html. Jadual 2.1 menyenaraikan beberapa lagi jenis MIME biasa yang akan dibincangkan; Penyenaraian dan analisis yang lebih lengkap bagi jenis MIME disediakan dalam Bab 4.

Catatan

MIME pada asalnya dicipta untuk menerangkan kandungan badan mesej mel. Ia telah menjadi cara yang agak biasa untuk mewakili maklumat Jenis Kandungan. Anda boleh membaca lebih lanjut mengenai MIME dalam RFC1521. RFC di Internet bermaksud Permintaan untuk Komen, yang merupakan ringkasan keputusan yang dibuat oleh kumpulan di Internet yang cuba menetapkan piawaian. Anda boleh melihat keputusan RFC1521 di alamat berikut: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Jadual 2.1. Beberapa jenis MIME biasa. Jenis MIME Perihalan Teks/html Hypertext Markup Language (HTML) Teks/plain Text biasa Fail Imej/gif Fail grafik GIF Imej/jpeg Fail grafik mampat JPEG Fail Audio/asas Sun *.au Audio/x-wav Fail Windows *. wav

Selepas pengepala dan baris kosong, anda hanya mencetak data dalam bentuk yang anda perlukan. Jika anda menghantar HTML, kemudian cetak teg HTML dan data ke stdout selepas pengepala. Anda juga boleh menghantar grafik, bunyi dan fail binari lain dengan hanya mencetak kandungan fail ke stdout. Beberapa contoh ini diberikan dalam Bab 4.

Memasang dan Menjalankan Program CGI

Bahagian ini agak menyimpang daripada pengaturcaraan CGI dan bercakap tentang mengkonfigurasi pelayan Web anda untuk menggunakan CGI, memasang dan menjalankan program. Anda akan diperkenalkan kepada pelayan yang berbeza untuk platform yang berbeza dengan lebih atau kurang terperinci, tetapi anda perlu menggali lebih dalam dokumentasi pelayan anda untuk mencari pilihan terbaik.

Semua pelayan memerlukan ruang untuk fail pelayan dan ruang untuk dokumen HTML. Dalam buku ini, kawasan pelayan dipanggil ServerRoot, dan kawasan dokumen dipanggil DocumentRoot. Pada mesin UNIX, ServerRoot biasanya dalam /usr/local/etc/httpd/, dan DocumentRoot biasanya dalam /usr/local/etc/httpd/htdocs/. Walau bagaimanapun, ini tidak akan memberi sebarang perbezaan kepada sistem anda, jadi gantikan semua rujukan kepada ServerRoot dan DocumentRoot dengan ServerRoot dan DocumentRoot anda sendiri.

Apabila anda mengakses fail menggunakan penyemak imbas Web anda, anda menentukan fail dalam URL berbanding dengan DocumentRoot. Contohnya, jika alamat pelayan anda ialah mymachine.org, maka anda mengakses fail ini dengan URL berikut: http://mymachine.org/index.html

Mengkonfigurasi pelayan untuk CGI

Kebanyakan pelayan Web diprakonfigurasikan untuk membenarkan penggunaan program CGI. Biasanya dua parameter menunjukkan kepada pelayan sama ada fail itu adalah aplikasi CGI atau tidak:

  • Direktori yang ditetapkan. Sesetengah pelayan membenarkan anda menentukan bahawa semua fail dalam direktori yang ditetapkan (biasanya dipanggil cgi-bin secara lalai) adalah CGI.
  • Sambungan nama fail. Banyak pelayan mempunyai prakonfigurasi ini yang membolehkan semua fail yang berakhir dengan .cgi ditakrifkan sebagai CGI.

Kaedah direktori yang ditetapkan adalah sesuatu peninggalan masa lalu (pelayan pertama menggunakannya sebagai satu-satunya kaedah untuk menentukan fail yang merupakan program CGI), tetapi ia mempunyai beberapa kelebihan.

  • Ia memastikan program CGI terpusat, menghalang direktori lain daripada menjadi bersepah.
  • Anda tidak terhad kepada mana-mana sambungan nama fail tertentu, jadi anda boleh menamakan fail anda apa sahaja yang anda mahu. Sesetengah pelayan membenarkan anda menetapkan beberapa direktori berbeza sebagai direktori CGI.
  • Ia juga memberi anda lebih kawalan ke atas siapa yang boleh merakam CGI. Contohnya, jika anda mempunyai pelayan dan menyokong sistem dengan berbilang pengguna dan tidak mahu mereka menggunakan skrip CGI mereka sendiri tanpa mengaudit program terlebih dahulu atas sebab keselamatan, anda boleh menetapkan hanya fail tersebut dalam direktori terhad dan berpusat sebagai CGI . Pengguna kemudiannya perlu memberikan anda program CGI untuk dipasang, dan anda boleh mengaudit kod tersebut terlebih dahulu untuk memastikan program itu tidak mempunyai sebarang isu keselamatan utama.

Notasi CGI melalui sambungan nama fail boleh berguna kerana fleksibilitinya. Anda tidak terhad kepada satu direktori tunggal untuk program CGI. Kebanyakan pelayan boleh dikonfigurasikan untuk mengenali CGI melalui sambungan nama fail, walaupun tidak semua dikonfigurasikan dengan cara ini secara lalai.

Amaran

Ingat kepentingan isu keselamatan apabila anda mengkonfigurasi pelayan anda untuk CGI. Beberapa petua akan dibincangkan di sini, dan Bab 9, Melindungi CGI, merangkumi aspek ini dengan lebih terperinci.

Memasang CGI pada pelayan UNIX

Tidak kira bagaimana pelayan UNIX anda dikonfigurasikan, terdapat beberapa langkah yang perlu anda ambil untuk memastikan aplikasi CGI anda berjalan seperti yang diharapkan. Pelayan Web anda biasanya akan dijalankan sebagai pengguna yang tidak wujud (iaitu, pengguna UNIX tiada siapa - akaun yang tidak mempunyai kebenaran fail dan tidak boleh dilog masuk). Skrip CGI (ditulis dalam Perl, cangkang Bourne, atau bahasa skrip lain) mesti boleh dilaksanakan dan boleh dibaca di seluruh dunia.

Petunjuk

Untuk menjadikan fail anda boleh dibaca dan boleh dilaksanakan, gunakan perintah kebenaran UNIX berikut: nama fail chmod 755.

Jika anda menggunakan bahasa skrip seperti Perl atau Tcl, berikan laluan penuh penterjemah anda pada baris pertama skrip anda. Sebagai contoh, skrip Perl menggunakan perl dalam direktori /usr/local/bin akan bermula dengan baris berikut:

#!/usr/local/bin/perl

Amaran

Jangan sekali-kali letakkan jurubahasa (perl, atau binari Tcl Wish) dalam direktori /cgi-bin. Ini mewujudkan risiko keselamatan pada sistem anda. Ini dibincangkan dengan lebih terperinci dalam Bab 9.

Beberapa pelayan UNIX generik

Pelayan NCSA dan Apache mempunyai fail konfigurasi yang serupa kerana pelayan Apache pada asalnya berdasarkan kod NCSA. Secara lalai, ia dikonfigurasikan supaya mana-mana fail dalam direktori cgi-bin (terletak secara lalai dalam ServerRoot) ialah program CGI. Untuk menukar lokasi direktori cgi-bin, anda boleh mengedit fail konfigurasi conf/srm.conf. Format untuk mengkonfigurasi direktori ini ialah

ScriptAlias ​​​​fakedirectoryname nama direktori sebenar

di mana fakedirectoryname ialah nama direktori pseudo (/cgi-bin) dan realdirectoryname ialah laluan penuh di mana program CGI sebenarnya disimpan. Anda boleh mengkonfigurasi lebih daripada satu ScriptAlias ​​​​dengan menambahkan lebih banyak baris ScriptAlias.

Konfigurasi lalai adalah mencukupi untuk kebanyakan keperluan pengguna. Anda perlu mengedit baris dalam fail srm.conf dalam mana-mana kes untuk menentukan nama direktori sebenar yang betul. Jika, sebagai contoh, program CGI anda terletak di /usr/local/etc/httpd/cgi-bin, baris ScriptAlias ​​​​dalam fail srm.conf anda hendaklah seperti ini:

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

Untuk mengakses atau memaut ke program CGI yang terdapat dalam direktori ini, gunakan URL berikut:

Http://hostname/cgi-bin/programname

Di mana nama hos ialah nama hos pelayan Web anda, dan nama program ialah nama CGI anda.

Sebagai contoh, katakan anda menyalin program hello.cgi ke direktori cgi-bin anda (cth /usr/local/etc/httpd/cgi-bin) pada pelayan Web anda yang dipanggil www.company.com. Untuk mengakses CGI anda, gunakan URL berikut: http://www.company.com/cgi-bin/hello.cgi

Jika anda ingin mengkonfigurasi pelayan NCSA atau Apache anda untuk mengecam mana-mana fail dengan sambungan .cgi sebagai CGI, anda perlu mengedit dua fail konfigurasi. Pertama, dalam fail srm.conf, nyahkomen baris berikut:

AddType application/x-httpd-cgi .cgi

Ini akan mengaitkan jenis MIME CGI dengan sambungan .cgi. Sekarang, kita perlu menukar fail access.conf supaya kita boleh menjalankan CGI dalam mana-mana direktori. Untuk melakukan ini, tambahkan pilihan ExecCGI pada baris Pilihan. Ia akan kelihatan seperti baris berikut:

Indeks Pilihan FollowSymLinks ExecCGI

Sekarang, mana-mana fail dengan sambungan .cgi dianggap CGI; aksesnya seperti mana-mana fail pada pelayan anda.

Pelayan CERN dikonfigurasikan dengan cara yang sama seperti pelayan Apache dan NCSA. Daripada ScriptAlias, pelayan CERN menggunakan arahan Exec. Sebagai contoh, dalam fail httpd.conf, anda akan melihat baris berikut:

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

Pelayan UNIX lain boleh dikonfigurasikan dengan cara yang sama; Ini diterangkan dengan lebih terperinci dalam dokumentasi pelayan.

Memasang CGI pada Windows

Kebanyakan pelayan tersedia untuk Windows 3.1, Windows 95 dan Windows NT dikonfigurasikan menggunakan kaedah "sambungan nama fail" untuk pengecaman CGI. Secara umum, menukar konfigurasi pelayan berasaskan Windows hanya memerlukan menjalankan program konfigurasi pelayan dan membuat perubahan yang sesuai.

Kadangkala mengkonfigurasi pelayan untuk menjalankan skrip (seperti Perl) dengan betul boleh menjadi sukar. Dalam DOS atau Windows, anda tidak akan dapat menentukan penterjemah pada baris pertama skrip, seperti yang berlaku dengan UNIX. Sesetengah pelayan mempunyai konfigurasi yang dipratentukan untuk mengaitkan sambungan nama fail tertentu dengan penterjemah. Sebagai contoh, banyak pelayan Web Windows menganggap bahawa fail yang berakhir dengan .pl ialah skrip Perl.

Jika pelayan tidak melaksanakan jenis perkaitan fail ini, anda boleh menentukan fail kelompok pembungkus yang memanggil kedua-dua jurubahasa dan skrip. Seperti pelayan UNIX, jangan pasang penterjemah sama ada dalam direktori cgi-bin atau mana-mana direktori boleh diakses Web.

Memasang CGI pada Macintosh

Dua pilihan pelayan yang paling terkenal untuk Macintosh ialah WebStar StarNine dan MacHTTP pendahulunya. Kedua-duanya mengenali CGI dengan sambungan nama failnya.

MacHTTP memahami dua sambungan berbeza: .cgi dan .acgi, yang bermaksud CGI tak segerak. Program CGI biasa yang dipasang pada Macintosh (dengan sambungan .cgi) akan memastikan pelayan Web dalam keadaan sibuk sehingga CGI selesai berjalan, menyebabkan pelayan menggantung semua permintaan lain. CGI tak segerak, sebaliknya, membenarkan pelayan menerima permintaan walaupun semasa ia sedang berjalan.

Pembangun CGI Macintosh yang menggunakan mana-mana pelayan Web ini hendaklah, jika boleh, hanya menggunakan sambungan .acgi dan bukannya sambungan .cgi. Ia harus berfungsi dengan kebanyakan program CGI; jika ia tidak berfungsi, namakan semula program kepada .cgi.

Melaksanakan CGI

Sebaik sahaja anda telah memasang CGI, terdapat beberapa cara untuk melaksanakannya. Jika program CGI anda ialah program keluaran sahaja, seperti program Hello,World!, maka anda boleh melaksanakannya hanya dengan mengakses URLnya.

Kebanyakan program dijalankan sebagai aplikasi pelayan pada borang HTML. Sebelum mempelajari cara mendapatkan maklumat daripada borang ini, baca dahulu pengenalan ringkas tentang mencipta borang tersebut.

Tutorial ringkas tentang borang HTML

Dua teg yang paling penting dalam bentuk HTML ialah

Dan . Anda boleh membuat kebanyakan borang HTML menggunakan hanya dua teg ini. Dalam bab ini, anda akan meneroka teg ini dan subset kecil kemungkinan jenis atau atribut. . Panduan lengkap dan pautan ke borang HTML terdapat dalam Bab 3, HTML dan Borang.

Tag

Tag digunakan untuk menentukan bahagian mana fail HTML harus digunakan untuk maklumat yang dimasukkan pengguna. Ini merujuk kepada cara kebanyakan halaman HTML memanggil program CGI. Atribut teg menentukan nama dan lokasi program - sama ada secara setempat atau sebagai URL penuh, jenis pengekodan yang digunakan dan kaedah pergerakan data yang digunakan oleh program.

Baris seterusnya menunjukkan spesifikasi untuk teg :

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

Atribut ENCTYPE tidak memainkan peranan khas dan biasanya tidak disertakan dengan teg . Maklumat terperinci mengenai teg ENCTYPE diberikan dalam Bab 3. Satu cara untuk menggunakan ENCTYPE ditunjukkan dalam Bab 14, "Sambungan Jenama."

Atribut ACTION merujuk kepada URL program CGI. Setelah pengguna mengisi borang dan memberikan maklumat, semua maklumat dikodkan dan dipindahkan ke program CGI. Program CGI itu sendiri menyelesaikan masalah penyahkodan dan pemprosesan maklumat; Aspek ini dibincangkan dalam "Menerima Input daripada Penyemak Imbas," kemudian dalam bab ini.

Akhir sekali, atribut METHOD menerangkan cara program CGI harus menerima input. Kedua-dua kaedah, GET dan POST, berbeza dalam cara mereka menyampaikan maklumat kepada program CGI. Kedua-duanya dibincangkan dalam "Menerima Input daripada Penyemak Imbas."

Untuk membolehkan penyemak imbas membenarkan input pengguna, semua teg borang dan maklumat mesti dikelilingi oleh teg . Jangan lupa tag penutup

untuk menunjukkan penghujung borang. Anda tidak boleh mempunyai borang dalam borang, walaupun anda boleh menyediakan borang yang membolehkan anda membentangkan cebisan maklumat di tempat yang berbeza; aspek ini dibincangkan secara meluas dalam Bab 3.

Tag

Anda boleh membuat bar input teks, butang radio, kotak semak dan cara lain untuk menerima input menggunakan teg . Bahagian ini hanya merangkumi medan input teks. Untuk melaksanakan medan ini, gunakan teg dengan sifat-sifat berikut:

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

NAME ialah nama simbolik pembolehubah yang mengandungi nilai yang dimasukkan oleh pengguna. Jika anda memasukkan teks dalam atribut VALUE, teks itu akan diletakkan sebagai lalai dalam medan input teks. Atribut SIZE membolehkan anda menentukan panjang mendatar medan input kerana ia akan muncul dalam tetingkap penyemak imbas. Akhir sekali, MAXLENGTH menentukan bilangan maksimum aksara yang boleh dimasukkan oleh pengguna ke dalam medan. Sila ambil perhatian bahawa atribut VALUE, SIZE, MAXLENGTH adalah pilihan.

Penyerahan Borang

Jika anda hanya mempunyai satu medan teks dalam borang, pengguna boleh menyerahkan borang dengan hanya menaip maklumat pada papan kekunci dan menekan Enter. Jika tidak, mesti ada cara lain untuk pengguna menyampaikan maklumat. Pengguna menyerahkan maklumat menggunakan butang hantar dengan teg berikut:

< Input type=submit >

Teg ini mencipta butang Hantar di dalam borang anda. Apabila pengguna selesai mengisi borang, dia boleh menyerahkan kandungannya ke URL yang ditentukan oleh atribut ACTION borang dengan mengklik butang Hantar.

Menerima input daripada penyemak imbas

Di atas adalah contoh rakaman program CGI yang menghantar maklumat daripada pelayan ke penyemak imbas. Pada hakikatnya, program CGI yang hanya mengeluarkan data tidak mempunyai banyak aplikasi (beberapa contoh diberikan dalam Bab 4). Keupayaan CGI yang lebih penting ialah menerima maklumat daripada pelayar - ciri yang memberikan Web watak interaktifnya.

Program CGI menerima dua jenis maklumat daripada pelayar.

  • Pertama, ia memperoleh pelbagai maklumat tentang penyemak imbas (jenisnya, perkara yang boleh dilihatnya, hos hos, dan sebagainya), pelayan (nama dan versinya, port pelaksanaannya, dan sebagainya), dan program CGI sendiri ( nama program dan di mana ia berada). Pelayan memberikan semua maklumat ini kepada program CGI melalui pembolehubah persekitaran.
  • Kedua, program CGI boleh menerima input pengguna. Maklumat ini, selepas dikodkan oleh penyemak imbas, dihantar sama ada melalui pembolehubah persekitaran (kaedah GET) atau melalui input standard (kaedah stdin - POST).

Pembolehubah Persekitaran

Adalah berguna untuk mengetahui pembolehubah persekitaran yang tersedia untuk program CGI, semasa latihan dan untuk nyahpepijat. Jadual 2.2 menyenaraikan beberapa pembolehubah persekitaran CGI yang tersedia. Anda juga boleh menulis program CGI yang mengeluarkan pembolehubah persekitaran dan nilainya kepada pelayar Web.

Jadual 2.2. Beberapa Pembolehubah Persekitaran CGI Penting Persekitaran Pembolehubah Tujuan REMOTE_ADDR alamat IP mesin klien. REMOTE_HOST Hos mesin pelanggan. HTTP _ACCEPT Menyenaraikan jenis data MIME yang boleh ditafsirkan oleh penyemak imbas. HTTP _USER_AGENT Maklumat penyemak imbas (jenis penyemak imbas, nombor versi, sistem pengendalian, dsb.). REQUEST_METHOD GET atau POST. CONTENT_LENGTH Saiz input jika dihantar melalui POST. Jika tiada input atau jika kaedah GET digunakan, parameter ini tidak ditentukan. QUERY_STRING Mengandungi maklumat input apabila ia dihantar menggunakan kaedah GET. PATH_INFO Membenarkan pengguna menentukan laluan daripada baris arahan CGI (contohnya, http://hostname/cgi-bin/programname/path). PATH_TRANSLATED Menterjemah laluan relatif dalam PATH_INFO kepada laluan sebenar pada sistem.

Untuk menulis aplikasi CGI yang memaparkan pembolehubah persekitaran, anda perlu tahu cara melakukan dua perkara:

  • Tentukan semua pembolehubah persekitaran dan nilai sepadannya.
  • Cetak hasil ke penyemak imbas.

Anda sudah tahu cara melakukan operasi terakhir. Dalam Perl, pembolehubah persekitaran disimpan dalam tatasusunan bersekutu %ENV, yang diperkenalkan dengan nama pembolehubah persekitaran. Penyenaraian 2.3 mengandungi env.cgi, program Perl yang mencapai matlamat kami.

Penyenaraian 2.3. Program Perl, env.cgi, yang mencetak semua pembolehubah persekitaran CGI.

#!/usr/local/bin/perl print "Jenis kandungan: teks/html\n\n"; cetak " \n"; cetak " Persekitaran CGI\n"; cetak "\n"; cetak " \n"; cetak "

Persekitaran CGI

\n"; foreach $env_var (kunci %ENV) ( cetak " $env_var= $ENV($env_var)
\n"; ) cetak "

\n";

Program yang serupa boleh ditulis dalam C; kod lengkap ada dalam Penyenaraian 2.4.

Penyenaraian 2.4. Env.cgi.c dalam C. /* env.cgi.c */ #include char luaran **persekitaran; int main() ( char **p = persekitaran; printf("Jenis-Kandungan: teks/html\r\n\r\n"); printf(" \n"); printf(" Persekitaran CGI\n"); printf("\n"); printf(" \n"); printf("

Persekitaran CGI

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

\n");)

DAPATKAN atau POS?

Apakah perbezaan antara kaedah GET dan POST? GET menghantar rentetan input yang dikodkan melalui pembolehubah persekitaran QUERY_STRING, manakala POST menghantarnya melalui stdin. POST adalah kaedah pilihan, terutamanya untuk borang yang mempunyai banyak data, kerana tiada sekatan ke atas jumlah maklumat yang dihantar, manakala dengan kaedah GET jumlah ruang media adalah terhad. GET bagaimanapun mempunyai sifat berguna tertentu; ini dibincangkan secara terperinci dalam Bab 5, Input.

Untuk menentukan kaedah yang digunakan, program CGI menyemak pembolehubah persekitaran REQUEST_METHOD, yang akan ditetapkan kepada GET atau POST. Jika ia ditetapkan kepada POST, panjang maklumat yang dikodkan disimpan dalam pembolehubah persekitaran CONTENT_LENGTH.

Input Berkod

Apabila pengguna menyerahkan borang, penyemak imbas mula-mula mengekod maklumat sebelum menghantarnya ke pelayan dan kemudian ke aplikasi CGI. Apabila anda menggunakan tag , setiap medan diberi nama simbolik. Nilai yang dimasukkan oleh pengguna diwakili sebagai nilai pembolehubah.

Untuk menentukan ini, penyemak imbas menggunakan spesifikasi pengekodan URL, yang boleh diterangkan seperti berikut:

  • Mengasingkan medan yang berbeza dengan ampersand (&).
  • Memisahkan nama dan nilai dengan tanda sama (=), dengan nama di sebelah kiri dan nilai di sebelah kanan.
  • Menggantikan ruang dengan tanda tambah (+).
  • Menggantikan semua aksara "tidak normal" dengan tanda peratus (%) diikuti dengan kod heks dua digit untuk watak itu.

Rentetan terakhir anda yang dikodkan akan serupa dengan yang berikut:

Nama1=nilai1&nama2=nilai2&nama3=nilai3 ...

Nota: Spesifikasi untuk pengekodan URL ditemui dalam RFC1738.

Sebagai contoh, katakan anda mempunyai borang yang meminta nama dan umur. Kod HTML yang digunakan untuk memaparkan borang ini ditunjukkan dalam Penyenaraian 2.5.

Penyenaraian 2.5. Kod HTML untuk memaparkan nama dan borang umur.

Nama dan Umur

Masukkan nama anda:

Masukkan umur anda:



Katakan pengguna memasukkan Joe Schmoe dalam medan nama dan 20 dalam medan umur. Input akan dikodkan dalam rentetan input.

Nama=Joe+Schmoe&umur=20

Menghuraikan input

Untuk maklumat ini berguna, anda perlu menggunakan maklumat tentang sesuatu yang boleh digunakan oleh program CGI anda. Strategi untuk menghuraikan input diliputi dalam Bab 5. Dalam amalan, anda tidak perlu memikirkan cara menghuraikan input, kerana beberapa pakar telah pun menulis perpustakaan yang melakukan penghuraian, boleh diakses oleh semua orang. Dua perpustakaan sedemikian dibentangkan dalam bab ini dalam bahagian berikut: cgi -lib.pl untuk Perl (ditulis oleh Steve Brenner) dan cgihtml untuk C (ditulis oleh saya).

Matlamat umum kebanyakan perpustakaan yang ditulis dalam pelbagai bahasa adalah untuk menghuraikan rentetan yang dikodkan dan meletakkan nama dan pasangan nilai ke dalam struktur data. Terdapat kelebihan yang jelas untuk menggunakan bahasa yang mempunyai struktur data terbina dalam seperti Perl; bagaimanapun, kebanyakan perpustakaan untuk bahasa peringkat rendah seperti C dan C++ termasuk struktur data dan pelaksanaan subrutin.

Ia tidak perlu untuk mencapai pemahaman yang lengkap tentang perpustakaan; adalah lebih penting untuk mempelajari cara menggunakannya sebagai alat untuk menjadikan kerja pengaturcara CGI lebih mudah.

Cgi-lib.pl

Cgi-lib.pl menggunakan tatasusunan bersekutu Perl. Fungsi &ReadParse menghuraikan rentetan input dan memasukkan setiap pasangan nama/nilai mengikut nama. Sebagai contoh, rentetan Perl sepadan yang diperlukan untuk menyahkod rentetan input "nama/umur" yang baru dibentangkan ialah

&ReadParse(*input);

Sekarang, untuk melihat nilai yang dimasukkan untuk "nama", anda boleh mengakses tatasusunan bersekutu $input("nama"). Begitu juga, untuk mengakses nilai "umur", anda perlu melihat pembolehubah $input ("umur").

Cgihtml

C tidak mempunyai sebarang struktur data terbina dalam, jadi cgihtml melaksanakan senarai pautannya sendiri untuk digunakan dengan rutin penghuraian CGInya. Ini mentakrifkan struktur jenis kemasukan seperti berikut:

Typedef struct ( Char *name; Char *value; ) Entrytype;

Untuk menghuraikan rentetan input "nama/umur" dalam C menggunakan cgihtml, perkara berikut digunakan:

/* mengisytiharkan senarai terpaut dipanggil input */ Llist input; /* menghuraikan input dan lokasi dalam senarai terpaut */ read_cgi_input(&input);

Untuk mengakses maklumat umur, anda boleh menghuraikan senarai secara manual atau menggunakan fungsi cgi _val() yang tersedia.

#termasuk #termasuk Char *umur = malloc(sizeof(char)*strlen(cgi_val(input, "age")) + 1); Strcpy(umur, cgi_val(input, "umur"));

Nilai "umur" kini disimpan dalam rentetan umur.

Nota: Daripada menggunakan tatasusunan ringkas (seperti char age ;), saya memperuntukkan ruang memori secara dinamik untuk umur rentetan. Walaupun ini menjadikan pengaturcaraan lebih sukar, ia adalah penting dari sudut pandangan keselamatan. Ini dibincangkan dengan lebih terperinci dalam Bab 9.

Program CGI yang mudah

Anda akan menulis program CGI yang dipanggil nameage.cgi yang mengendalikan borang nama/umur. Pemprosesan data (yang biasa saya panggil "barangan") adalah minimum. Nameage.cgi hanya menyahkod input dan memaparkan nama dan umur pengguna. Walaupun tidak banyak kegunaan untuk alat sedemikian, ia menunjukkan aspek paling kritikal pengaturcaraan CGI: input dan output.

Anda menggunakan borang yang sama seperti di atas, memanggil medan "nama dan umur". Jangan bimbang tentang keteguhan dan kecekapan dahulu; menyelesaikan masalah yang ada dengan cara yang paling mudah. Penyelesaian Perl dan C ditunjukkan dalam Penyenaraian 2.6 dan 2.7, masing-masing.

Penyenaraian 2.6. Nameage.cgi dalam Perl

#!/usr/local/bin/perl # nameage.cgi memerlukan "cgi-lib.pl" &ReadParse(*input); cetak "Jenis-Kandungan: text/html\r\n\r\n"; cetak " \n"; cetak " Nama dan Umur\n"; cetak "\n"; cetak " \n"; cetak "Hello, " . $input("nama") . ". Anda\n"; cetak $input("umur") . " tahun.

\n"; cetak "

\n";

Penyenaraian 2.7. nameage.cgi dalam C

/* nameage.cgi.c */ #include #include "cgi-lib.h" int main() ( senarai input; read_cgi_input(&input); printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); printf(" Nama dan Umur\n"); printf("\n"); printf(" \n"); printf("Hello, %s. Anda adalah\n",cgi_val(input,"nama")); printf("%s tahun.

\n",cgi_val(input,"umur")); printf("

\n");)

Sila ambil perhatian bahawa kedua-dua program ini hampir sama. Kedua-duanya mengandungi rutin penghuraian yang hanya menduduki satu baris dan memproses keseluruhan input (terima kasih kepada rutin perpustakaan yang sepadan). Output pada dasarnya adalah versi diubah suai program Hello, World! utama anda.

Cuba jalankan program dengan mengisi borang dan klik butang Hantar.

Strategi pengaturcaraan am

Anda kini mengetahui semua prinsip asas yang diperlukan untuk pengaturcaraan CGI. Sebaik sahaja anda memahami cara CGI menerima maklumat dan cara ia menghantarnya kembali ke penyemak imbas, kualiti sebenar produk akhir anda bergantung pada kebolehan pengaturcaraan umum anda. Iaitu, apabila anda memprogramkan CGI (atau apa-apa sahaja, dalam perkara itu), ingatlah kualiti berikut:

  • Kesederhanaan
  • Kecekapan
  • serba boleh

Dua kualiti pertama agak biasa: cuba jadikan kod anda boleh dibaca dan cekap yang mungkin. Fleksibiliti lebih banyak digunakan pada program CGI berbanding aplikasi lain. Apabila anda mula membangunkan program CGI anda sendiri, anda akan mengetahui bahawa terdapat beberapa aplikasi asas yang semua orang mahu buat. Sebagai contoh, salah satu tugas yang paling biasa dan jelas bagi program CGI ialah memproses borang dan menghantar keputusan melalui e-mel kepada penerima tertentu. Anda boleh mempunyai beberapa borang berasingan yang diproses, setiap satu dengan penerima yang berbeza. Daripada menulis program CGI untuk setiap borang individu, anda boleh menjimatkan masa dengan menulis program CGI yang lebih umum yang digunakan untuk semua borang.

Dengan merangkumi semua aspek asas CGI, saya telah memberikan anda maklumat yang mencukupi untuk memulakan pengaturcaraan CGI. Walau bagaimanapun, untuk menjadi pembangun CGI yang berkesan, anda perlu mempunyai pemahaman yang lebih mendalam tentang cara CGI berkomunikasi dengan pelayan dan penyemak imbas. Baki buku ini merangkumi secara terperinci isu-isu yang disebutkan secara ringkas dalam bab ini, serta strategi pembangunan aplikasi dan kelebihan dan had protokol.

Ringkasan

Bab ini memperkenalkan secara ringkas asas pengaturcaraan CGI. Anda mencipta output dengan memformat data anda dengan betul dan mencetak ke stdout. Menerima input CGI adalah sedikit lebih kompleks kerana ia mesti dihuraikan sebelum ia boleh digunakan. Nasib baik, beberapa perpustakaan sudah wujud yang menjalankan penghuraian.

Sekarang anda sepatutnya cukup selesa dengan pengaturcaraan aplikasi CGI. Baki buku ini menerangkan dengan lebih terperinci tentang spesifikasi, petua dan strategi pengaturcaraan untuk aplikasi yang lebih maju dan kompleks.