• Nem Talált Eredményt

2. Lecke: Webalkalmazások elemei és működésük

2.3 A http-üzenetek fölépítése

A webprogramozás szempontjából talán a HTTP a web legfontosabb alap-eleme. A szerver és kliens közötti üzenetváltások lehetséges tartalma, az üzene-tek fölépítése fontos lehet a web programozásban, ezért vizsgáljuk meg kicsit részletesebben a HTTP üzenetek fölépítését.

A HTTP protokollnak eddig három verziója (0.9, 1.0, 1.1) látott napvi-lágot. Jelenleg természetesen az 1.1 van érvényben, de az egysze-rűbb megértés kedvéért az 1.0-s verziót nézzük meg.

A HTTP üzentek a kliens által küldött kérések és a szerver által visszakül-dött válaszok lehetnek. Mindkét üzenettípus alapvetően két részre, fejlécre és üzenettestre tagolódik.

2.3.1 A HTTP kérés formátuma

A kapcsolat fölépítése mindig a kliens kérésével indul. A kérés fejléce egy, vagy többsoros szöveg, amelynek sorait mindig kocsi vissza-soremelés (CRLF) karakter zárja.

Az üzenet kötelező, első sora az úgynevezett kéréssor, amelyet nulla vagy több, úgynevezett header sor követhet. Minden header sor egy fejlécmező-t tartalmaz. Az üzenet fejlécét, és az azután következő üzenettestet, üres sor (CRLF) választja el.

A kérés általános formátuma az alábbi:

1 kéréssor<CRLF>

A kéréssor tudatja a szerverrel, hogy mit kér tőle a kliens. Első eleme egy metódus, melyet egy URL-cím, majd a HTTP protokoll verziószáma követ. A sor formátuma a következő:

1 metódus URL-cím HTTP/verzió

 A metódus GET, POST, vagy HEAD szavak valamelyike lehet. A GET egy fájl, a HEAD pedig a fájlról szóló információk visszaküldését kéri

szerver-től. A POST arról tájékoztatja a szervert, hogy az üzenettestben valami-lyen, a szerveroldali programnak szóló adatok találhatók.

 Az URL-cím a GET vagy HEAD esetén a kért fájl URL-címe, POST esetén az az állomány, ami feldolgozza a küldött adatokat.

 A verzió pedig a HTTP protokoll kliens által használt verziójának száma (0.9, 1.0, 1.1).

Az alábbi példáinkban közvetlenül HTTP üzenetek segítségével kommunikáltunk a 192.168.1.6 című hoston futó, 80-as portot figye-lő web-szerverrel. Feltételezzük, hogy a szerver főkönyvtárában két állomány az index.html nevű weblap és a calc.php nevű PHP-program található.

Az üzenetküldéshez a PuTTY nevű alkalmazást használtuk. A PuTTY SSH-kliens, de ügyfélként is konfigurálható. A Telnet-kliensként a felhasználó által begépelt karaktereket egy előre beállí-tott host meghatározott portjára küldi, majd megjeleníti a válasz-ként érkező karaktereket. Mivel a webszerverek alaphelyzetben a 80-as portot figyelik, példáinkhoz úgy konfiguráltuk a PuTTY-ot, hogy a begépelt karaktereket a 192.168.1.6 címen működő gép 80-as portjára, azaz a hoston futó web-szervernek küldje el. Ezekkel a be-állításokkal a PuTTY kiválóan alkalmas a HTTP üzenetek tesztelésére.

3. ábra HTTP üzenetek

A fenti ábra „Kérés” feliratú sora (zölddel jelölve) GET metódussal kéri a 192.68.1.6 host webszerverétől a főkönyvtár index.html nevű állományát. A

32 Webalkalmazások elemei és működésük

kliens a HTTP 1.0 verzióját használja. A kérés nem tartalmaz sem header soro-kat, sem üzenettestet.

2.3.2 A HTTP válasz

A fenti ábra lila színnel jelzett részei az alábbi kérésre érkező válaszüzene-tet mutatják:

GET http://192.168.1.6 /index.html HTTP/1.0 A szerver válasza is fejlécből és üzenettestből áll. A fejléc a válaszsorral kezdődik, amit kocsivissza-soremelés (CRLF) karakter zár. A válaszsort tetszőle-ges számú CRLF-karakterrel záródó, és fejlécmezőket tartalmazó header sor követheti. A visszaküldött adatokat tartalmazó üzenettestet most is üres sor (CRLF) választja el a fejléctől.

