ana sayfa : araştırma : uzaktan web tasarımı : cgi [ 2 / 5 ] |
|||||||||||||||||||||||||||||||||||||||||||||
GERİ | |||||||||||||||||||||||||||||||||||||||||||||
Standart
Giriş
Birçok durumda programcığın ihtiyaç duyduğu
bilgiler Tablo 1’de gösterilen ortam değişkenlerinde mevcuttur. Yine de
bazı durumlarda web sunucu sizin programcığınıza bilgileri standart
giriş aracılığıyla aktarır. Web gözatıcısı istek yöntemi POST
olan bir istekte bulunursa sunucudan kullanıcının girdiği veriler
standart giriş yoluyla aktarılır. Bu POST metodu HTML içindeki formlarda
sıkça kullanılır. Web sunucu önceden tartışıldığı gibi birçok değeri
çoğunlukla ortam değişkenlerine atar.
Url
Kodlaması
Web sunucusu kullanıcını girdiği bilgileri
ister standart giriş yoluyla isterse de QUERY_STRING ortam değişkenine
atayarak yollasın veri URL kodlaması denen uzun bir isim/değer çifti
olarak yollanır. Bu kodlama boşlukların + işaretine ve özel
karakterlerin hexadecimal’e çevrilmesiyle oluşur. Veriyle çalışmadan
önce bu stringin kodunu çözmeli ve isim/değer çiftlerini ayırmalıdır. Herbir isim/değer çifti bir alan adı ve değerden
meydana gelir. Bu ikisi birbirinden = işareti ile ayrılır. Alan adı çoğunlukla
bir HTML tagı olan <INPUT>, <TEXTAREA> veya <SELECT>
ifadelerinin NAME özelliğinden alınır. Değer ise kullanıcının formu
yollarken girdiği bilgidir. İsim/değer çifti birbirinden ampersand
(&) işaretiyle ayrılır. Perl’de split adı verilen yararlı bir
fonksiyon bir string’i tanımlanan aralıklarla alt string’lere böler.
Aşağıda örnek isim/değer çiftinin nasıl bölüneceğini göstermektedir.
İlk önce herbir isim/değer çifti bir diziye yerleştirilir. Sonra isim
ve değer bölünür ve ilişkili bir diziye yerleştirilir, isim bir
anahtar olarak düşünülür değer ise dizi elemanı olarak atanır. Bu
yolla, ilişkili bir dizi integer’dan çok string olarak indekslenir. İlşkili
diziler için indeks anahtar olarak gönderilir. Böylece (‘first’)=Robert
ismi için dizi isimdir, anahtar first ve değer ise Robert olmaktadır. Liste
3-İsim/değer
Çiftlerini Bölen Perl Kodu
# This line places each name/value pair as a separate
# element in the name_value_pairs array.
@name_value_pairs = split(/&/, $user_string);
# This loops over each element in the name_value_pairs
# array, splits it on the = sign, and places the value
# into the user_data associative array with the name as the
# key.
foreach $name_value_pair (@name_value_pairs) {
($name, $value) = split(/=/, $name_value_pair);
# If the name value pair has already been given a value,
# as in the case of multiple items being selected, then
# separate the items with a " : ".
if (defined($user_data{$name})) {
$user_data{$name} .= " : " . $value;
} else {
$user_data{$name} = $value;
}
}
Liste
4-Kullanıcının
Girdiği Verinin URL Şifrelemesini Çözen Perl Kodu
# This line changes the + signs to spaces.
$user_string =~ s/\+/ /g;
# This line places each name/value pair as a separate
# element in the name_value_pairs array.
@name_value_pairs = split(/&/, $user_string);
# This loops over each element in the name_value_pairs
# array, splits it on the = sign, and places the value
# into the user_data associative array with the name as the
# key.
foreach $name_value_pair (@name_value_pairs) {
($name, $value) = split(/=/, $name_value_pair);
# These two lines decode the values from any URL
# hexadecimal encoding. The first section searches for a
# hexadecimal number and the second part converts the
# hex number to decimal and returns the character
# equivalent.
$name =~
s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;
$value =~
s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;
# If the name value pair has already been given a value,
# as in the case of multiple items being selected, then
# separate the items with a " : ".
if (defined($user_data{$name})) {
$user_data{$name} .= " : " . $value;
} else {
$user_data{$name} = $value;
}
}
Belki neden tüm strin’in bölünmeden önce
şifresi çözülmüş hexadecimal URL olmadığını hatta bu bölümde artı
(+) işaretlerinin boşluklarla değiştirildiğini merak edebilirsiniz. Boşluklar
alınarak yapılan URL kodlaması sırasında hexadecimal’e dönüştürülen
özel karakterlerin bazıları +, & ve = işaretleridir. Eğer + işaretleri
boşluğa dönüştürülüp veya string bölünmeden önce değişiklikler
yapılırsa herhangi bir özel karakter bölünen yada gerçek olarak gözterilecek
bir değere dönüştürülürse hatalı sonuca neden olur. Bu yapılan
hexadecimal kodlamanın nedenidir. Yani kullanıcının yazdığı
karakterleri kodlarken özel anlamı olan aynı türdeki bazı karakterleri
bozmamak gerekir. Liste 2
ve 3’teki kod örnekleri tam değildir. Onlar sadece URL kod çözümüne
bir örnektir.
Sonuçların
Döndürülmesi
Parsellenmiş
Başlıklar
Her
CGI programcığının herhangi bir data döndürmeden önce web sunucuya döndürmek
zorunda olduğu şey parsellenmiş başlıktır. Parsellenmiş bir başlık
çıkış kodu satırlarıdır, HTTP başlığı ile aynı formattadır ve Tablo
1’deki CGI ortam değişkenlerinden herhangi birini içerebilir.
Parsellenmiş başlıkları mutlaka boş bir satır takip etmelidir.
Parsellenmiş başlık içindeki satırlardan herhangi birisi HTTP cevap başlığının
bir parçası olarak geri gözatıcıya yollanmak üzere web sunucuya
yollanan bir direktif olamaz. Şu anda geçerli olan CGI 1.1 versiyonu üç
tane sunucu direktifi tanımlar. Bunlar aşağıda gösterilmiştir. Tablo
3-Parsellenmiş
Başlıklar İçin Sunucu Direktifleri
CGI programcığına geri döndürülecek
parsellenmiş başlığa bir örnek: #!/usr/local/bin/perl
print "Content-type: text/html\n\n";
Sunucunun
Pas Geçilmesi
Web sunucuların çoğu çıkışı kendisi
yoluyla gözatıcıya yollamaktan çok direk olarak CGI progracığı tarafından
direk yollanmasına izin verirler. Netscape Communications sunucusu için bu
özelliği CGI programcığının isminin önüne nph- önceliğiyle aktif
edilebilir. CGI programcığı sonucu web gözatıcısına
direk yolladığında HTTP cevap başlığına uygun parsellenmemiş bir başlık
tanımlamak zorundadır. Aşağıdaki tablo HTTP cevap başlıklarını
listelemektedir.
Geçerli bir parsellenmemiş başlığa ship
olmak için her HTTP cevap başlığını sağlamak ihtiyacı içinde değilsiniz.
Örneğin geçerli bir parsellenmemiş başlığı olan CGI programcığı aşağıdaki
gibi olabilir. #!/usr/local/bin/perl
print "HTTP/1.0 200 OK\n";
print "Server: Netscape-Communications/1.1\n";
print "Content-type: text/html\n\n";
Cgı
Programcıklarının Yazılması
Bu bölüm yazmanız, hata ayıklamanız ve
CGI programcıklarını çalıştırmanız için temel şeyleri ortaya
koyar. Bu temelin ilk parçası programcıklarınızı yazacağınız
programlama dilini seçmektir. Bir dil seçerken neye dikkat edeceğinizi ve
hangi dillerin daha popüler olduğunu şimdi öğreneceksiniz. Bir
Programlama Dilinin Seçilmesi
Programcık yazmaya başlamadan önce
kullanacağınız programlama dilini seçmelisiniz. UNIX gurus altında çalışanlar
UNIX shell’lerini, C’yi veya PERL’i, bir Windows kullanıcısı ise
bir DOS toplu iş kütüğünü ya da Visual Basic’i tercih edebilir. Seçim
size kalıyor fakat Web sunucusunu üzerinde ağırlayan sistemde çalışabilir
bir program üretebileceğiniz bir dil seçmek zorundasınız. Bunun anlamı
eğer siz Apple Macintosh sistemi kullanıyorsanız UNIX shell’i seçemezsiniz. Ortak
Diller
CGI programcıklarının çoğu AppleScript,
C, C++, Perl, TCL, herhangi UNIX shell ya da Visual Basic’te yazılmaktadır.
Kullanımda olan diller sadece bunlar değildir. Fakat bunlar daha çok
tercih edilmektedirler. İsteiğiniz herhangi bir dil tercih edebilmenize rağmen
yukarıda sayılan ortak dillerden birini seçmenizin iki tane iyi nedeni
vardır. Birincisi, paylaşımlı olmasından dolayı
CGI programcıklarınızı programlamak daha hızlıdır. Birçok insan
World Wide Web’de ortak işler için zaten CGI programcıkları yazmışlar.
Bunlardan birkaçı diğer insanların kullanımı için programcıklarını
serbest bırakmışlardır. Bunları web ortamında bulabilirsiniz. İkincisi eğer çok kullanılan bir dil seçerseniz
hata ayıklama aşamasında daha fazla yardım alma imkanınız olur. Programcığın
Test Edilip Hatalarının Ayıklanması
Tüm internet için kullanıma sokmadan önce
CGI programcıklarını da diğer programlar gibi test edilebilir. Bunu
yapmanın en kolay yolu hata ayıklama işini ikiye ayırmaktır. Programcığın
mantığı ve arayüzü. Programcığın mantığını test etmenin diğer
programlardan pek farkı yoktur. Bunu öğrenmek için programcığınızın
sıradan bir program olduğunu düşünün. Programcığınızı normal
komut satırından çalıştırarak test edin ve doğru çalıştığından
emin olun. Böylece programın mantığının doğruluğu öğrenildikten
sonra ortam değişkenlerini okuyan ve doğru başlığı döndüren Web gözatıcısı
ile sunucusu arasında arayüzü teşkil eden CGI programcığını ekleyin.
Arayüzü test etmek için komut satırı çalıştırmalarının bir
kombinasyonu ile gözatıcısı çalıştırması isteyebilirsiniz. Web göatıcısından
programcığı çalıştırmaya hazırsanız web sunucuyu CGI programcıklarını
çalıştıracak şekilde ayarlamak durumundasınız. Bu zaten sizin için
yapılmış olmalıdır. Eğer değilse bu konuyu “Sunucu Konfigürasyonu”
kısmında bulabilirsiniz.
Komut
Satırı Çalışması
CGI programcığınızı yazdıktan sonra
komut satırından çalıştırarak denemelisiniz. Komut satırı eski metin
tabanlı bilgisayarla interaktif çalışma terminalidir. Buna örnek birisi
DOS kabuğu diğeri de UNIX kabuğu. Programcığınızı komut satırından
çalıştırmak için komut iletisinde programcığın adını yazın ve
enter’a basın. Programı komut satırından çalıştırmanın
asıl amacı mantıksal hataları yakalamaktır. Bu noktada programın
sintak hatalarını ve yürütme hatalarını kontrol edebilirsiniz. Ortam
değişkenlerine sanki gözatıcıda çalıştırıyormuşsunuz gibi değerler
atayarak benzetim yoluyla test edebilirsiniz.
Sunucu
Konfigürasyonu
Web sunucusu yazılımı web sitesi tanımlamalarını
depolamak için konfigürasyon dosyalarını kullanır. Bu tanımlamalar dokümanların
yeri, dinlenecek portun numarası, CGI programcıklarının yerleri gibi
bilgilerdir. Eğer bir başkasının sunucusunda yeriniz varsa (örneğin İnternet
Servis Sağlayıcınız) CGI programcıklarınızı koyacağınız yerin
detaylarıyla ilgili sistem web sorumlusuna başvurmanız gerekir. Eğer
kendi internet sunucunuz varsa cgi-bin dizinini nasıl tanımlayacağınız
ve .cgi uzantısını nasıl aktifleştireceğinizle ilgili detayları öğrenmek
için yazılım dokümanlarnı kontrol etmelisiniz. Cgı-Bın
Web
sunucularının çoğu CGI programcıklarını tek bir kalsörde depolarlar.
Bu klasör cgi-bin (bazen Windows kurulu makinalarda cgi-win) klasörü
olarak isimlendirilir. Bu klasör web sunucunun ulaşabileceği herhangi bir
yerde olabilir. Web sunucusu konfigürasyon dosyası cgi-bin klasörünün
tam yolunu tanımlamalıdır. Web sunucu cgi-bin klasörünü bir kez tanıyacak
şekilde konfigüre edildikten sonra artık CGI programcıklarını bu klasörü
referans olarak verip çalıştırabilirsiniz. Örneğin domain’iniz inter.net
olsun. Bu durumda web siteniz http://www.inter.net/
olacaktır. Funtimes.pl isimli dosyayı cgi-bin dizininden çalıştırmak için
şöyle yazmalısınız: http://www.inter.net/cgi-bin/funtimes.pl
Cgı
Uzantıları
Web sunucularının büyük çoğunluğu tipik
olarak CGI programcıklarının uzantılarını .CGI olarak tanımlamanıza
izin verirler. Eğer web sunucunuzun bu özelliğini aktifleştirirseniz CGI
programcıklarınızı yalnızca cgi-bin klasöründe değil, web
sitenizdeki herhangi bir klasörde bulundurabilirsiniz. Bu size HTML
dosyalarınızla CGI dosyalarınızı aynı yerde bulundurma olanağı
verir. Örneğin funtimes.cgi dosyasını /football dizininden şöyle
yazarak çalıştırabilirsiniz: http://www.inter.net/football/funtimes.cgi
|