Před více než rokem byl na intervalu uveřejněn článek „Stavové kódy a hlášení v odpovědi protokolu HTTP“>, ve kterém byla sice stručně popsaná celá komunikace mezi klientem a serverem, ale jeho hlavní část byla věnována odpovědím protokolu (serveru). Dnes se zaměříme i na druhou stranu komunikace, na požadavky protokolu HTTP.

Základní rysy protokolu HTTP

K úplnému pochopení článku budeme muset znát už trochu více základní rysy HTTP, a jak tento protokol vlastně pracuje (znalost předchozího článku také pomůže). Protokol HTTP je protokolem aplikační úrovně pro distribuované hypermediální informační systémy. V praxi to znamená, že tento protokol se obecně na internetu používá nejen pro přenos dat mezi klientem a serverem, ale i pro mnoho dalších úloh. Protokol HTTP je bezstavový, tj. že nerozpoznává klienty, od nichž chodí požadavky. Pokud jeden klient odešle požadavek a vzápětí ten stejný klient odešle další požadavek, server nepozná, že jde o stejného klienta.

HTTP existuje ve 3 verzích a to 0.9, 1.0 a 1.1 . První z nich, označována za HTTP/0.9 existovala jako jednoduchý protokol, který uměl v omezené podobě přenášet data na internetu. Verzí HTTP/1.0 nabyl protokol možnosti přenášení informací ve formátu MIME, takže mohl obsahovat i metainformace o přenášených datech. Nejpodstatnějším vylepšením protokolu verzí HTTP/1.1, což je zároveň poslední, aktuální verze, bylo to, že všechna spojení se stala trvalými. To znamená, že se spojení uzavře až když jeden z dvojice klient-server odešle hlavičku pro uzavření. Dříve HTTP uzavíralo spojení po každé odpovědi serveru. Tímto vylepšením se také nesrovnatelně zvýšila rychlost přenosu, protože server už pro každý obrázek, rám a applet nemusí otevírat nové spojení.

Formát požadavku protokolu HTTP

Požadavek protokolu HTTP má následující formát:

METODA URL-DOKUMENTU VERZE-HTTP
HLAVIČKY
prázdný řádek
DALŠÍ-DATA     Pouze u metody POST

Metoda požadavku značí způsob, jakým má server požadavek zpracovat. O metodách si více povíme později. Hlavičky se odesílají v následujícím formátu:

JMÉNO-HLAVIČKY: HODNOTA-HLAVIČKY

Každá hlavička musí být na samostatném řádku. Všechny řádky musí být ukončeny sekvencí znaků CRLF (\r\n). Na konci všech hlaviček musí následovat prázdný řádek, i kdyby za ním už neměla být žádná data.

Požadavky se v PHP odesílají přes tzv. sockety. Socket je v podstatě jakési spojení mezi serverem a klientem. Abychom s nimi mohli pracovat, musíme takový socket nejdříve otevřít. K tomu slouží funkce fsockopen:

fsockopen(server, port);
Příklad:
$sock = fsockopen("www.interval.cz", 80);

Socket máme otevřený, můžeme odeslat svůj požadavek pomocí funkce fputs:

fputs(socket, požadavek);
Příklad:
fputs($sock, "GET /index.html HTTP/1.1\r\nHost: www.interval.cz\r\n\r\n")

Více v PHP již není třeba, pojďme se podívat na metody požadavku HTTP

Metody požadavku protokolu HTTP

V HTTP/1.1 existuje sedm základních metod požadavků HTTP:

  • GET
  • POST
  • HEAD
  • OPTIONS
  • PUT
  • DELETE
  • TRACE

Za každým požadavkem ještě mohou následovat jednotlivé hlavičky. Ve verzi HTTP 1.1 je v každém požadavku povinná hlavička Host, která specifikuje hostitele. Po hlavičkách (jak už jsem psal) musí následovat prázdný řádek.

Metooda GET

Metoda GET je ta nejjednosušší a patří mezi základní. Prakticky pokaždé, když načítáte stránku ze serveru a neodeslali jste předtím formulář s metodou POST, používá se k obdržení stránky ze serveru právě tato metoda. Výsledkem je tudíž stránka a její hlavičky, na kterou se pomocí metody ptáme. Formát této metody je následující:

