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.
  • 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).
  • 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

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.

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.

results matching ""

    No results matching ""