Požadavky protokolu HTTP a jejich zpracování v PHP
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.
Mohlo by vás také zajímat
-
Landing page: Jak vytvořit landing page s vysokým CTR
7. května 2024 -
Webdesign: Jak optimalizovat tlačítka na webu
7. března 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024