ÖNSÖZ
İnsanlar tüm zamanlarda ürettikleri şeyleri ya da başkaları tarafından ortaya konan ürünleri paylaşmak istemişlerdir. Bu amaçla çeşitli paylaşım teknikleri geliştirilmiştir. İnternet bunlardan en yenisi ve en hızlı gelişenidir. Bu bağlamda İnternet, dünya çapında bir bilgi, ürün, fikir ve duygu paylaşım platformudur. Bu global arenada tüm şirketler, üniversiteler, hükümet kuruluşları, özel kurumlar, kütüphaneler, kültür sanat kuruluşları çok hızlı bir şekilde yerlerini alma çabası içindedirler. Bu yüzden de bilgi yayım ortamı olan web sayfası tasarımcılığı günümüzde iyice önem kazanmış bulunmaktadır.
Web sayfası hazırlamak, site kurmak artık her kurum hatta kişisel bazda bile artık bir lüksün ötesinde ihtiyaç halini almıştır. Bu sebepledir ki, en iyi, en hızlı, bilgi etkileşimi en çok olan siteler rağbet görür hale gelmiştir. İlgi çeken siteler ve sayfalar kuru bilgi taşımıyor, okuyucuyla konuşma ortamı hazırlama çabasını gerektiriyor ve bu türdeki siteler artık en çok beğeniliyor. Bu bağlamda da uzaklardan interaktif olarak idare edilebilen sitelerin önemi artmaya başlıyor.
Her kurum ve kişisel teşebbüs kendi web sayfası alanını kendisi sağlayamıyor. Bu yüzden web sayfası yeri veren kuruluşlardan yararlanıyorlar. Bu durumda sayfa alanları çok uzak yerlerdeki sunucularda yer alabiliyor. Bu da uzaklardan web sayfası hazırlama tekniğini cazip kılıyor. İşte, böyle bir alandaki boşluğu doldurma çabasıyla hazırlamaya girişilmiş olan araştırma konum aynı zamanda Türkçe kaynak eksikliğini de bir nebzecik olsun dolduracaktır.
Türkiye’de henüz tanınmamış konularda araştırma oldukça zor olmakta. Internet bu zorluğu biraz gideriyor. Internet’in en büyük engeli ise İngilizce gerektirmesi. Tabii ki bu tez tamamen kendi çabalarımla hazırlanmamıştır. Bu konuda şükrana layık olan insanlar vardır. Onlardan ilki Tez Hocam O. Ayhan ERDEM’dir. Kendilerine yönlendirmelerinden dolayı çok müteşekkirim. Araştırmalarımda tarif edilemez ölçüde yardımlarından ötürü Hocam aynı zamanda arkadaşım N. Ekrem ŞERİF’e, ilginç ve ufuk açıcı fikirlerinden dolayı sevgili arkadaşım Hakan GÖLCÜK’e ve çıktı konusunda yardımını esirgemeyen Murat AYDINER’e teşekkürü bir borç bilirim. Ve üstün dayanışma örneği göstermelerinden ötürü de yine tüm sınıf arkadaşlarıma minnettarım.
İÇİNDEKİLER
1 UZAKTAN WEB TASARIMI 1
1.1 World Wıde Web 1
1.2 Server (Sunucu), Clıent (İstemci) Ve Url 3
2 CGI 4
2.1 Cgı neden kullanılır? 5
2.2 Dinamik Web Sayfaları 5
2.3 İnteraktif Web Sayfaları 5
2.4 Cgı’nın Bileşenleri 5
2.5 Programcıklara Verinin Aktarılması 5
2.6 Çevresel (Ortam) Değişkenler 5
2.7 Standart Giriş 5
2.8 Url Kodlaması 5
2.9 Sonuçların Döndürülmesi 5
2.10 Parsellenmiş Başlıklar 5
2.11 Sunucunun Pas Geçilmesi 5
2.12 Cgı Programcıklarının Yazılması 5
2.13 Bir Programlama Dilinin Seçilmesi 5
2.14 Ortak Diller 5
2.15 Programcığın Test Edilip Hatalarının Ayıklanması 5
2.16 Komut Satırı Çalışması 5
2.17 Sunucu Konfigürasyonu 5
2.18 Cgı-Bın 5
2.19 .Cgı Uzantıları 5
3 BİR CGI PROGRAMCIĞININ ÇAĞRILMASI 5
3.1 <Form> İmi İçinde Cgı Programcığını Çağırma 5
3.2 <A> İmi İçinden Cgı Programcığının Çağırılması 5
3.3 <Img> İmi İçinden Cgı Programcığının Çağrılması 5
3.4 Server Sıde Includes İçinde Cgı Programcığının Çağrılması 5
4 HTML FORMLARININ TEMELLERİ 5
4.1 <Form> İmi 5
4.2 <Input> İmi 5
4.3 <Select> İmi 5
4.4 <Textarea> İmi 5
5 FORM GİRİŞİNİN İŞLENMESİ 5
5.1 Giriş Kodunun Çözülmesi 5
5.2 Girişin E-Mail Olarak Yollanması 5
5.3 Unıx Olan Bir Makinada E-Mail Yollama 5
5.4 Bir Wındows Sistemde Mail Yollama 5
5.5 Bir Cevap Dödürülmesi 5
ÖZET
Hazırlanan tez, beş ayrı bölümden oluşmaktadır. Her bölüm aslında birbirinden kesin çizgilerle ayarılamayacak şekilde sıkı ilişki içindedir. Bölümler mümkün olduğunca birbiriyle ilişkisi az olan parçaların ayrılmasıyla oluşturulmuştur.
I. Bölüm, İnternet, Server, Client ve Web kavramlarının anlamları üzerinde durmuştur. Genel tanımlar yapılmış ve gereklilik konuları gündeme getirilmiştir. Ayrıca bu kavramların önemi de bu bölümde vurgulanmıştır.
II. Bölüm, interaktif ve dinamik web sayfalarının gerekliliğini ortaya koymakta, ilgisinden dolayı da CGI konularına yer vermektedir. CGI’nın tanımı, önemi ve yetenekleri uzun uzadıya bu kısımda tartışılmıştır. Ortam değişkenleri, sunucu ve istemci arasında bilgi takası, böylesi durumlarda CGI’nın rolü ele alınmış ve CGI programcıklarının yazılabilmesini mümkün kılan ortamlar söylenmiştir.
III. Bölüm, CGI programcıklarının HTML kodları içine nasıl yerleştirildiği konularını işlemektedir.
IV. Bölüm, HTML’yi kısaca tanıtmakta, sınırlılıkları üzerinde durmakta ve interaktif web sayfası hazırlamayla sıkı bir ilişkisi olan Form’ları irdelemektedir. Form’lar bu bölümde, kodları, örnekleri ve dikkat edilecek noktaları bazında kapsamlı bir şekilde gündeme getirilmiştir.
V. Bölüm ise son bölüm olmaktadır. İlk dört bölümde anlatılmaya çalışılanları bir örnek üzerinde anlatma burada hedeflenmiştir. Buna en uygun bir örnek programcık seçilmiş ve detaylı bir şekilde açıklanmıştır. En sonunda da bu örneğin tüm kodu verilmiştir.
Yine tezin büyük bir bölümünde CGI’nın hemen hemen ikiz kardeşi olan Perl dilinden bahsedilmiştir.
ABSTRACT
This prepared thesis has five chapters. Each chapter is interested in each other one that will not seperate from another.
First chapter includes meaning of Internet, Server, Client, and Web. General things were defined here. It was told that these things were very important.
The second chapter brings up necessity of interactive and dynamic web pages and includes CGI subjects that interested in them. The definition of CGI, importance of CGI, abilities of CGI is discussed in this chapter. It was also told in the chapter that exchanging information between server and client, enviroment variables, role of CGI. It was told where CGI should be written.
The third chapter explained how CGI scripts are put in HTML codes.
In the fourth chapter, HTML is presented, limititaion of HTML is explained, and Forms is told that interested in preparing interactive Web pages. It is given forms examples, codes, important points in detail.
The fifth chapter is last. It is given an example explained things where told in chapter one, two, three, and four. A script has choosen and told in details. In the end it has given whole codes of this scripts.
Perl has been told in the different places of the thesis because Perl seems like CGI a little.
TABLO LİSTESİ
Tablo 1-CGI Ortam Değişkenleri 5
Tablo 2-HTTP İstek Başlığı Ortam Değişkenleri 5
Tablo 3-Parsellenmiş Başlıklar İçin Sunucu Direktifleri 5
Tablo 4-HTTP cevap Başlıkları 5
Tablo 5 - <INPUT> İminin Özellikleri 5
Tablo 6 - <SELECT> İminin Özellikleri 5
Tablo 7 - <TEXTAREA> İmi Özellikleri 5
ŞEKİLLER LİSTESİ
Şekil 1-İlk örneğin ekran çıktısı 5
Şekil 2 - <INPUT> İminin Elemanları 5
Şekil 3 - <SELECT> İmi Örnekleri 5
Şekil 4 - <TEXTAREA> Alanında Varsayılan Metnin Görünüşü 5
Şekil 5 - Geri Besleme Formu 5
KOD LİSTELERİ
Liste 1-İlk CGI programcığı 4
Liste 2-Ortam Değişkenlerini Gösteren Bir Programcık 5
Liste 3-İsim/değer Çiftlerini Bölen Perl Kodu 5
Liste 4-Kullanıcının Girdiği Verinin URL Şifrelemesini Çözen Perl Kodu 5
Liste 5 - Input Elemanlarının Örnekleri 5
Liste 6 - <SELECT> Aşağıya Açılır Liste Örneği 5
Liste 7 - <SELECT> Kaydırılabilir Liste Örneği 5
Liste 8 - Geri Besleme Formunun HTML Kodları 5
Liste 9 - Feedback.pl Dosyasının İlk Bölümü 5
Liste 10 - Windows E-mail Altprogramı 5
Liste 11 - Feedback.pl Programcığı 5
KISALTMALAR LİSTESİ
HTML : Hyper Text Markup Language
HTTP : Hyper Text Transfer Protokol
URL : Uniform Resource Locator
FTP : File Transfer Protokol
CGI : Common Gateway Interface
SQL : Structured Query Language
Inc. : Incorporation
1 UZAKTAN WEB TASARIMI
1.1 World Wıde Web
World wide web, özellikle kullanım ve doküman değiş tokuş kolaylığı düşünülerek tasarlanmış sürekli gelişen bilgi sistemidir. 1989’ların başlarında, CERN (European Laboratory for Particular Physics)’de çalışan Tim Berners-Lee, tüm dünyadaki bilim adamlarının birlikte çalışmasını sağlayabilmek için dünya çapında hipermetin tabanlı bir bilgi sistemini önerdi. World Wide Web projesi yavaş fakat şaşırtıcı bir şekilde ilerledi ve yaklaşık sene sonlarına doğru parçalar yerlerine oturmaya başladı.
1990 sonbaharında ilk salt-metin inceleyiciler geliştirildi ve CERN’deki bilim adamları, CERN’de hipermetin dosyalarına ve diğer bilgilere erişimi sağladılar. Bununla birlikte hipermetin dokümanların yapısının ve bu dokümanların uzaktaki merkezlere aktarım yolunun tam anlamıyla tanımlanması gerekiyordu. Tim Berners-Lee’nin önerisi temel alınarak hipermetin dokümanlarının yapısı Hyper Text Markup Language (HTML-Hiper Metin Anlamdırma Dili) olarak isimlendirilen bir dille tanımlandı. HTML, zaten kullanılmakta olan Standart Generalized Markup Language (SGML-Standart Genelleştirilmiş Anlamlandırma Dili) isimli dilin bir alt kümesi temel alınarak hazırlanmıştı. HTML dokümanlarını uzaktaki merkezlere aktarabilmek için yeni bir protokol geliştirildi. Bu protokole Hyper Text Transfer Protocol (http-Hiper Metin Aktarım Protokolü) ismi verildi. http, bir dokümandan diğerine geçme ve doküman içinde indeksleme yapma olanaklarını sunmaktadır. Hipermetnin gücü basitliğinden ve saydamlığından ileri gelmektedir. Kullanıcılar bir düğmeye dokunarak tüm ağ kaynakları arasında gezinebilirler. Hipermetin dokümanlar, doküman içinde bulunan anahtar sözcüklerdeki geçiş anahtarları veya popüler alanlarla bağlanmıştır. Bu popüler alanlar tıklanabilir öğeler veya indeksli haritaların parçaları olabilirler. Hipermetin sayesinde yeni bir sözcük veya fikir sunulduğunda yeni konu hakkında tam bir bilginin bulunduğu başka bir dokümana atlanabilir. Okuyucular, bağlantıları, karartılmış anahtar sözcükler veya grafik görüntüler şeklinde görürler. Karartılmış anahtar sözcükleri veya görüntüleri seçerek başka doküman veya kaynaklara geçebilirler.
1991’in sonlarında, tüm dünyadaki konferansçılar hipermetnin vaat ettiğinden ve rahatlığından haberdar olmaya başladılar. 1993’ün başlarında dünyada sadece 50 Web merkezi vardı. Sonra harika bir şey oldu. NCSA (National Center for Supercomputing Applications)’da Web’in grafik yeteneklerinden faydalanabilmesine imkan tanıyan bir inceleyici geliştirildi. NCSA, inceleyiciye Mosaic adını verdi. Belirli bir süre boyunca Web ve Mosaic eş anlamlı olarak düşünüldü. Web’e olan ilgi artmaya başladı; önceleri sadece merak kırıntılarıyken bir ilgi tufanına dönüştü. Geriye dönüp baktığımızda Web’i; sanki bir gün içinde hayatımıza girmiş gib görürüz. Bugün Web, İnternet’in en yeni ve en hızlı gelişen kısmı ve Mosaic düzinelerce inceleyiciden sadece biri.
Genel olarak http işlemleri kullanıcılara açıktır. Bir sunucudan bilgi isteği sürecini başlatmak için kullanıcının tüm yapması gereken bir hipermetin referansını etkinleştirmektir. Kullanıcının inceleyicisi (Browser), hipermetin aktarım komutlarının yorumlanması ve iletişim istekleri işlemlerini üstlenir. İstekleri işleyen alıcı taraftaki mekanizma ise Hyper Text Trafnsfer Protocol Daemon (HTTPD) adı verilen bir programdır. Daemon, istekleri işleyen bir programın UNIX’teki adıdır. HTTPD Daemon’ı, Web’e bağlantınızın merkezini oluşturan Web sunucusunda bulunur.
Web’in gelişimini destekleyen şirketlerin sahipleri, Web’in grafik ve çoklu ortak yeteneklerinin çok azını kullanan yayımlar oluşturarak işe başladılar. Bu birkaç sene içinde her şey tamamen değişti ve bugün, Web yayımları Web’in grafik, etkileşimli ve çoklu ortam özelliklerinin çoğunu kullanıyorlar. Sürekli olarak Web yayımcılığı için yeni yöntemler tanımlanıyor.
HTML yayımcılığındaki son gelişmelerden biri HTML 3.0’ın özellikleridir. HTML 3.0’ı sayesinde Web yayımcıları HTML’in basit ve kullanımı kolay özellikleri ile dokümanlarının genel görünümü için ileri derecede kontrol yapabilme olanağına kavuştular. HTML 3.0; tabloları, matematik denklemlerini, manşetleri ve daha da fazlasını desteklemektedir.
Halen, Web, sadece HTML ile tanınmamaktadır. Web yayımcılarının çoğu HTML’in dayandığı temel dile dönmektedir. SGML’ karışık olmasına rağmen, HTML’e oranla dokümanın yapısı üzerinde daha fazla kontrol imkanı sunan ileri bir dildir. Ayrıca SGML, Adobe Acrobat ve CorelVENTURE gibi halka üretim sisteminin kullandığı pek çok sayfa tanımlama dilinin temelidir.
1.2 Server (Sunucu), Clıent (İstemci) Ve Url
Sunucu, gelen isteklere uygun yollarla yanıt veren bilgisayar demektir. Yapılan hizmetin türüne göre sunucunun adı da değişir. İnternet ortamında Web sayfalarına gelen istekleri değerlendiren ve yanıtlayan sunucuya Web Sunucu (Web Server) adı verilmektedir. İstemci (Client) Sunucudan isteklerde bulunan bilgisayar verilen isimdir. Bir istemcinin bir sunucudan bir dosya almak için bilmesi gereken üç şey vardır. İstemci; sunucunun adresini, dosyanın sunucu üstünde nerede bulunduğunu ve dosyaya erişmek ve dosyayı almak için hangi protokolü kullanacağını bilmelidir. Bu bilgi Tektip Kaynak Belirleyici (Uniform Resource Locator) yani URL olarak isimlendirilmektedir. URL’ler Internet üstünde geçerli olan herhangi bir protokolü kullanarak dosyaları bulmak ve almak için kullanılabilir.
Web dokümanlarını aktarmak için hipermetin aktarım protokolü kullanılmasına rağmen dökümanlarda diğer protokollere referans yapılabilir. Örneğin FTP ile erişilebilen bir dosyanın adresi, protokol ismini bir URL içine yazarak belirlenebilir.
2 CGI
Bu ifade Common Gateway Interface kelimelerinin baş harflerinden oluşmuştur. Türkçe de Ortak Geçit Arayüzü anlamına gelmektedir. Adından da anaşılacağı gibi Web sunucusu ve CGI programcıkları (Scripts) arasında bir geçit teşkil etmektedir. CGI Web Gözatıcısı (Browser)’ndan girişleri alabilmeyi ve çıkışları ona yollayabilmeyi mümkün kılar. CGI programcıkları aynen SQL (Structured Query Language)’de olduğu gibi herhangi bir pogramlama dilinde yazılabilmektedir. Programlamayı zaten bilen bir insan için CGI’yı öğrenmek oldukça kolaydır. CGI’yı öğrenebilmek için programcıkla Web sunucu arasında bilginin nasıl birinden diğerine geçirildiğini bilmek gerekir. CGI bir programlama dili olmadığı için bir programlama dili bilmek gerekir. Bu CGI programcığı yazabilmek için gereklidir.
Basit bir CGI programcığı aşağıda görülmektedir:
Liste 1-İlk CGI programcığı
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<H1>Simple CGI Script</H1>\n";
print "This is my first CGI script!\n";
Bu örnek Perl dili kullanılarak yazılmış bir örnektir. Yine tez içinde verilen örneklerin çoğu Perl 5’te yazılmış ve Unix sistemlerde çalışacak şekilde ayarlanmış olacaktır. Fakat bu basit örnekleri Windows sistemlerde de test etmek mümkün olacaktır. Eğer bunu yapmak isterseniz bir UNIX çevresel değişkeni olan programcık başındaki “#!/usr/local/bin/perl” ifadeyi silmelisiniz. Yukarıdaki örnek standart çıkışa yalnızca iki tane mesaj yazmaktadır. Çoğu durumda standart çıkış birimi monitördür. Bunun yanısıra CGI programcıkları için standart çıkış Web sunucudur. Dolayısıyla da Web görüntüleyicisi olmaktadır.
Perl yalnızca yorumlayıcı bir dil olduğu için örnekteki kodlar bir metin dosyasına yazılıp .pl uzantılı olarak kaydedilir. Perl 5 yorumlayıcısı (interpreter) kullanılarak çalıştırılır. UNIX sistemlerde dosyaya çalıştırılabilir (executable) özelliği verilmelidir. Windows ve Macintosh sistemler için de Perl 5 yorumlayıcısı vardır. Perl 5 yorumlayıcısını ücretsiz olarak
www.perl.com sitesinden edinmek mümkündür.
.pl uzantılı dosyaları Web sunucusunda bulunan cgi-bin dizinine kopyalamak gerekir. Bu UNIX sistemler için gereklidir. Windows sistemlerde ise O'Reilly & Associates, Inc. tarafından sağlanan WbSite Web Server programını Web sunucu olarak kullanmak mümkündür. Bu durumda .pl uzantılı dosyaların cgi-shl klasörüne konması gerekmektedir.
Kod 1’de gösterilen komutlar yukarıda anlatıldığı şekilde ayarlanıp çalıştırılırsa Şkil 1’deki görüntü elde edilir.
Şekil 1-İlk örneğin ekran çıktısı
Bu programcık gözatıcı (browser) ile çalıştırıldığında; ilk önce gözatıcı uzaktaki sisteme cgi-bin klasöründeki kodun kayıtlı olduğu dosya için bir HTTP isteği yollar. Uzaktaki sistem (makine)’de bulunan Web sunucu isteği alır ve cgi-bin klasöründeki bu dosyayı bulur. Çünkü istek cgi-bin klasöründeki bir doküman içindir. Web sunucu bu dokümanın bir CGI programcığı olduğunu bilir ve bunu çalıştırır. Tam bu noktada programcık kontrolü ele alır ve komutlar çalıştırılır ve çıktılar standart çıkış ünitesine aktarılır. Doğal olarak bu yine Web sunucusudur. Web sunucu programcıktan dönen veriyi alır ve başlığını kontrol eder. Çalıştırılan programcığın başlığında “Content-type: text/html” ifadesi yer almaktadır. Bu başlık sunucuya bunun bir HTML olduğunu söyler. Web sunucu bu durumda bir HTTP cevabı oluşturur ve bu cevapla birlikte CGI programcığının çıktısını kendisini arayan Web gözatıcısına yollar.
Kod 1’in içindeki
print "Content-type: text/html\n\n";
ifadesi CGI’ya özeldir. Diğer iki satır ise HTML formatında basit bir çıktı yaratır ve bu da gözatıcı içinde gösterilir.
2.1 Cgı neden kullanılır?
CGI çok fonksiyona sahip dinamik ve interaktif Web dokümanları üretebilir. Bu nedenle tercih edilir. Ama bunların tümünü CGI kullanmadan da yapabiliriz. Yine de CGI’nın yetenekleri bu konuda daha fazladır.
2.2 Dinamik Web Sayfaları
Hatırlanacağı gibi World Wide Web; Web gözatıcıları ve Web sunucuları olmak üzere ikiye ayrılır. Haberleşme içinse HTTP'yi kullanır. Ve Web sayfalarının çoğu HTML kullanılarak yazılır. Fakat HTML sayfaları sürekli statiktir. Dosyayı açıp içeriğini değiştirmedikçe değişmezler. CGI ise bize çok dinamik sayfalar oluşturmaya imkan tanır. Bir CGI programcığı güncel bilgileri kullanarak bir Web sayfası şekillendirip bunu gözatıcıya yollayabilir. Örneğin günün saatini, tarihini ve ziyaretçi sayısını gösteren dinamik sayfaları oluşturabiliriz. Yalnız başına HTML ile bu işlemler yapılamamaktadır.
Ek olarak CGI bir veritabanını kullanarak dinamik sayfalar oluşturmaya yardım eder. Eğer Web’den ulaşmak istediğiniz çeşitli veriler içeren bir veritabanınız varsa CGI buradaki verilerin tamamını HTML formatında sayfalara dönüştürür. Veritabanındaki bilgiler değiştikçe de sayfalarınız da değişir.
2.3 İnteraktif Web Sayfaları
CGI programcıkları Web sayfalarını interaktif yapabilmek için de mekanizma sağlar. HTML içindeki <FORM> tag(im)’ını kullanarak sayfayı görüntüleyen kullanıcıdan direk bilgi almak mümkündür. İşte bu bilgiler direk bir CGI programcığına yollanarak işlenebilmektedir. Örneğin ana sayfa içine site içindeki diğer sayfa adreslerini içeren bir açılır liste konur. Kullanıcı buradan sayfa ismini seçer bu bilgi CGI programcığına aktarılır. CGI programcığı da bunu gözatıcıya yollar.
Bülten panoları da CGI programcıklarıyla web sayfalarını interaktif yapmaya diğer bir örnektir. Programcıklar yazarak uzaklardan önceden yollanmış mesajların gösterilmesini ve yeni mesajlar yollanabilmesini sağlamak mümkündür.
İşte CGI bütün bunları ve daha fazlasını sunar. Tek engel sizin programcılık yeteneklerinizin kısıtlılığıdır. Eğer göstermek istediğiniz veriyi HTML formatına dönüştürmek isterseniz CGI programcıkları kullanın.
2.4 Cgı’nın Bileşenleri
Birinci bölüm CGI’nın ne olduğunu ve World Wide Web yayınlarında nasıl kullanılacağını açıkladı. Bu bölüm ise Web sunucusu ile CGI programcıkları arasındaki veri alış-verişini anlatıyor. Bu bölümde ihtiyaç duyulan veriyi bulmayı ve programcık sonuçlarını geri Web sunucuya döndürmeyi bulacaksınız. Hatta CGI programcıklarının sonucu olan veriyi sunucuyu pas geçerek direk Web gözatıcıya yollamayı öğreneceksiniz.
Hatırlanacağı gibi CGI, Web gözatıcısı/sunucusu ile CGI programcıkları arasında veriyi almayı-vermeyi basitleştiren bir yapıya sahipti. Bu bölüm CGI programcıkları yazabilmenin tüm araçlarını sunmaktadır. Şimdi Web sunucunun CGI programcıklarına veriyi nasıl aktardığı sonra da sonuçları Web gözatıcıya nasıl yolladığı ile başlayalım.
2.5 Programcıklara Verinin Aktarılması
Web sunucudan gerekli olan verinin programcıklar tarafından alınması içn çok fazla bir şey yapmaya gerek yoktur. Zaten Web sunucu CGI programcığını her çalıştırışında bunu CGI tanımlar. İlişkin verinin tamamı Web gözatıcı tarafından sunucuya yollanır. Örneğin form girişi, ek olarak HTTP istek başlıkları (header) sunucu tarafından CGI programcığına ya çevresel değişkenler içinde ya da standart giriş (stdin) aracılığıyla yollanır. Standart giriş, programcığın girişleri aldığı varsayılan yerdir. Bu iş sizin için yapılmaktadır, sizin tüm yapmanız gereken gerekli bilgiyi nerede arayacağınızı bilmektir.
2.6 Çevresel (Ortam) Değişkenler
Bir Web gözatıcısı bir Web sunucusundan CGI programcığı isteğinde bulunduğu zaman sunucu bağımsız çevresel adı verilen birşeyin içinde programcığı başlatır. Bu CGI programcığı kendi halinde veya çevreselinde çalışıyor anlamına gelir. Bu web sunucunun altında çalışan ortam değişkenlerinden miras kalan değerler değildir. Bu önemlidir çünkü bir çok web gözatıcısı aynı anda aynı CGI programcığını isteyebilir ve web sunucu aynı programcığın bir çok kopyasını başlatabilir. Aynı zamanda çalışan programcığın her versiyonu diğer tüm programcıklardan bağımsız olarak çalışmalıdır, aksi halde karışıklıklar meydana gelebilir. Çünkü web sunucu sizin CGI programcığınız için yeni bir çevresel ayarlar, çevresel değişkenlerdeki hemen tüm bilgileri sizin CGI programcığınıza yerleştirir. Aşağıdaki tablo ortam değişkenlerini göstermektedir.
Tablo 1-CGI Ortam Değişkenleri
Değişken Anlamı
AUTH_TYPE Web gözatıcıyı geçerli kılmak için kullanılan onay yöntemini içerir.
CONTENT_LENGTH Web gözatıcısı yoluyla yollanan, CGI programcığını isteyen Web sayfasında kullanıcının sağladığı içeriğin uzunlunu bayt olarak depolar.
CONTENT_TYPE CGI programcığı için gözatıcı isteğine eşlik eden verinin türünü depolar. Bu bilgi text/html veya image/jpeg olabilir.
GATEWAY_INTERFACE Kullanılan CGI versiyonunu depolar. örneğin CGI 1.1 kullanılıyorsa depolanan bilgi CGI/1.1 şeklinde olur.
PATH_INFO CGI programcığı için ek yol bilgisini depolar. Bu genellikle CGI programcığının kullanacağı dokümanın kökünde bulunan başka bir dokümana olan sanal yoldur.
QUERY_STRING İstek yöntemi GET olduğununda kullanıcının sağladığı bilgiyi içerir. Bu bilgi URL referansının hemen sonuna bir soru işareti ile eklenir.
http://www.robertm.com/cgi-bin/answer.pl?state=CA URL’sinde "state=CA" ifadesi QUERY_STRING ortam değişkeninde tutulur.
REMOTE_ADDR CGI programcığını isteyen Web gözatıcının çalıştığı mankinenin IP adresini depolar.
REMOTE_HOST CGI programcığını isteyen Web gözatıcının çalıştığı mankinenin etki alanı (domain) adını depolar. Bu bilgi kullanılamaz durumdaysa REMOTE_HOST ayarlanamaz.
REMOTE_IDENT Eğer Web sunucu tanımlamayı destekliyorsa kullanıcının login ismini depolar.
REMOTE_USER Web sunucunun giriş onayı için tanımladığı kullanıcı adını depolar. Bu yalnızca CGI programcığı korumalı ve sunucu giriş onay desteğine sahipse ayarlanabilir.
REQUEST_METHOD CGI programcığı istemekte kullanılan istek yöntemini içerir. Bu, GET, HEAD, POST, PUT gibi geçerli HTTP istek yöntemlerinden biri olabilir.
SCRIPT_NAME CGI programcığının sanal yolunu ve adını depolar.
SERVER_NAME Web sunucunun çalıştığı makinenin ya etki alanı adını ya da IP numarasını depolar.
SERVER_PORT Web gözatıcının Web sunucuya yaptığı istek port numarasını depo eder.
SERVER_PROTOCOL CGI programcığı için yapılan istekte kullanılan protokol adını ve versiyon numarasını saklar. Çoğu durumda bu HTTP/1.0 şeklinde bir bilgidir.
SERVER_SOFTWARE CGI programcığını çalıştıracak olan sunucu yazılımının adını ve versiyon numarasını saklar. Eğer bu yazılım Netscape Communications Server version 1.1 ise değişkende saklanan bilgi Netscape-Communications/1.1 olacaktır.
CGI ortam değişkenlerine ek olarak Web sunucu web gözatıcısından alınan tüm HTTP istek başlıklarını kullanılabilir yapar. Aşağıdaki tablo HTTP istek başlık ortam değişkenlerini göstermektedir.
Tablo 2-HTTP İstek Başlığı Ortam Değişkenleri
HTTP İstek Başlığı Anlamı
HTTP_ACCEPT Contains a comma-separated list of media types the browser can accept in response from the Web server. Examples are audio/basic, image/gif, text/*, */*. The last two examples contain the wildcard *, which is a stand-in for any string of characters. text/* means that all forms of text can be accepted; */* means that the browser will accept any content type.
HTTP_ACCEPT_ENCODING Contains the valid encoding methods the browser can receive in response from the Web server. Examples are x-zip, x-stuffit, and x-tar.
HTTP_ACCEPT_LANGUAGE Contains the browser's preferred language for a response from the Web server. However, responses in any language not specified in this variable are allowed. An example is en_UK, which is the English of the United Kingdom.
HTTP_AUTHORIZATION Contains authorization information from the Web browser. Its value is used for the browser to authenticate itself with the Web server. There is not a single specific format for possible values of this field, and new formats may be added. One example is the user/password scheme, where the value, in my case, would be user robertm:mypassword.
HTTP_CHARGE_TO Formats for this field are still undetermined. However, it is available to contain information for the account that is to be charged for the costs of receiving the requested data.
HTTP_FROM Contains the name of the requesting user as supplied by the Web browser in an e-mail address format. Some examples are
robertm@deltanet.com and
rmcdanie@primenet.com.
HTTP_IF_MODIFIED_SINCE Can contain a value specified in a valid ARPANET date standard, such as Weekday, DD-Mon-YY HH:MM:SS TIMEZONE. This field can be used in conjunction with the GET method to return the requested document only if it has changed since the date specified.
HTTP_PRAGMA Holds the value of any special directives for the Web server. For instance, a proxy Web server has one valid value for a pragma request header, no-cache, which means that the proxy server should always request the document from the real Web server instead of returning a nonexpired cached copy.
HTTP_REFERER Contains the URI (uniform resource identifier, which is a superset of URLs) of the document that contained the link to the currently requested document. An example would be
http://www.thepalace. com/web-pages.html.
HTTP_USER_AGENT Contains the name of the Web browser software that requested the document. An example is Mozilla/2.0 (Win95; I), which would be the user agent for the Netscape 2.0 browser for Windows 95.
Aşağıda birçok ortam değişkeninin kullanıldığı bir CGI programcığı görülmektedir. Liste 1 bunu göstermektedir.
Liste 2-Ortam Değişkenlerini Gösteren Bir Programcık
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "AUTH_TYPE = $ENV{'AUTH_TYPE'}<BR>\n";
print "CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'}<BR>\n";
print "CONTENT_TYPE = $ENV{'CONTENT_TYPE'}<BR>\n";
print "GATEWAY_INTERFACE =
$ENV{'GATEWAY_INTERFACE'}<BR>\n";
print "PATH_INFO = $ENV{'PATH_INFO'}<BR>\n";
print "PATH_TRANSLATED = $ENV{'PATH_TRANSLATED'}<BR>\n";
print "QUERY_STRING = $ENV{'QUERY_STRING'}<BR>\n";
print "REMOTE_ADDR = $ENV{'REMOTE_ADDR'}<BR>\n";
print "REMOTE_HOST = $ENV{'REMOTE_HOST'}<BR>\n";
print "REMOTE_IDENT = $ENV{'REMOTE_IDENT'}<BR>\n";
print "REMOTE_USER = $ENV{'REMOTE_USER'}<BR>\n";
print "REQUEST_METHOD = $ENV{'REQUEST_METHOD'}<BR>\n";
print "SCRIPT_NAME = $ENV{'SCRIPT_NAME'}<BR>\n";
print "SERVER_NAME = $ENV{'SERVER_NAME'}<BR>\n";
print "SERVER_PORT = $ENV{'SERVER_PORT'}<BR>\n";
print "SERVER_PROTOCOL = $ENV{'SERVER_PROTOCOL'}<BR>\n";
print "SERVER_SOFTWARE = $ENV{'SERVER_SOFTWARE'}<BR>\n";
print "HTTP_ACCEPT = $ENV{'HTTP_ACCEPT'}<BR>\n";
print "HTTP_ACCEPT_ENCODING =
$ENV{'HTTP_ACCEPT_ENCODING'}<BR>\n";
print "HTTP_ACCEPT_LANGUAGE =
$ENV{'HTTP_ACCEPT_LANGUAGE'}<BR>\n";
print "HTTP_AUTHORIZATION =
$ENV{'HTTP_AUTHORIZATION'}<BR>\n";
print "HTTP_CHARGE_TO = $ENV{'HTTP_CHARGE_TO'}<BR>\n";
print "HTTP_FROM = $ENV{'HTTP_FROM'}<BR>\n";
print "HTTP_IF_MODIFIED_SINCE =
$ENV{'HTTP_IF_MODIFIED_SINCE'}<BR>\n";
print "HTTP_PRAGMA = $ENV{'HTTP_PRAGMA'}<BR>\n";
print "HTTP_REFERER = $ENV{'HTTP_REFERER'}<BR>\n";
print "HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}<BR>\n";
Eğer bu programı hemen çalıştırmak isterseniz listenin en başındaki #!/usr/local/bin/perl ifadesi Windows platformunda kullanılmamalıdır.
2.7 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.
2.8 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.
2.9 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.
2.10 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";
2.11 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";
2.12 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.
2.13 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.
2.14 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.
2.15 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.
2.16 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.
2.17 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.
2.18 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.pl2.19 .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 3 BİR CGI PROGRAMCIĞININ ÇAĞRILMASI
CGI programcıkları genellikle okuyucuların yolladığı formların işlenmesinde kullanılır. Giriş genellikle sunucu tarafından aktarılan ortam değişkenleri (bkz Tablo 1-CGI Ortam Değişkenleri) biçimindedir. Ortam değişkenleri sunucunun kullandığı CGI programcıklarının sürüm bilgisi, veri tipi, veri boyutu, gibi aktarılmakta olan bilgi hakında bazı değişkelnleri tanımlar. CGI programcığı girişleri bir komut satırı ifadesinden ve standart bir girişten de alabilir. Bir CGI programcığını çalıştırmak için sunucu üzerinde kaynak olarak alabileceğiniz bir programcık mevcut olmalıdır. Sunucunuz, önceden bahsedildiği gibi bir CGI programcığını çalıştıracak ve onu kullanmayı planladığınız amaca uygun olarak konfigüre etmenizi sağlayacak yetenekte olmalıdır.
Okuyucu, programcığa bir referans içeren bağlantıyı etkinleştirerek CGI programcığına bilgi aktarabilir. CGI programcığı girişi işler ve sonucu web sunucusunun kullanabileceği şekilde biçimlendirir. Web sunucusu sonucu alır ve okuyucunun gözatıcısına (inceleyici) geri yollar. Gözatıcı sonucu ekranda gösterir.
Bir CGI programcığı çıkışı bir yönlendirme taşıyan bir başlikla başlar. Şu anda geçerli olan üç sunucu yönlendirmesi: Content_Types (içerik-tipi), Location (Konum) ve Status (Durum)’dur. Başlık HTML başlığı gibi boş bir satırla izlenecek şekilde bir yönlendirme taşıyabilir. Boş satırlar başlığı, okuyucuya aktardığınız veriden ayrıdır. Location ve status yönlendirmesi içeren çıkışlar genellikle tek satırdır. Bu nedenle sunucunun ihtiyacı olan Location ve Status bilgilerinin hepsi bu satırdadır ve veri içeren satırlar bulunmadığından boş satıra da ihtiyacak yoktur. Sunucu çıkışı yorumlar, ortam değişkenlerini belirler ve çıkışı istemciye iletir.
Bu nedenle istemci ve sunucu arasında gerçekleşen olaylar birçok aşama içerir. Bu aşamlar şu şekilde özetlenebilir.
1. İstemci, girişi sunucuya geçirir.
2. sunucu, girişe uygun olacak şekilde ortam değişkenlerini ayarlar.
3. sunucu, girişi CGI programcığının adı ile bir değişken gibi geçirir.
4. sunucu, eğer varsa, komut satırı girişini ya da standart giriş katarını CGI programcığına geçirir.
5. programcık girişi işler.
6. programcık, çıkışı sunucuya döndürür. Bu çıkış daima belirli bir başlığı taşır ve eğer ek veri varsa bir de gövdesi olur.
7. sunucu, ortam değişkenlerini çıkışa uygun olarak ayarlar.
8. sunucu, çıkışı istemciye geçirir.
Bir CGI programcığını HTML sayfasından çağırmak için, <FORM>, <A> ya da <IMG> imleri kullanılabilir.
3.1 <Form> İmi İçinde Cgı Programcığını Çağırma
Eğer bir form girişini işleyen bir CGI programcığı yazıyorsanız <FORM> iminin ACTION özelliğinde CGI programcığının ismini belirtmelisiniz. Bu şöyle gösterilebilir:
<FORM METHOD=POST ACTION="/cgi-bin/formhandle.pl">
Tahmin edeceğiniz gibi, ACTION özelliğinin değeri form yollandığında hangi olayın yürütüleceğini belirler. ACTION olarak form için herhangi bir geçerli bir URL tanımlamalısınız. Form yollandığında gözatıcı sunucuya bu tür nesneler için bir istek yollar. Eğer nesne bir CGI programcığı ise programcık çalıştırılır ve form içindeki tüm alanlara girilen veriler QUERY_STRING ortam değişkeniyle ya da standart girişle gönderilir. HTML veya GIF dosyalar gibi diğer URL’ler için doküman geri gözatıcıya döndürülür. Aşağıdaki örnek .cgi uzantılı bir dosya için yazılmış HTML kodudur.
<FORM METHOD=POST ACTION="formhandle.cgi">
3.2 <A> İmi İçinden Cgı Programcığının Çağırılması
<A> iminin HREF özelliğine bir CGI programcığını atayarak ta aşağıdaki örnekte olduğu gibi çağırabilirsiniz:
<A HREF="/cgi-bin/clicked.pl">Click Here</A>
ya da
<A HREF="clicked.cgi">Click Here</A>
Linke tıklandığında örnekteki HTML kodu yine örneklerdeki .cgi veya .pl uzantılı dosyayı çağırır.
Tablo 1-CGI Ortam Değişkenleri tablosundan hatırlanacağı gibi istek yöntemi GET olduğunda QUERY_STRING’in değeri kullanıcının girdiği bilgi olmaktaydı. GET yöntemi yoluyla kullanıcının bu bilgiyi girmesinin bir yolu istenene CGI programcığının hemen ardına bir soru işareti eklemektir. <A> iminin HREF özelliğiyle CGI programcığı çağırmaya bir örnek şöyle olabailir:
<A HREF="/cgi-bin/clicked.pl?file=clicked.html">Click Here</A>
Bir programcı olarak, programınıza parametreleri komut satırındaki isim/değer çifti stringini URL kodlaması olarak geçirmek için kullanabilirsiniz. Yukarıdaki örnekte HTML dosyasının adı clicked.pl programcığına QUERY_STRING ortam değişkeni yoluyla geçiriliyor. Ne yazık ki, birçok durumda bu uygulama çok yararlı değildir.
3.3 <Img> İmi İçinden Cgı Programcığının Çağrılması
Siz CGI programcıklarınızı <IMG> HTML imiyle de çağırabilirsiniz. Eğer SCR özelliğinde CGI programcığınızın yolunu verirseniz web sunucu programcığı çalıştıracak image için kaynak olarak çıkışı döndürecektir. Bu durumda CGI programcığınız sonucu grafik formatında döndürmelidir. Ya da direk olarak ASCII tanımını veya dolaylı olarak grafik dosyanın yolunu web sunucuya döndürmelidir. Aşağıda bir CGI programcığının çağrılmasının HTML kodunu görüyorsunuz.
<IMG SRC="/cgi-bin/cgi-image.pl">
şimdi de cgi-image.pl dosyasının web sunucuya dolaylı olarak döndüreceği grafik dosyasını gösteren kodları verelim:
#!/usr/local/bin/perl
print "Location: /graphics/image1.gif\n\n";
Muhtemelen biliyor olmalısınız, bu sözkonusu özelliği kullanmanın pratik bir yolu değildir.
3.4 Server Sıde Includes İçinde Cgı Programcığının Çağrılması
Web sunucuların çoğu Server Side Includes olarak bilinen bir özelliği desteklerler. Server Side Includes bir HTML dokümanının içinde yer web sunucuya ait HTML kodlarıdır. Web sunucu bir HTML dokümanını parsellediğinde tüm Server Side Includes komutlarını çalıştırır ve komut yerine sonuçları yerleştirir. Server Side Includes, size bir HTML imi ekiyle başka bir nesneyi sayfanıza kolayca dahil etmenize izin verir. Bu dahil edilen nesneler başka bir HTML dokümanı, bir resim dosyası ya da bir CGI programcığı gibi bir çok farklı şey olabilir. Form içinde tüm Server Side Include’ları aşağıdaki gibi olur.
<!--#command tag1="value1" tag2="value2" -->
Bir CGI programcığını bir Server Side Include ile birlikte çalıştırmak için exec komutunu kullanmalısınız. Exec komutu iki adet geçerli ime sahiptir, cmd ve cgi. Cmd imi /bin/sh (UNIX Bourne shell) ile ilişkili değeri çalıştırır. Cgi imi ise bir CGI programcığını çağırmak için kullanılır. Bu programcığın sanal yolu ilişkili bir değer olmalıdır. Bir örneler şöyle açıklanabilir:
<!--#exec cgi="/cgi-bin/include-me.pl" -->
4 HTML FORMLARININ TEMELLERİ
Formlar HTML kodları içinde tanımlanırlar, CGI içinde değil. CGI ise formlardan alınan girişleri işlemeyi basitleştirir. Bir form oluşturmak için <FORM> imini ve bununla ilişkili olan <INPUT>, <SELECT> ve <TEXTAREA> imlerini kullanabilirsiniz. Basit bir form en azından tek bir butona sahip olmalıdır. Buna rağmen formların çoğunluğu daha fazla öğe içerirler. Bu bölüm kısa bir şekilde <FORM>, <INPUT>, <SELECT> ve <TEXTAREA> imlerini anlatmayı planlamaktadır. Tabi ki bu imlerle ilişkili özelliklere de yer verilecektir.
4.1 <Form> İmi
Tüm HTML formları <FORM> imiyle başlar ve </FORM> imiyle biterler. <FORM> iminin çok sık kullanılan <METHOD> ve <ACTION> özellikleri vardır. Nadiren de olsa kullanılan <ENCTYPE> özelliği vardır ki bu kaynaktaki örneklerde karşılaşacaksınız.
METHOD özelliği web sunucuya verinin CGI programcığına nasıl yollanacağını söyler. METHOD özelliğinin değerleri GET ve POST’tur. Çoğunlukla POST değeri atanır METHOD özelliğine. POST yöntemi veriyi URL olarak kodlar ama standart giriş yoluyla yollar.
ACTION özelliğinin değeri form onaylandıktan (submit edildikten) sonra hangi olayın yapılacağını sunucuya söyler. Formun onaylanması demek, sayfa görüntülendikten sonra okuyucunun submit butonuna tıklaması ya da bu buton aktifken enter tuşuna basmasını ifade eder. Bu işlemden sonra veri URL olarak kodlanır ve GET ya da POST metodları kullanılarak sunucuya yollanır. Sunucu veriyi alır ve ACTION özelliğinin değerini kontrol eder.
ACTION özelliği değer olarak herhangi bir geçerli URL’ye sahip olabilir. Bizim amaçlarımız için bu değer daima CGI programcıklarımızın yeri olacaktır. Örneğin geri besleme formu için feedback.pl adında bir dosyayı çağıralım. Eğer bu dosya sunucunun cgi-bin klasöründe yer alıyorsa ACTION özelliği /cgi-bin/feedback.pl şeklinde olmalıdır. <INPUT>, <SELECT>, ve <TEXTAREA> gibi formun diğer öğeleri <FORM> ve </FORM> imleri arasında olmalıdır. Geri besleme formu için örnek olarak formun başına <FORM METHOD=POST ACTION= "/cgi-bin/feedback.pl"> ifadesi yazılmalıdır.
4.2 <Input> İmi
<INPUT> imleri <FORM> ve </FORM> imleri arasına yerleştirilmelidir ve formun en çok işe yarar elemanlarıdır. <INPUT> imiyle birlikte kontrol kutuları, radyo düğmeleri, tek-satır giriş alanları, gönder ve temizle puş butonları yaratılabilir. <INPUT> imi </ INPUT> şeklinde bir kapatma imine sahip değildir ve Tablo 5’de gösterildiği gibi altı tane özelliğe sahiptir.
Birçok görsel eleman gibi bu HTML imleri de açıklamaktan daha çok gösterilir. <INPUT> elemanının her tipiyle bir örnek yaratılmıştır. Bu <INPUT> elemanlarının Netscape gözatıcısında nasıl göründüğünü gösterir.
Tablo 5 - <INPUT> İminin Özellikleri
Özellik Değerleri
TYPE Bu özellik formun hangi INPUT alanı kullanacağını belirler. Muhtemel değerler aşağıda verilmiştir.
text: tek satırlı metin giriş alanı yaratır. <INPUT> imi için bu varsayılan değerdir.
password:girilen tüm karakterlerin “*” olarak gözükmesi dışında metin kutusuna benzer..
hidden: kullanıcıya görünmeyen bir alan yaratır. Bu kullanıcının görmesi ya da değişrimesi gerekmeyen bilgilerin geçirilmesinde kullanılır.
checkbox: işaretlenebilen ya da işareti kaldırılabilen tekli bir işaret kutusu yaratmak için kullanılır.
radio: açık ya da kapalı seçenek sunması bakımından kontrol kutusuna benzer. Yine de NAME özelliğinde birkaçtane radyo düğmesi olduğunda bunlardan sadece bir tanesi seçilebilir.
submit: tıklandığında formu okey’leyen bir teslim etme push butonu yaratır.
reset: tıklandığında formdaki tüm öğelerin o an geçerli değerlerini silen bir puş buton yaratır.
NAME İsim/değer çifti için isim olarak sunucuya bu özellik için değer yollar. Örnek olarak tek satırlı bir metin kutusunda kullanıcı robertm@ deltanet.com şeklinde bir bilgiyi “email” ile isim olarak yazarsa sunucu bu bilgiyi “email=robertm@deltanet.com olarak alır. Bir grup radyo düğmesi yarattığınızda tüm butonlar NAME özelliği olarak aynı değere sahip olmalıdır.
VALUE Metin ve şifre öğeleri için bu özellik bir ilk değer tutar. Radyo düğmeleri ve jontrol kutuları için seçildiğinde sunucuya yollamak üzere bir başlangıç değeri tutar. Eğer VALUE özelliği kontrol kutuları ve radyo düğmeleri için belirtilmezse seçili olanlar için sunucu “on” değeri alır. Submit ve reset öğeleri için butonların etiketleri için bir değer atamak için kullanılır. Örnek olarak VALUE özelliği “Gönder” yapılmış bir submit butonunun üzerindeki yazı “Gönder”olur.
CHECKED Bu özellik bir değer taşımaz ve sadece kontrol kutuları ve radyo düğmeleri için başlangıçta işaretli olmalarını sağlar.
SIZE Bu özellik yalnızca metin ve şifre kutuları için kullanılır ve karakter bazında kutuların fiziksel büyüklüklerini tanımlar. Varsayılan değer 20 karakterdir.
MAXLENGTH Bu özellik sadece metin ve şifre kutuları için kullanılır. İnput elemanının makzimum alacağı karakter sayısını tanımlar.
Liste 5 - Input Elemanlarının Örnekleri
<FORM METHOD=POST ACTION="/cgi-bin/example.pl">
Single Line Entry Field: <INPUT TYPE=text NAME=text VALUE="Default
value" SIZE=30>
<P>Password Entry Field: <INPUT TYPE=password NAME=password SIZE=10
MAXLENGTH=8>
<P>Check Box: <INPUT TYPE=checkbox NAME=checkbox CHECKED>
<P>Radio Buttons - Yes <INPUT TYPE=radio NAME=radio VALUE=yes> No
<INPUT TYPE=radio NAME=radio VALUE=no>
<P>Submit Pushbutton: <INPUT TYPE=submit VALUE=Send>
<P>Reset Pushbutton: <INPUT TYPE=reset VALUE=Reset>
</FORM>
Bu bölümde oluşturulan geri besleme formu birkaç tane giriş alanı kullanır, fakat onların hepsi de metin tipindedir. Bir de aşağıdaki örneğe bakalım:
<B>Name-Address</B><BR><INPUT NAME="name" SIZE=42>
<P><B>E-mail Address</B><BR><INPUT NAME="email" SIZE=42>
<P><INPUT TYPE="submit" VALUE="Send">
ilk iki satır 42-karakterlik isim ve e-mail adresi için tek satırlı metin kutusu alanları yaratmaktadır. Son satır ise submit puş butonu yaratmaktadır. Etiket olarak ta “Send” değerini vermektedir. Çünkü <INPUT> imi öğeleri etiketler içermezler bu kod isim ve e-mail alanları için metin etiketler içermektedir.
Şekil 2 - <INPUT> İminin Elemanları
4.3 <Select> İmi
<SELECT> imi kaydırılabilir ya da aşağıya-açılır liste kutuları yaratmaya izin verir. Kaydırılabilir bir liste çeşitli öğelerin bir listesidir. Aşağı-yukarı kaydırarak bir ya da çoklu seçim yapılabilir. Aşağıya-açılır liste de kaydırılabilir listey benzer fakat üzerine tıklayıp aşağıy doğru açmadıkça yalnızca bir değer gösterir. Aşağıya-açılır listeden yalnızca bir öğe seçilebilir.
<SELECT> imi Tablo 6’da tanımlandığı gibi üç özelliğe sahiptir. Bunlar: NAME, SIZE ve MULTIPLE’dır.
Tablo 6 - <SELECT> İminin Özellikleri
Özellik Değerleri
NAME Bu özellik <INPUT> iminin NAME özelliğine benzer. Bu özellik için verilen değer isim/değer çifti için isim olarak sunucuya yollanır.
SIZE Bu özellik liste içinde kaç tane seçenek olacağını gösterir. Eğer 1’e ayarlanırsa liste aşağıya açılır liste kutusu gibi olur. Diğer bir ifadeyle kaydırılabilir liste kutusunda kaç tane seçenek görüneceği SIZE ile tanımlanır. Eğe MULTIPLE özelliği hazırsa SIZE özelliği 1 bile olsa liste kaydırılabilir bir liste kutusu olur.
MULTIPLE Bu özellik bir değere sahip değildir. Eğer kullanılmışsa çoklu seçenek seçimine izin verir.
<SELECT> imi başlangıç ve bitiş imlerinin ikisine de sahiptir. Yani <SELECT> ile açılır ve </SELECT> ile kapanır. Bu imlerle beraber <OPTION> imini kullanarak liste seçenekleri tanımlanabilir. <OPTION> imi kapatma imi almaz ve sadece OPTION özelliğine sahiptir. Bu özellik geçerli formda ilişkili seçeneği seçili yapar. Örnek olarak Liste 6, aşağıya açılır liste kutusunun HTML kodlarını, Liste 7 kaydırılabilir liste kutusu kodlarını ve Şekil 3 ise <SELECT> iminin Netscape görüntüsünü ifade etmektedir.
Liste 6 - <SELECT> Aşağıya Açılır Liste Örneği
<FORM METHOD=POST ACTION="/cgi-bin/example.pl">
<SELECT NAME="number" SIZE=1>
<OPTION>one
<OPTION>two
<OPTION>three
</SELECT>
</FORM>
Liste 7 - <SELECT> Kaydırılabilir Liste Örneği
<FORM METHOD=POST ACTION="/cgi-bin/example.pl">
<SELECT NAME="flavor" SIZE=3 MULTIPLE>
<OPTION>Chocolate
<OPTION SELECTED>Vanilla
<OPTION>Strawberry
<OPTION>Chocolate Chip
<OPTION>French Vanilla
<OPTION>Peach
</SELECT>
</FORM>
Şekil 3 - <SELECT> İmi Örnekleri
Geri besleme formu herhangi bir <SELECT> imi içermez.
4.4 <Textarea> İmi
Formun içine çok satırlı metin alanı yerleştirmek için <TEXTAREA> imi kullanılır. <TEXTAREA> ve </TEXTAREA> şeklinde başlama ve bitirme imine sahiptir. ... <TEXTAREA> iminin alabileceği dört özelliği tanıtmaktadır.
Tablo 7 - <TEXTAREA> İmi Özellikleri
Özellikler Değerler
NAME <INPUT> ve <SELECT> imlerinin NAME özelliğindeki gibi isim/değer çiftleri gibi sunucuya yollanacak isim değerini girmeye yarar. "I think it is a great product!" yazısını içeren bir mein alanının adını, "comments" olarak ayarlarsanız sunucu, "comments=I think it is a great product!" bilgisini alır.
ROWS Karakter bazında metin alanının satır sayısını ayarlar. Bu diğer bir ifadeyle alanın fiziksel büyüklüğünü ifade eder. Ne var ki, kullanıcının girebileceği satır sayısı anlamına gelmez.
COLS Karakter bazında alanın sütun sayısını ayarlar. Bu yine fiziksel genişliktir. Girilebilecek karakter sayısını ifade etmez.
WRAP Bu özellik <TEXTAREA> imine Netscape’in bir uzantısıdır. Bir Netscape uzantısı yalnızca Netscape Navigator halihazırdaki versiyonları altında çalışır. Diğer tüm gözatıcılarda çalışmaz. Ayrıca bu geçerli HTML tanımının bir parçası değildir fakat sonraki versiyonlara eklenebilir. WRAP özelliği aşağıdaki değerlerden bir tanesini alabilir:
Off: WRAP özelliğini kaldırır.
Virtual: Girilen satırlar metin kutusu içinde iki yana hizalanır. Yani hem satırların solları hem de sağları aynı hizada olurlar. Fakat sunucuyabu bilgi tek satır olarak yollanır.
Physical: Bir satır kutunun genişliğine ulaştıktan sonra iki yana hizalanır. Satırın iki yana hizalandığı yerden itibaren “yeni satır” işaretleri sunucuya yollanır.
<TEXTAREA> ve </TEXTAREA> imleri arasında