Jiří Kosek ml.
V minulém dílu našeho seriálu jsme probírali základní vlastnosti hypertextového přenosového protokolu a nejstarší verzi 0.9. Podívejme se nyní, jak vypadá komunikace klienta a serveru ve verzích novějších.
HTTP verze 1.0
V této verzi protokolu HTTP je syntaxe požadavku klienta již o něco složitější:
metoda cesta_k_dokumentu HTTP/1.0
hlavičky
prázdná_řádka
Nejpoužívanější metodou je GET -- ta slouží k získání daného dokumentu ze serveru. Další 2 metody, které můžeme použít, jsou HEAD a POST. První z nich zašle pouze hlavičky, které obsahují různé metainformace o dokumentu -- např. datum poslední modifikace apod. Metoda POST slouží k odeslání dat z formuláře na server. V tomto případě za prázdnou řádkou obsahuje požadavek ještě hodnoty jednotlivých polí formuláře.
Hlavičky slouží pro přenos různých doplňujících informací. Každá hlavička je na samostatné řádce a má tvar jméno_hlavičky: hodnota. Význam jednotlivých hlaviček popíšeme později. Jejich použití je nepovinné a proto nejjednodušší požadavek v HTTP/1.0 vypadá takto:
GET /~krystof/linky.html HTTP/1.0
prázdná_řádka
Odpověď má v HTTP/1.0 také odlišný formát. Nesestává pouze ze samotného obsahu zasílané stránky, ale obsahuje i mnoho důležitých a užitečných informací.
HTTP/1.0 stavový_kód stavové_hlášení
hlavičky
prázdná_řádka
obsah_odpovědi
Stavový kód je třímístné číslo, které indikuje, jak se povedlo uspokojit požadavek. Přehled stavových kódů je uveden v tabulce 1.
Stavové hlášení je slovní popis stavového kódu, který je pro člověka přece jen srozumitelnější. Pokud vše proběhlo v pořádku, měla by první řádka odpovědi vypadat následovně:
HTTP/1.0 200 OK
Tab. 1: Stavové kódy a hlášení HTTP/1.0
Kód | Popis |
1xx | Informační kódy (nepoužívá se) |
| |
2xx | Úspěšné vyřízení požadavku |
| |
200 OK | Požadavek byl úspěšně zpracován |
201 Created | Výsledkem požadavku je nově vytvořený objekt |
200 Accepted | Požadavek byl přijat, ale dosud není zpracován |
200 No content | Požadavek byl úspěšně zpracován, ale jeho výsledkem nejsou žádná data pro klienta |
| |
3xx | Přesměrování |
301 Moved Permanently | Požadovaný objekt byl trvale přemístěn na jinou adresu |
302 Moved Temporarily | Požadovaný objekt byl dočasně přemístěn na jinou adresu |
304 Not Modified | Objekt nebyl změněn (odpověď při podmíněném požadavku pomocí hlavičky If-Modified-Since) |
| |
4xx | Chyba klienta |
400 Bad Request | Špatná syntaxe dotazu |
401 Unauthorized | Objekt je dostupný pouze po autorizaci |
403 Forbidden | Požadavek je v pořádku, ale server nemá povoleno jej vykonat |
404 Not Found | Požadovaný objekt nebyl na serveru nalezen |
| |
5xx | Chyba na straně serveru |
500 Internal Server Error | Serveru se něco stalo a nemůže vyplnit požadavek |
501 Not Implemented | Server nepodporuje metodu uvedenou v požadavku |
502 Bad Gateway | Server, pracující jako gateway, dostal špatnou odpověď od dalšího serveru |
503 Service Unavailable | Služba je nedostupná (přetížení, údržba serveru) |
HTTP verze 1.1
Struktura požadavku i odpovědi zůstává u nejnovější verze HTTP stejná jako u verze 1.0. Přidány jsou však nové hlavičky a některé z nich jsou nyní i povinné.
Předchozí verze protokolu HTTP vytvářely pro každý objekt nové spojení a poté jej pomocí HTTP přenesly. Pokud tedy např. HTML stránka obsahovala 4 obrázky, pro její stažení bylo potřeba navázat 5 spojení (1 stránka + 4 obrázky). Navázání spojení je však náročné jak na čas, tak na přenosovou kapacitu sítě. HTTP/1.1 proto spojení mezi klientem a serverem po vyřízení požadavku neuzavírá, ale umožňuje jej použít pro přenos více objektů. Tím dochází k ušetření času potřebného k přenosu webovských stránek. Spojení může ukončit klient nebo server tím, že do požadavku/odpovědi zařadí hlavičku Connection: close.
V každém požadavku, který vyhovuje standardu HTTP/1.1, musíme použít hlavičku Host. Jako hodnota se uvádí doménové jméno serveru, ze kterého požadujeme stránku. Nejjednodušší požadavek pak vypadá takto
GET /~krystof/linky.html HTTP/1.1
Host: www.server.cz
prázdná_řádka
Použití této hlavičky je povinné kvůli tzv. virtuálním serverům.
Dnes je na Internetu běžné, že poskytovatelé připojení umožňují na svých serverech vystavovat stránky svým zákazníkům. Jako službu nabízejí i umístění stránek na adrese typu http://www.firma.cz místo obvyklého http://www.poskytovatel.cz/firma. Samozřejmě, že poskytovatel na jednom serveru (počítači) vystavuje stránky několika firem. Problém je však v tom, že server má obvykle jen jednu IP adresu, ke které se připojují klienti.
Prohlížeč se tedy připojí k serveru na port 80 a v požadavku HTTP/1.0 pošle pouze cestu k dokumentu. Server nemá šanci zjistit, z kterého virtuálního serveru je dokument požadován. Tato situace se řešila přiřazením několika IP adres jednomu počítači. Pro každý virtuální server musela existovat jedinečná IP adresa. V tomto případě již server podle IP rozhraní, ke kterému se prohlížeč připojil, mohl určit virtuální server, na který požadavek směřuje.
Toto ne příliš elegantní řešení zbytečně plýtvalo IP adresami a kladlo zvýšené požadavky na konfiguraci serveru při přidání nového virtuálního serveru. Tím, že požadavky HTTP/1.1 obsahují jméno serveru, odpadá potřeba zřizování nové IP adresy pro každý virtuální server. Na jedné IP adrese nyní může být přístupný neomezený počet virtuálních serverů. Jediným háčkem jistě elegantního řešení problému je fakt, že starší prohlížeče nepodporují tuto novou verzi HTTP.
HTTP/1.1 přidává i několik nových metod požadavků. Pro potřeby pohodlného publikování na Webu jsou to především metody PUT a DELETE. První z nich slouží k uložení zaslaného objektu (nejčastěji HTML stránky) na dané URL. HTML editor tak může přímo na webový server uložit nově vytvořenou nebo modifikovanou stránku, aniž by se o to musel snažit uživatel sám například pomocí FTP. Metoda DELETE slouží k odstranění stránky ze serveru. Další metody -- TRACE, CONNECT a OPTIONS -- slouží k zjišťování, analyzování a nastavení způsobu spojení.
Nejpoužívanější hlavičky
Verze protokolu HTTP 1.0 definovala 17 hlaviček. HTTP/1.1 tento počet ještě zvětšil. My si stručně objasníme význam nejdůležitějších hlaviček.
Content-Type
Tato hlavička udává typ přenášených dat. Typ dat se zapisuje pomocí MIME konvence. Pro HTML stránky máme typ text/html, pro obyčejný text text/plain, obrázky mají podle použitého formátu jeden z typů image/gif, image/jpeg nebo image/png. Podle typu dat prohlížeč pozná, jak příchozí data interpretovat. HTML stránka, zasílaná prohlížeči jako odpověď, proto mezi hlavičkami obsahuje následující řádku
Content-Type: text/html
Location
Tato hlavička obsahuje adresu dokumentu, který byl přesunut. Hlavičku server posílá v případech, kdy stavový kód požadované operace začíná na 3. Prohlížeč většinou automaticky nahraje stránku, na kterou Location ukazuje. Jako adresu je potřeba uvést úplné absolutní URL. Např.
Location: http://manes.vse.cz/~xkosj06/index.html
If-Modified-Since
Pokud v požadavku použijeme tuto hlavičku společně s nějakým datem, server nám požadovaný objekt vrátí pouze, pokud byl od zadaného data změněn. Řekněme, že chceme získat dokument pouze za předpokladu, že se změnil od 30. března 1998. Použijeme hlavičku
If-Modified-Since: Mon, 30 Mar 1998 12:00:00 GMT
User-Agent, Server
V hlavičce User-Agent posílá prohlížeč svoji identifikaci -- obvykle své jméno, číslo verze a platformu, na které je spuštěn. Server naopak obsahuje identifikaci serveru, který vyřídil požadavek. Příklady:
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)
Server: Apache/1.3b3