GET URL-STRÁNKY VERZE-PROTOKOLU
HLAVIČKY
prázdný řádek
Příklad:
GET /index.asp HTTP/1.1
Host: www.interval.cz
prázdný řádek

Metoda POST

Metoda POST funguje v podstatě sejně jako metoda GET, ale u POST máte možnost za hlavičkami (a prázdným řádkem) poslat skriptu data. Touto metodou se např. odesílají data z formuláře s metodou POST. Formát tohoto požadavku je následující:

POST URL-STRÁNKY VERZE-PROTOKOLU
HLAVIČKY
prázdný řádek
DATA Z FORMULÁŘE
Příklad:
POST /zpracujdata.php HTTP/1.1
Host: www.formulare.cz
Content-Length: 29
Content-Type: application/x-www-form-urlencoded
prázdný řádek
pole1=hodnota1&pole2=hodnota2

U této metody nám přibyly některé hlavičky, o kterých jsem se předtím nezmínil. Content-Length značí, jak dlouhá jsou data z formuláře (v bytech) a Content-Type: application/x-www-form-urlencoded značí MIME typ dat z formuláře.

Metody HEAD, OPTIONS, PUT, DELETE, TRACE

Pokud zrovna neprogramujete internetový prohlížeč (a v PHP asi ne), pravděpodobně se s těmito metodami nikdy nesetkáte. Takže pouze stručně uvedu jejich význam v tabulce:

Metoda Popis
HEAD Metoda HEAD funguje prakticky stejně jako GET, ale HEAD nevrací tělo stránky, pouze hlavičky. Toho se např. využívá při zjišťování, jestli se stránka od posledního požadavku změnila.
OPTIONS Používá se pro dotaz na možnosti serveru
PUT Funguje jako GET, ale uchovává tělo požadavku na místě daném požadovaným URL. Podobně jako odesílání souborů přes FTP.
DELETE Odstraňuje dokument ze serveru. Dokument, který má být odstraněn, je dán URL požadavku.
TRACE Používá se pro sledování požadavku přes všechny proxy servery a firewally, přes které požadavek jde. Podobá se nástroji TraceRoute.

Praktické použití požadavků HTTP v PHP

V této poslední části článku vám předvedu praktické použití metod GET a POST v PHP. Uvidíte, jak celou stránku dostat do jedinné proměnné s metodou GET a POST.

Jak dostat celou stránku do jedinné proměnné s metodou GET

$sock = fsockopen("www.interval.cz", 80);   // otevření socketu
fputs($sock, "GET /index.asp HTTP/1.1\r\nHost: www.interval.cz\r\n\r\n");   // pošleme požadavek
$page = "";
while ($line = fgets($sock, 128)):   // postupně načteme všechny řádky ze stránky
  $page .= $line;   // a uložíme si je do proměnné
endwhile;
// odstraníme hlavičky
$page = strstr($page, "\r\n\r\n");
$page = substr($page, 4, strlen($page) – 4);

Skript využívá metody GET k získání požadované stránky. Smyčka while načte řádek po řádku do proměnné $page a nakonec odstraníme hlavičky. Pokud stránce budete chtít poslat nějaká data, můžete to udělat přes url ve formátu /index.asp?pole1=hodnota1&pole2=hodnota2….

Jak dostat celou stránku do jedinné proměnné s metodou POST

Pokud chcete stránce poslat nějaká větší data, stává se URL (a tudíž i celá metoda GET) nepoužítelným. Pak raději použijte metodu POST:

$sock = fsockopen("www.interval.cz", 80);   // otevření socketu
$message = "pole1=hodnota1&pole2=hodnota2"   // tělo zprávy – data
fputs($sock, "POST /index.asp HTTP/1.1\r\nHost: www.interval.cz\r\nContent-Length: ".strlen($message)."\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n$message\r\n\r\n");   // pošleme požadavek
$page = "";
while ($line = fgets($sock, 128)):   // postupně načteme všechny řádky ze stránky
  $page .= $line;   // a uložíme si je do proměnné
endwhile;
// odstraníme hlavičky
$page = strstr($page, "\r\n\r\n");
$page = substr($page, 4, strlen($page) – 4);

Související články

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět