HTML forma nədir və nə üçün lazımdır

Beləliklə gördük ki, brauzerlə skript arasında məlumat mübadiləsinin ən məşhur metodları GETPOST-dur. Ancaq bir məsələ var ki, parametrlər sətrini əllə formalaşdırmaq, onları URL-kodlaşdırmaya çevirmək çox cansıxıcıdır.  Gəlin bu məsələdə HTML dilinin işi necə asanlaşdırdığını araşdıraq.

Əvvəlcə GET metoduna baxaq. Sadə istifadəçinin ?, &, % … işarələri və s. ilə parametrləri URL-də əllə yığmaq istədiyini təsəvvür edin. Bu hətta proqramçılar üçün də çox narahat ola bilər. Xoşbəxtlikdən bu məsələnin həlli üçün HTML dilinin bütün brauzerlər tərəfindən başa düşülən rahat imkanları var.

Fərz edək ki, bizim serverdə əsas kataloqda script.php skriptimiz var və qəbul edək ki, bu skript iki parametr – nameborn parametrlərini qəbul edir və brauzerdə  http://site.com/script.php adresinə keçəndə skript aşağıdakı HTML-səhifəni hazırlayıb çap etməlidir:

<!DOCTYPE html>
<html lang="az">
<body>
Salam, name! Mən bilirəm ki, siz born tarixində anadan olmusunuz!
</body>
</html>

Aydındır ki səhifənin generasiyası zamanı name və born skriptə ötürülən uyğun qiymətlərlə əvəz ediməlidir.

Parametrlərin əllə ötürlməsi

Gəlin parametrləri birbaşa URL-də parametrlər sətrində daxil edək. Beləliklə, brauzerdə
http://site.com/script.php?name=Anar&born=09-03-1986
skriptini işə salsaq bizə lazım olan nəticədə səhifəni əldə etmiş olarıq:

<!DOCTYPE html><html lang="az"><body>
Salam, Anar! Mən bilirəm ki, siz 09-03-1986 tarixində anadan olmusunuz!
</body></html>

Diqqət yetirin ki, parametrləri ampersand (&) işarəsi ilə ayırırıq və həmçinin bərabərdir işarəsi (=) istifadə edirik. Bunun niyə belə olduğu aşağıda izah ediləcək.

Formadan istifadə edilməsi

İsitfadəçinin adını və anadan olma tarixini rahat daxil etməsi üçün nə etmək olar? Görünür ki, brauzerdə Windows-un dialoq pəncərəsinə bənzər qrafik interfeys hazırlamaq lazımdır. Bunun üçün bizə dialoqun elementləri ilə – məlumatı daxil etmək üçün xanalar və klik etdikdə serverdəki skripti işə salacaq düymə – button – ibarət HTML-səhifə lazımdır. Səhifə adını index.html qoyaq. Səhifənin HTML kodu aşağıdakı kimi olacaq:

<!DOCTYPE html>
<html lang="az">
    <head>
       <title>Forma səhifəsi</title>
       <meta charset="utf-8">
    </head>
    <body>
       <form action="script.php" method="GET">
          Adınızı daxil edin:
          <input type="text" name="name" value="Naməlum"><br>
          Anadan olma tarixini daxil edin:
          <input type="text" name="born" value="Naməlum"><br>
          <input type="submit" name="Göndər">
       </form>
    </body>
</html>

HTML-səhifəni serverə yükləyib brauzerdə açsaq aşağıdakı şəkildəki kimi səhifə açıldığını görərik:

HTML formadan istifadə

Artıq, name xanasına öz adınızı, tarix yerinə anadan olma tarixinizi yazıb Göndər düyməsinə klik etsəniz brauzer <form> teqinin action atributunda qeyd edilmiş URL-dəki skriptə – http://site.com/script.php skriptinə müraciət edəcək.

Forma <input> teqlərinə daxil edilmiş bütün parametrləri ? işarəsindən sonra bir-birindən ampersandla (&) ayıraraq skriptin ötürəcək. Xanaların adları qiymətlərindən bərabər (=) işarəsi ilə ayrılacaq. Artıq mövzunun əvvəlində niyə bu simvollardan istifadə etdiyimizi yəqin ki başa düşürsünüz.

