|
| 1 | +# HTTP – Jak funguje Internet |
| 2 | + |
| 3 | +Než začneme pracovat s internetem – ať už tvorbou vlastních stránek, nebo |
| 4 | +komunikací s existujícími službami, pojďme si přiblížit, co vlastně ten |
| 5 | +internet je a jak funguje. |
| 6 | + |
| 7 | +Internet je celosvětová síť počítačů. |
| 8 | +Je to spousta laptopů, stolních počítačů, malých blikajících krabiček |
| 9 | +i obrovských blikajících skříní, které jsou navzájem propojeny pomocí |
| 10 | +kabelů (nebo i bezdrátově). |
| 11 | + |
| 12 | +Samozřejmě není každé zařízení propojené s každým jiným zařízením – tolik |
| 13 | +kabelů by se na Zemi těžko vešlo. |
| 14 | +Spousta zařízení – hlavně tzv. *routery* a *switche* – ale umí přeposílat |
| 15 | +zprávy mezi sebou tak, že každý počítač může komunikovat s každým |
| 16 | +jiným počítačem. |
| 17 | +(Aspoň teoreticky – reálně je komunikace omezená např. kvůli bezpečnosti.) |
| 18 | + |
| 19 | +Funguje to podobně jako pošta: když pošlu balíček z Brna do Melbourne, |
| 20 | +nedostane se tam přímo. |
| 21 | +Balíček poputuje třeba vlakem do Prahy, pak letadlem do hlavní pošty |
| 22 | +v Austrálii a odtud náklaďákem do Melbourne, kde ho doručovatel donese až |
| 23 | +k domu příjemce. |
| 24 | +A k naplánování celé téhle cesty stačí napsat na obálku krátkou adresu. |
| 25 | + |
| 26 | +Podobně cestují informace v internetu: z laptopu přes Wi-Fi do *routeru*, |
| 27 | +odtud kabelem k poskytovateli připojení, tlustším kabelem do české |
| 28 | +„páteřní sítě“, podmořským kabelem třeba do Ameriky… a nakonec k počítači, |
| 29 | +se kterým jsem chtěl komunikovat. |
| 30 | + |
| 31 | +Většinou můj laptop takhle komunikuje se *serverem*, počítačem, který |
| 32 | +se stará o sdělování informací. |
| 33 | +Každou webovou stránku spravuje takový server. |
| 34 | + |
| 35 | +## Webové adresy |
| 36 | + |
| 37 | +Jak taková komunikace vypadá si ukážeme na příkladu – |
| 38 | +co se stane, když do prohlížeče zadám tuhle adresu: |
| 39 | + |
| 40 | +```plain |
| 41 | +http://naucse.python.cz/lessons/fast-track/http/ |
| 42 | +``` |
| 43 | + |
| 44 | +Taková webová adresa – technicky zvaná URL (*Uniform Resource Locator*, |
| 45 | +„jednotná adresa zdroje“) přesně určuje, jak se má prohlížeč dostat |
| 46 | +k informacím, které má zobrazit. |
| 47 | + |
| 48 | + |
| 49 | +Začátek adresy, `http://`, je jméno *protokolu* (angl. *protocol name*). |
| 50 | +Protokol určuje způsob, *jak* se k daným informacím dostat. |
| 51 | +Protokolů existuje spousta, každý funguje trochu jinak a každý se používá |
| 52 | +na něco jiného: |
| 53 | +SMTP a POP pro e-mail, FTP pro přenos souborů, SSH pro ovládání počítačů. |
| 54 | +My se teď ale zaměříme na HTTP, který se typicky používá pro webové stránky. |
| 55 | + |
| 56 | + |
| 57 | +Další část adresy, `naucse.python.cz`, je *jméno serveru* (angl. *server name*). |
| 58 | +Říká, *kde* prohlížeč najde dané informace. |
| 59 | + |
| 60 | +Jméno serveru je jako poštovní adresa – existuje počítač, který se jmenuje |
| 61 | +`naucse.python.cz`, a každý internetový „pošťák“ ví, komu přeposlat zprávu, |
| 62 | +aby se k tomuto počítači nakonec dostala. |
| 63 | + |
| 64 | +> [note] |
| 65 | +> „Skutečná“ adresa počítače, tzv. IP adresa, je číselná – například |
| 66 | +> `151.101.37.147` nebo `2a04:4e42:9::403`. |
| 67 | +> Existuje ale systém, jak jméno serveru na takovou *IP adresu* přeložit. |
| 68 | +> Tenhle systém se jmenuje DNS a – abychom zůstali u přirovnání k poště – |
| 69 | +> funguje podobně jako seznamy poštovních směrovacích čísel. |
| 70 | +
|
| 71 | + |
| 72 | +Poslední část URL, `/lessons/fast-track/http/`, je *cesta* (angl. *path*). |
| 73 | +Říká, *co* chceme od serveru dostat: jméno konkrétní webové stránky. |
| 74 | + |
| 75 | +U jednodušších stránek to může být přímo jméno souboru, který má server |
| 76 | +uložený na disku – proto spousta adres na Webu končí příponou `.html`. |
| 77 | + |
| 78 | + |
| 79 | +## Požadavek a odpověď |
| 80 | + |
| 81 | +K získání požadované stránky prohlížeč vytvoří *požadavek* (angl. *request*) |
| 82 | +– zprávu „Pošli mi prosím stránku `/lessons/fast-track/http/`“ – a pošle ho |
| 83 | +serveru `naucse.python.cz`. |
| 84 | + |
| 85 | +Server požadavek dostane a vrátí *odpověď* (angl. *response*) – zprávu |
| 86 | +s obsahem dané stránky. |
| 87 | +Obsah je často webová stránka v jazyce HTML, který popisuje co na stránce je, |
| 88 | +kde jsou nadpisy a kde odstavce, jak má stránka vypadat, a tak dále. |
| 89 | +Ale v odpovědi může být místo stránky i cokoli jiného – obrázek, video, nebo |
| 90 | +jiná data. |
| 91 | + |
| 92 | +Veškerá komunikace přes HTTP funguje právě takto: pošle se požadavek |
| 93 | +a přijde na něj odpověď. |
| 94 | + |
| 95 | +A jak tyhle zprávy vypadají? |
| 96 | +Požadavek nějak takhle: |
| 97 | + |
| 98 | +```http |
| 99 | +GET /lessons/fast-track/install/ HTTP/1.1 |
| 100 | +Accept: */* |
| 101 | +Accept-Encoding: gzip, deflate |
| 102 | +Connection: keep-alive |
| 103 | +Host: naucse.python.cz |
| 104 | +User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 |
| 105 | +``` |
| 106 | + |
| 107 | +První řádek říká serveru: prosím, pošli mi (`GET`) stránku |
| 108 | +`/lessons/fast-track/install/` s použitím protokolu `HTTP` verze `1.1`. |
| 109 | +Další řádky jsou *hlavičky* (angl. *headers*). |
| 110 | +Říkají například kdo se ptá (`User-Agent`) a jaký obsah očekává (`Accept`). |
| 111 | +Většina hlaviček je nepovinná. |
| 112 | + |
| 113 | +Odpověď pak může vypadat takto: |
| 114 | + |
| 115 | +```http |
| 116 | +HTTP/1.1 200 OK |
| 117 | +Cache-Control: max-age=600 |
| 118 | +Connection: keep-alive |
| 119 | +Content-Encoding: gzip |
| 120 | +Content-Length: 3127 |
| 121 | +Content-Type: text/html; charset=utf-8 |
| 122 | +Date: Tue, 20 Feb 2018 15:51:24 GMT |
| 123 | +Last-Modified: Tue, 20 Feb 2018 15:20:08 GMT |
| 124 | +Server: GitHub.com |
| 125 | +
|
| 126 | +<!doctype html> |
| 127 | + <html lang="cs"> |
| 128 | + <head> |
| 129 | + <meta charset="utf-8"> |
| 130 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
| 131 | + <title> |
| 132 | + Python a jeho knihovny: HTTP – Jak funguje Internet |
| 133 | +… |
| 134 | +``` |
| 135 | + |
| 136 | +První řádek říká: používáme protokol `HTTP` verze `1.1`, |
| 137 | +a všechno je v pořádku (`200 OK`). |
| 138 | +Kromě `200` existují i další [stavové kódy] (angl. *status codes*). |
| 139 | +Známý je např. `404` „nenalezeno“. |
| 140 | + |
| 141 | +[stavové kódy]: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes |
| 142 | + |
| 143 | +Následují opět hlavičky – např. kdo odpovídá (`Server`), kdy byla stránka |
| 144 | +naposledy změněna (`Last-Modified`) a jak je odpověď zakódovaná: |
| 145 | +`Content-Type: text/html` říká, že je to stránka v jazyce HTML. |
| 146 | + |
| 147 | +Hlavičky jsou ukončené volným řádkem, po kterém následuje samotný obsah |
| 148 | +odpovědi ve zmíněném jazyce HTML. |
| 149 | + |
| 150 | + |
| 151 | +## HTTP Metody |
| 152 | + |
| 153 | +Komunikace ukázaná výše používala metodu `GET`, která slouží ke *čtení* |
| 154 | +informací. |
| 155 | +Když se takto prohlížeč na nějakou stránku zeptá, nic se na serveru nezmění. |
| 156 | +Prohlížeč si takovou stránku – nebo třeba obrázek či video – může dočasně |
| 157 | +uložit, a když bude potřeba znovu, použít uloženou verzi. |
| 158 | + |
| 159 | +Některými požadavky ale stav serveru mění: například se přihlásí uživatel, |
| 160 | +nakoupí zboží v e-shopu nebo odešle zpráva do diskuse. |
| 161 | +Tyto požadavky používají místo `GET` jinou *metodu* (angl. *method*). |
| 162 | +Co přesně která metoda na jaké adrese dělá, to záleží na autorovi stránek. |
| 163 | +Často se používají tyto metody: |
| 164 | + |
| 165 | +* `GET` načte informace, |
| 166 | +* `POST` pošle na server informace, např. z formuláře, s cílem něco |
| 167 | + změnit nebo nastavit, |
| 168 | +* `PUT` přidá novou stránku (nebo jiný objekt), |
| 169 | +* `DELETE` něco smaže. |
| 170 | + |
| 171 | +Seznam všech metod je ve |
| 172 | +[specifikaci](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html). |
| 173 | + |
| 174 | +U složitějších požadavků se dají na server poslat i informace: |
| 175 | +webové formuláře se odesílají požadavkem, který používá metodu `POST` |
| 176 | +a vyplněné informace k dotazu „přilepí“ za hlavičky – stejným způsobem, jako se |
| 177 | +v odpovědi posílá HTML stránka. |
0 commit comments