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.

Aşağıdaki Liste 2 isim/değer çiftlerini böler, fakat sorgu string’inin URL olarak kodlandığı unutulmamalıdır. String’in içeriğinin kodu çözülmelidir. Liste 3 ise eşittir (=) işaretleri yerine boşluk kor, hexadecimal kodlarla da karakter eşleniklerini değiştirir.

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

 

Her ne zaman bir CGI programcığı çağrılsa programcığı çağıran web gözatıcısına gönderilmek üzere web sunucusuna yollanan bir sonuca ihtiyaç duyar. Bir CGI programcığının web sunucuyu es geçerek sonucu direk gözatıcıya yollamak gibi bir seçeneği de vardır. Programcık sonuçları ister direk isterse dolaylı olarak gözatıcıya yollasın mutlaka geçerli bir başlık (header) tanımlamalıdır. Bir CGI programcığı çalışmayı tamamladıktan sonra standart çıkış yoluyla tipik olarak çalışmanın sonuçlarını sunucuya yollar. Web sunucusu sonuçları alır, HTTP cevap başlığına uygun bir şekilde formatlar ve tüm sonuçları web gözatıcısına yollar. CGI programcığının browser geri döndürmek zorunda olduğu ilk şey parsellenmiş başlıktır.

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

 

Direktif

Anlamı

Content-type

Web sunucuya CGI programcığı tarafından geri yollanacak verinin MIME tipini tanıtır.

Location

Ya sanal yolu ya da CGI programcığının gözatıcı tarafından kendisinden dokümanın URL’sini içerir.

Status

Web sunucuya bir HTTP durum satırı yollar. Bu dolaylı olarak sonra gözatıcıya yollanacaktır. Durum satırları 3 dijitlik bir durum kodu ve onu takip eden string’den meydana gelirler. Örneğin “404 Not Found” ve  “403 Forbidden” satırları.

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.

 

Tablo 4-HTTP cevap Başlıkları

 

HTTP Cevap Başlığı

Anlamı

ALLOWED

İstekte bulunan gözatıcıya izin verilen istek metodunu tanımlar. Örneğin GET, HEAD ve PUT.

CONTENT-ENCODING

Kullanılan kod çözme metodunu tanımlar. Örneğin  x-zip, x-stuffit, ve  x-tar.

CONTENT-LANGUAGE

Geri dönen dokümanın hangi dilde olacağını tanımlar. İngilizce dili için örneğin en en ifadesi kullanımı.

CONTENT-LENGTH

Bayt türünden geri yollanan verinin miktarını tanımlar.

CONTENT-TRANSFER-ENCODING

Web sunucu ile web gözatıcısı arasındaki kod çözmeyi tanıtır. Geçerli olanı Binary’dir. browser.

CONTENT-TYPE

Transfer edilen datanın türünü içerir. Örnek olarak text/html ve image/gif.

COST

İstenen objenin yeniden bulunan maliyetini içerecek. Bu başlığın formatı henüz belirtilmemiştir.

DATE

Geçerli ARPANET  formatında istenen objenin oluşturulma tarihini içerir.

DERIVED-FROM

İstenen objenin versiyon numarasını içerebilir. Düzenlenebilen dokümanların versiyon kontrolleri için veriliyor.

EXPIRES

İstenen bilgi için geçerliliğinin birme tarihini içerir.

LAST-MODIFIED

İstenen objenin son değişiklik tarihini içerir. Başlık ARPANET tarih formatındadır.

LINK

Dönen dokümanla ilgili bilgiyi tutar.

MESSAGE-ID

HTTP mesajı için benzersiz bir tanıtıcı içerir.

PUBLIC

ALLOW cevap başılığına benzer. Fakat sadece istemci gözatıcının değil herhangi birisinin istek metodlarını belirtir.  Örneğin GET, HEAD ve TEXTSEARCH.

TITLE

Dönen dokümanın başlığını belirtir. Bir HTML dosyası için <TITLE></TITLE> tag’ları arasında belirtilen değerin eşleniğidir.

URI

Bulunabilen istenmiş objenin URI (uniform resource identifier)’ını verir. Örnek http:// www.robertm.com/Group-one/section1.htmlvary= language

VERSION

Değiştirilebilen objenin versiyonunu tanımlar. Bunun formatı şu an tanımsızdır.

 

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