Beləliklə brauzerin skripti işə salmaq üçün formalaşdırdığı URL aşağıdakı kimi olacaq (qəbul edilmişdir ki, formanı 23.05.1986 təvəllüdlü Tural adlı istifadəçi doldurub):
http://site.com/script.php?name=Tural&born=23-05-1989

POST metodu və formalar

İndi elə etmək lazımdır ki, məlumatlar GET-lə yox POST-la göndərilsin. Bunun üçün method=”GET”  yerinə method=”POST” yazmaq lazımdır. Digər heç bir dəyişkliyə ehtiyac yoxdur.

Qeyd etmək lazımdır ki, <form> teqində method atributu qeyd edilməyibsə, susmaya görə GET metodunun nəzərdə tutulduğu qəbul edilir.

Beləliklə artıq, istifadəçini skriptin adı, onun parametrləri və s. kimi informasiyalarla yormağa ehtiyac qalmır. Onun işi yalnız formanın xanaları, radio və ya checkbutton, link-keçidlər və s. ilə olacaq.

Yuxarıda göstərilən misallarda əslində sadəlik baxımından hər şey elə də ürəkaçan görsənmir. Belə ki, skript bir dənədir, ümumi fayllar isə iki ədəddir (forma yerləşmiş fayl və skript faylı). Bu məsələnin praktikada çox yerdə istifadə edilən sadə həll üsulu var. Skript əvvəlcə işə salınanda ona parametrlərin ötürülüb ötürülmədiyini yoxlayır. Əgər parametrlər yoxdursa skript istifadəçiyə forma yerləşdirilmiş HTML-səhifəni, parametrlər göndərilibsə gördüyü işin nəticəsini qaytarır. Bu həm də ona görə rahatdır ki, bu üsulla istifadəçidən məlumatları məsələn, adını mütləq daxil etməsini təkidlə istəmək olar. Yəni əgər istifadəçi məlumatı daxil etməyi unudarsa ona adı daxil etmək üçün olan xanının qarşısında “Zəhmət olmasa, adınızı daxil edin.” yazısı ilə elə həmən forma qaytarılacaq.

Ümumiyyətlə HTML dili ilə, xüsusi ilə də formalarla əlaqəli bütün teq – elemetnlərə nəzər salmağınız, hansının nə xüsusiyyətə malik olduğunu araşdırmağınız düzgün olar. Növbəti mövzuda HTML dilinin dərinliklərinə demək olar ki, çox az yer veriləcək və daha çox PHP skript dilində proqramlaşdırmaya aid mövzulara toxunulacaq.

POST metodu

Post metodunun mənasını tam aydınlaşdırmağa yaxınlaşırıq. Əvvəlki misalımızda GET əvəzində POST yazsaq və sonuncu başlıqdan (nn markerindən) sonra hər hansı məlumatları ötürsək nə baş verər? Bu halda server bu məlumatları olduğu kimi qəbul edib skriptə ötürəcək. Bu halda mütləq Content-length başlığını da məlumatların ölçüsünə uyğun qeyd etmək lazımdır. Məsələn:

POST /script.cgi HTTP/1.1n
Host: example.com
Content-length: 5n
n
Test!

Server başlıqların sonunu bildirən işarədən sonra məlumatların tam göndərilməsini gözləmədən sorğunu emal etməyə başlayacaq. Başqa sözlə nn işarələrinin göndərilməsindən dərhal sonra skript işə düşəcək və 5 baytlıq Test! sözünün gəlib-gəlməməsini gözləmək artıq onun işinə çevriləcək.

Sonuncu qeyd etdiyimizdən belə çıxır ki, serverə POST-la göndərilən məlumatlar (həmçinin bəzi başlıqlar) maraqlı deyil və server onları bütövlükdə skriptə ötürür. Başqa bir sual meydana çıxır. Məlumatların göndərilməsinin bitdiyini skript necə başa düşəcək? Daha doğrusu, skript brauzerdən gələn məlumatları oxumağı nə vaxt dayandıracaq? Bu məsələdə ona CONTENT_LENGTH mühit dəyişəni kömək edir. Qarşıda bu mexanizmi daha dəqiq aydınlaşdıracağıq.