A válaszsor a szerver által használt protokollverzióval kezdődik (HTTP/1.1), amit a kérés teljesítésének sikerét jelző válaszkód (200) és az ahhoz tartozó üzenet (OK) követ.

A válaszsor után a fejlécmezők következhetnek. Ezek a serverről és a visz-szaküldött adatokról tartalmaznak információkat, és mindig név:érték formá-tumúak.

A fenti ábra Server: Apache/2.2.21 (Win32) PHP/5.3.9 fej-lécmezője például a webszerver adatait, a Date a kérés teljesítésének időpont-ját, a Last-Modified a kért fájl utolsó módosításának időpontidőpont-ját, az ETag a fájl ellenőrzőösszegét, a Content-length a válasz hosszát, az Accept-Ranges az előző érték mértékegységét, a Content-Type pedig az adatok típusát adja meg. A Connection mező jelzi, hogy a szerver le is zárta a kap-csolatot.

A Content-type fejlécmező szerepe nagyon fontos, hiszen a kliens eb-ből tudja, hogy milyen adatot kapott az üzenettestben. Ettől függ, hogy hogyan kell feldolgoznia a kapott adatokat.

4. ábra Feltételes kérés

A fenti ábra szintén egy kérés-válasz párt mutat. A kérés fejlécben most ta-lálunk egy fejlécmezőt is (If-Modified-Since: Tue, 10 Jul 2012 17:00:00 GMT), ami arra szólítja föl a szervert, hogy csak akkor küldje vissza a kért fájlt, ha az 2012.07.10 17:00:00 óta megváltozott. A szerver a válaszsor-ban jelzi, hogy az index.html nem módosult ezért a válasz nem tartalmaz vá-lasztestet, csak fejlécmezőket.

5. ábra Információkérés

Az ezen az ábrán látható példában csak a megadott fájlról szóló informáci-ókat kérünk, a dokumentumot nem akarjuk letölteni. A válasz tehát csak fej-lécmezőket tartalmaz, üzenettestet nem.

6. ábra POST kérés

A fenti példa egy POST kérést tartalmaz. Figyeljük meg, hogy az URL-címben most nem egy weblap, hanem egy PHP kódot tartalmazó programfájlt jelöltünk meg (calc.php). Ennek kell majd feldolgoznia a POST-tal küldött adato-kat. A kérés üzenettestében két változót és értéküket (a=3; b=4) küldjük el a szervernek. A Content-length üzenetmező a küldött üzenettest hosszát, a Content-type pedig az adattípust jelzi. Utóbbira azért van szükség, hogy a szerver tudja, miként kell feldolgoznia az adatokat. Mint tudjuk, a HTTP általá-nos protokoll, az üzenettestben bármilyen adat elhelyezkedhet. Az application/x-www-form-urlencoded érték jelzi, hogy egy weboldal űrlapjáról származó URL-kódolással leírt változók találhatók az üzenettestben.

34 Webalkalmazások elemei és működésük

A kapott adatokat a szerver átadja a calc.php fájlban lévő PHP-programnak, amely feldolgozza azokat ($c=$a+$b;), és valamilyen kimenetet állít elő (echo("{$a}+{$b}={$c}");). A szerver válassza most nem egy előre elkészített és a szerveren tárolt weblap, hanem a PHP-program által előál-lított kimenet lesz.

A calc.php tartalmát az alábbi sorok mutatják be

<?php

$c=$a+$b;

echo("{$a}+{$b}={$c}");

?>

A PHP programozási nyelvről később tanulunk, az itt leírtak csak a példaként szolgálnak. Ha nem pontosan érti a kódot, ne bosszankod-jon, később mindenről részletesen beszélni fogunk!

Elég elfogadnia, hogy a program fogadja a POST kéréssel feltöltött változókat, kiszámolja összegüket amit a $c változóba helyez, majd egy szöveget küld vissza, amelybe behelyettesíti az $a, $b és $c vál-tozók értékét.

A PHP programozási nyelvben a változóneveket $ jel előzi meg.

A fenti példaprogram csak akkor működik, ha a PHP konfigurációs fájljában On értékre állítjuk a register_globals direktívát, ami biztonsági okokból alapértelmezésként Off értékű.