Způsoby zápisu dat
Když si čtete tyto skripta nebo jiný text, váš mozek z textové podoby vět a souvětí dokáže extrahovat a poskládat si informace. Toto ovšem počítače zcela jednoduše neumějí, proto musíme ukládat data s nějakou pevnou strukturou.
CSV
Nejprimitivnější typ zápisu, či formát dat chcete-li, je tzv. CSV (Comma-separated values). Jak napovídá název, jedná se jednoduchou řadu hodnot oddělených čárkou, avšak často se používá i středník (;
), dvojtečka (:
), tečka (.
), a někdy i mezera, a nebo tabulátor.
Soubory mívají většinou koncovku .csv
.
Například výsledková listina studentů při běhu na 100 m by mohla vypadat takto:
Jan Novák,17
Petr Lopata,14.3
Oskar Čížek,13.8
Zpracování takového dokumentu je programově nenáročné, stačí rozdělit každý řádek na segmenty podle rozdělovače (čárka ,
) a pak víme, že první segment bude jméno a druhý segment čas v sekundách.
Tento formát je podporovaný i různými tabulkovými programy jako Excel, Sheets, Calc atd.
Zcela logicky problém nastane pokud hodnoty jako takové obsahují užitý oddělovač, to bychom museli escapovat (např. před něj dát zpětné lomítko), to však komplikuje zpracovávání dokumentu a proto spíše používáme následující formáty.
XML
XML, celým svým názvem Extensible Markup Language, je široce používaný rozšířitelný standard pro strukturované ukládání dat, připomínající již zmíněné HTML. Oproti primitivnímu CSV zde ukládáme nejen hodnoty, ale i názvy hodnot. Proto je použití XML v programech vhodnější z hlediska jak kompatibility, tak čitelnosti.
Opět příklad výsledkové listiny:
<?xml version="1.0" encoding="UTF-8"?>
<Listina>
<Vysledek>
<Student>Jan Novák</Student>
<Cas>17</Cas>
</Vysledek>
<Vysledek>
<Student>Petr Lopata</Student>
<Cas>14.3</Cas>
</Vysledek>
<Vysledek>
<Student>Oskar Čížek</Student>
<Cas>13.8</Cas>
</Vysledek>
</Listina>
Jak je vidět, hodnoty jsou vždy uzavřené v tazích (tag), název tagu nemusí být unikátní. Celý dokument musí mít pouze jeden kořenový element (tag) - např. <Listina>
.
XML také podporuje libovolné atributy a tak bychom mohli příklad listiny zapsat také takto:
<?xml version="1.0" encoding="UTF-8"?>
<Listina>
<Vysledek student="Jan Novák" cas="17" />
<Vysledek student="Petr Lopata" cas="14.3" />
<Vysledek student="Oskar Čížek" cas="13.8" />
</Listina>
Jak je vidět tak mezi nevýhody XML patří jeho velikost, oproti CSV naše listina v XML vyžaduje daleko více textu. Díky tomu však uchováváme také hierarchii, a protože se spoustu slov často opakuje, XML soubory jsou velmi dobře komprimovatelné a i obyčejné zazipování zmenší velikost na pouhý zlomek.
XML velmi často najdeme v různých exportech dat a jako formát pro ukládání dat (koncovka .xml
), ale je na něm také postavený protokol XMPP, který se používal pro chatování a posílání zpráv.
JSON
JSON je velmi rozšířený formát zejména v prostředí webů a různých API, jelikož jak jeho celý název JavaScript Object Notation napovídá, vznikl z JavaScriptu - nicméně jeho použití dalece přesahuje pouze JavaScript.
Příklad naší listiny by v JSONu mohl vypadat takto:
{
"listina":[
{"student":"Jan Novák", "cas": 17},
{"student":"Petr Lopata", "cas": 14.3},
{"student":"Oskar Čížek", "cas": 13.8}
]
}
JSON podobně jako XML zachovává hierarchii elementů a je povolen pouze jeden kořenový objekt/element. Narozdíl od XML však JSON definuje různé typy objektů:
- Objekt
- Ohraničuje se
{ }
- Např.: objekt s klíčem
listina
:"listina": { }
- Může obsahovat libovolné další objekty s klíčem (klíč musí být v rámci jednoho objektu unikátní) nebo pole.
- Ohraničuje se
- Pole (array)
- Ohraničuje se
[ ]
- Např.: pole s klíčem
listina
:"listina":[]
- Funguje obdobně jako objekt, ale jeho pod-objekty nemají klíče (název).
- Ohraničuje se
- Hodnota
- Může být typu string (text)
"hodnota"
- Nebo číslo
1
,1.3
,1e+7
,-1
- boolean (pravda/nepravda)
true
,false
- Nebo "nic" (prázdná hodnota)
null
- Může být typu string (text)
JSON je oproti XML kompaktnější, avšak pro neznalé oko může být méně čitelný kvůli různosti speciálních znaků.
Různé binární
Velmi často se data ukládají v nejrůznějších binárních formátech, od primitivního "název,délka hodnoty,hodnota", přes různé archívy až k databázím. Mezi binární formáty patří všechny jako jpg
, png
, zip
, 7z
, tar
a nespočet dalších.
Narozdíl od již představených jsou tyto formáty většinou vždy specifické pro konkrétní aplikaci nebo použití.
MIME kódy
Ve světě internetu často k identifikaci formátu používáme tzv. MIME kódy, jsou to vlastně standardizované názvy pro formáty.
Příklady některých MIME kódů
MIME kód | Typická koncovka souboru | Popis |
---|---|---|
text/html |
.html |
Soubory obsahující HTML kód. |
image/jpeg |
.jpg , .jpeg |
Fotky formátu JPEG. |
text/javascript |
.js |
Kód JavaScriptu |
text/css |
.css |
Kód CSS |
application/json |
.json |
Data formátované v JSONu. |
audio/mpeg |
.mp3 |
Zvuk ve formátu MP3. |
application/x-7z-compressed |
.7z |
7-zip archív. |
HTTP
Už jsme si ukázali, jak jsou webové stránky strukturovány - HTML, CSS a JS. Nyní se pojďme podívat, jak se data z webového serveru dostají do našeho počítače. Podíváme se na HTTP (Hypertext Transfer Protocol).
HTTP běží na TCP a každý požadavek (request) má nějakou hlavičku a většinou i tělo.
Jak vypadá request?
Požadavek, který náš počítač vyšle např. serveru seznamu.cz pro stažení HTML kódu úvodní stránky by mohl vypadat takto:
GET / HTTP/1.1
Host: seznam.cz
User-Agent: Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.5.29 Version/10.60
Accept-Charset: UTF-8,*
Cookie: SESSID=526781fabc2799a
a odpověď serveru třeba takto:
HTTP/1.1 200 OK
Date: Mon, 3 Sep 2020 09:30:27 GMT
Server: Apache/1.3.29 (Unix) PHP/5.0.0
Vary: Accept-Encoding,Cookie
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Content-Language: cs
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html>
<head>
<title>Seznam</title>
<meta charset="utf-8" />
...
(zkráceno, dál by pokračoval HTML kód)
V původním požadavku si můžeme všimnout několika částí - první slovo v prvním řádku obsahuje tzv. metodu (tady GET
), pak adresu, kterou požadujeme, tady to je /
, což je úvodní strana. Kdybychom chtěli načíst např. seznam.cz/nastaveni
, bude tam /nastaveni
. Dál název protokolu (HTTP
) a použitou verzi protokolu 1.1
.
Dál hlavička požadavku obsahuje spoustu tzv. headers, extra informací pro server.
User-Agent
Jeden z nejznámějších headerů posílaných ve směru od klienta serveru je User-Agent
, obsahuje řetězec, kde je napsáno jaký prohlížeč používáme, v jaké verzi a na jakém operačním systému jsme. To bylo zamýšleno pro servery, aby věděly, zda mají například odeslat mobilní verzi webu, nebo desktopovou.
Metody
GET
Nejčastější jednoduchá metoda GET
je primitivní požadavek na server. Klasicky ji prohlížeč odešle pokud chceme načíst nějakou stránku.
HEAD
Metoda HEAD
funguje stejně jako GET
, ale odpověď od serveru nebude obsahovat samotné tělo stránky, pouze hlavičky. K čemu to je tedy dobré? Používá se na různé zkoušky spojení a také v případě, že tělo stránky máme již v mezipaměti.
POST
Metoda POST
umožňuje i nám jako prohlížeči odeslat v požadavku nějaké tělo, tedy odeslat data serveru. Jaká data? No například jméno a heslo z login formuláře při přihlašování, nebo soubor při uploadu.
PUT, DELETE, TRACE, OPTIONS, PATCH
Tyto metody nejsou typicky příliš rozšířené ve webových stránkách, využívají se spíše pro API, proto momentálně není podstatné se jimi zabývat.
Status kódy
Obdobně jako požadavky mají metody, tak odpovědi od serveru mají status kódy. Nachází se vždy v prvním řádku odpovědi, např.: HTTP/1.1 200 OK
.
Časté status kódy
Kód | Název | Popis |
---|---|---|
200 | OK | Typická odpověď od serveru, všechno v pořádku. |
404 | Not Found | Uživatel se pokusil načíst stránku, která neexistuje. |
403 | Forbidden | Uživatel nemá přístup ke stránce, na kterou se dotazuje. |
301 | Moved Permanently | tzv. redirect, stránka se přesunula na jinou adresu. |
500 | Internal Server Error | Neznámá chyba na straně serveru. |
Rozdělení status kódů
Kód | Rozsah | Popis |
---|---|---|
1xx | (100 - 199) | Informativní |
2xx | (200 - 299) | OK |
3xx | (300 - 399) | Přesměrování |
4xx | (400 - 499) | Chyba na straně klienta |
5xx | (500 - 599) | Chyba na straně serveru |
State v state-less protokolu aneb cookies
Říkáme, že HTTP je state-less protokol (bez stavu). Říkáme tak, protože prohlížeč pošle požadavek, dostane odpověď a tím komunikace končí, neudržuje se žádný stav.
Jenže v moderním světě WWW je vyžadována mimo jiné možnost přihlašování (email, sociální sítě, hry, fóra, ...) a tak se přišlo s headerem Cookie.
Server odešle v odpovědi header Set-Cookie: ...
(místo teček ony "cookies" - nějaké hodnoty) a náš prohlížeč je poté bude vždy odesílat v požadavcích Cookie: ...
, podle toho nás server může poté identifikovat.
Session
Například odešleme-li požadavek na přihlášení, tak server nám nastaví pomocí Set-Cookie
tzv. session ID - unikátní číslo. Při dalších požadavcích se server vždy podívá do své databáze, ke kterému uživateli je přiřazeno toto ID a podle toho ví, zda a co nám zobrazit.