Post metodu nəyə lazımdır? POST metodu əsasən böyük həcmli məlumatların ötürülməsi üçün lazımdır. Məsələn faylların Veb vasitəsilə serverə ötürülməsi, yüklənməsi və ya böyük formaların emalı zamanı mütləq POST metodundan istifadə edilir. Bundan başqa POST metodundan estetik məqsəd üçün də istifadə edirlər. İş orasındadır ki,  GET metodunun tətbiqi zamanı skriptin URL-i müəyyən qədər uzun və oxunaqsız olur. POST sorğuda isə URL dəyişməz olaraq qalır. Əvvəlki mövzularda qeyd edilmişdir ki, həm GET həm də POST metodlarında verilənlər URL formatında kodlanmış ötürülür. Bunun nə olduğunu aydınlaşdıraq.

Maraqlıdır ki, e-maildən başlayaraq Vebə kimi bütün internet servislər nə üçünsə 127-dən çox olan baytları “xoşlamırlar”. Buna görə də 0-32 və 128-256 diapazonuna daxil bütün simvollar mürəkkəb üsulla yenidən kodlaşdırılaraq URL-kodlaşdırma formasına gətirilir. Çox güman ki, bu, qədimi, demək olar ki artıq istifadə edilməyən proqramlarla işləyə bilmək qabiliyyətini saxlamaq üçün atılan xoşagəlməz addımdır. Məsələn Azərbaycan əlifbasının kiçik ə hərfi %C9%99 formasına çevrilir. Bundan əlavə boşluq – probel – işarəsi bu kodlaşdırmada “cəm işarəsi” (+) formasında göstərilir. Nəticədə verilənlərin həcmi bir neçə dəfə şişirdilmiş olur. Bütün bunları nəzərə alaraq demək olar ki, proqramlar hər an məlumatı uyğun olaraq hər iki tərəfə kodlaşdırmağa hazır olmalıdırlar.

CGI interfeysi və HTTP protokolu

CGI (Common Gateway Interface) dedikdə Veb-serverlərin Veb-proqramların işləməsi zamanı riayət edilməli olduğu razılaşmalar toplusu nəzərdə tutulur. Hal-hazırda praktiki olaraq CGI ilə birlikdə onun daha sürətli və təhlükəsiz variantı olan FastCGI-dan istifadə edilir. Aşağıda deyiləcək mülahizələr bunların hər iki üçün doğrudur.

CGI nədir

Brauzerin adres yerində http://site.com/path/to/image.jpg kimi URL yazırıq və hər hansı HTML səhifənin və ya başqa formada məsələn, şəkil açılacağını gözləyirik. Başqa sözlə desək biz düşünürük ki, hostda /path/to/ kataloqunda image.jpg faylı yerləşdirilib və brauzerə ötürüləcək.

Əslində isə məsələ bir az fərqlidir. Burda iki hal ola bilər:

  • Server administratorunun serverdə istənilən obyektə alias yaratmaq imkanı olduğundan hostda /path/to/ yolu, eyni ilə də image.jpg faylı ümumiyyətlə mövcud olmaya bilər və ya heç bir alias yaratmadan Veb-serverdə proqram yazaraq hər belə müraciəti “tutaraq” lazımi reaksiyanı vermək olar.
  • image.jpg ümumiyyətlə qrafik fayl olmaya bilər. Bunun əvəzinə o,  bizim sorğumuz nəticəsində sürətlə işə düşüb lazımi komandaları yerinə yetirərək nəticəsini HTML və ya digər məsələn, şəkil formatında istifadəçiyə qaytaran proqram ola bilər. İstifadəçi ümumiyyətlə nəyin baş verdiyini başa düşməyəcək. Onun üçün şəkli yükləməklə hər hansı proqramı işə salmaq arasında heç bir fərq olmayacaq. Hətta demək olar ki, istifadəçi əslində nə baş verdiyini heç cürə bilə bilməz.

Sonuncu bənd daha möhtəşəm səslənir. Əgər bunun ideyasını başa düşə bildinizsə deməli, artıq ümumi olaraq CGI-ın nə olduğunu başa düşmüsünüz. Ənənəvi olaraq, CGI razılaşması ilə işləyən proqramlar skript (Ingilis dilində script) adlandırılır. Daha doğrusu bir çox halda bu proqramları Basic, Pyton və ya PHP kimi interpretator dillərində yazıldığı üçün belə adlandırırlar.

Deyilənləri ümumiləşdirsək görürük ki, xüsusi halda səhifələri “iş vaxtı” formalaşdıra bilən güclü mexanizm əldə etmiş olduq. Məsələn, deyək ki, bizə hər hansı bir sənəddə hal-hazırki tarixin yazılması lazımdır. Aydındır ki, istifadəçinin sənədi yükləyəcəyi tarix müxtəlif ola biləcəyindən bunu əvvəlcədən sənəddə yazmaq mümkün deyil. Ancaq, biz tarixi hesablayıb sənəddə yaza bilən və nəticəni istifadəçiyə ötürə bilən skript yaza bilərik. İstifadəçi öz növbəsində heç nə hiss etməyəcək.

Yuxarıda göstərilən modeldə çatışmayan bir məsələ var. Doğrudan da, fərz edək ki, bizə səhifəmizdə saat qurşağından asılı olaraq saat göstərilməsi lazımdır. Skript istifadəçinin hansı saat qurşağında olduğunu və ya istifadəçidən alınması lazım olan hər hansı məlumatı neçə əldə edəcək? Deməli, istifadəçiyə məlumatları əldə etməyə imkan verməklə yanaşı onları həmçinin serverə ötürə bilən mexanizm də olmalıdır (bizim halda Bakıya nəzərən zaman fərqini). Bu məsələni də CGI həll edə bilir.

Yadınızdadırsa əvvəlki mövzularda URL-in quruluşu haqqında danışmışdıq. Bütün bu danışılanlar onun xüsusi formasına aid idi. Əslində URL daha üzün formaya malikdir.
http://site.com/path/to/image.jpg?parameters

Göründüyü kimi, URL-in sonunda sual – ? – işarəsindən sonra əlavə parameters yazısı, sətri də mövcud ola bilər. Müəyyən dərəcədə bu, əməliyyat sistemində kommand layn – əmr sətrinə bənzəyir. Onun uzunluğu istənilən qədər ola bilər və daxilində istənilən məlumat yerləşdirilə bilər (bəzi simvolların URL formatında kodlaşdırılmasını nəzər almaq şərti ilə). Məhs bu sətir CGI-skriptə ötürülür.

Əslində parametrlər sətrinin uzunluğuna müəyyən məhtudiyyət var, ancaq bu məhtudiyyətlə praktikada çox az hallarla qarşılaşdığından onun haqqında nadir hallarda danışılır. Brauzer üçün URL çox uzun olarsa bunu çox sadə hiss etmək olur, həmin link-keçid qeyri-aktiv olur və ona “klik” etmək olmur.

Yuxarıdakı məsələyə qayıdaq. İndi istifadəçi öz saat qurşağını göstərə bilər. Bunu belə etmək olar:
http://site.com/script.cgi?time=+5&name=Tural

Belə təsfir zamanı parametrləri ampersand – “&” – işarəsi vasitəsilə ayırmaq qəbul edilmişdir. Brauzerlər formaların emalı zamanı məhz buna uyğun işlədiklərinə görə biz də irəlidə bu cür razılaşmaya uyğunlaşacağıq. Skript də öz növbəsində bu parametrlərə adekvat reaksiya verməlidir: sətri tərkibinə görə hissələrinə ayırmalı, dəyişənləri yaratmalı və s.

Skriptə göndərilən məlumatlar URL-in əmr sətrinə yerləşə bilirsə və bu üsulla göndərilirsə buna GET metod deyilir. Faktiki olaraq, hətta heç bir parametr ötürülmürsə belə (məsələn, səhifənin açılması zamanı) GET metodu tətbiq edilmiş olur. Bu metoddan başqa onun qədər çox istifadə edilən POST metodu da mövcuddur.