NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Webová API - SOAP, GraphQL, REST a formát JSON

V minulé lekci, Úvod do REST API a moderních webových aplikací, jsme si vysvětlili, proč se moderní aplikace vytvářejí pomocí API serveru a jak takový server funguje.

V dnešním tutoriálu praktického testování projektů si představíme různé druhy API, konkrétně REST API, SOAP, GraphQL a formát JSON. Tím se připravíme na projekt databáze faktur, který budeme v tomto kurzu testovat.

Druhy webových API

Na webu existuje několik rozšířených způsobů komunikace. Jsou to:

  • jednoduchá API,
  • API pomocí protokolu SOAP,
  • API pomocí architektury REST,
  • GraphQL od Facebooku.

Jednoduchá API

CSV API jsme si již představili na ukázce s kurzy ČNB:

27.12.2024 #250
země|měna|množství|kód|kurz
Austrálie|dolar|1|AUD|15,027
Brazílie|real|1|BRL|3,900
Bulharsko|lev|1|BGN|12,886
Čína|žen-min-pi|1|CNY|3,309
Dánsko|koruna|1|DKK|3,379
EMU|euro|1|EUR|25,205
Filipíny|peso|100|PHP|41,595
Hongkong|dolar|1|HKD|3,112
Indie|rupie|100|INR|28,256
Indonesie|rupie|1000|IDR|1,488
Island|koruna|100|ISK|17,371
Izrael|nový šekel|1|ILS|6,570
Japonsko|jen|100|JPY|15,307
Jižní Afrika|rand|1|ZAR|1,291
Kanada|dolar|1|CAD|16,802
Korejská republika|won|100|KRW|1,639
Maďarsko|forint|100|HUF|6,127
Malajsie|ringgit|1|MYR|5,402
Mexiko|peso|1|MXN|1,192
MMF|ZPČ|1|XDR|31,503
Norsko|koruna|1|NOK|2,128
Nový Zéland|dolar|1|NZD|13,622
Polsko|zlotý|1|PLN|5,895
Rumunsko|leu|1|RON|5,063
Singapur|dolar|1|SGD|17,783
Švédsko|koruna|1|SEK|2,196
Švýcarsko|frank|1|CHF|26,821
Thajsko|baht|100|THB|71,045
Turecko|lira|100|TRY|68,723
USA|dolar|1|USD|24,157
Velká Británie|libra|1|GBP|30,337

Položky jsou na jednotlivých řádcích a hodnoty jsou oddělené nějakým speciálním znakem (v CSV s kurzy měn to jsou svislítka – |, na klávesnici se píšou pomocí AltGr + W). Častěji se ale používají středníky ;. Na jednoduchá API je možné použít i formát XML nebo JSON.

Jednoduchá API typicky nabízejí jen nějaký seznam dat ke stažení, například počasí podle města. Neumožňují složitější manipulaci s daty.

SOAP

Zkratka SOAP znamená Simple Object Access Protocol. Zprávy posílané pomocí protokolu SOAP jsou obvykle založené na XML (což je značkovací jazyk podobný HTML). Oproti architektuře REST (viz dále) je SOAP spíše procedurální (REST je orientovaný na data). To se projevuje i ve způsobu volání API. URL při používání SOAP bude typicky obsahovat nějaké sloveso, kdežto u architektury REST to bude typicky nějaké podstatné jméno (v našem případě podstatná jména persons a invoices, ale o tom později). Jedním z nejznámějších použití protokolu SOAP u nás je odesílání tržeb při elektronické evidenci tržeb (EET).

SOAP požadavek na zaevidování EET tržby bez dlouhé hlavičky, kterou vypustíme, vypadá takto:

<soap:Body wsu:Id="id-16FE2A6FC1AFE42BE9146412186273614">
    <Trzba>
        <Hlavicka dat_odesl="2016-09-19T19:06:37+01:00" prvni_zaslani="false" uuid_zpravy="9edeb22b-4234-4047-869c-3a76f86c20d3"/><Data celk_trzba="34113.00" cerp_zuct="679.00" cest_sluz="5460.00" dan1="-172.39" dan2="-530.73" dan3="975.65" dat_trzby="2016-01-05T00:30:12+01:00" dic_popl="CZ00000019" id_pokl="/5546/RO24" id_provoz="273" porad_cis="0/6460/ZQ42" pouzit_zboz1="784.00" pouzit_zboz2="967.00" pouzit_zboz3="189.00" rezim="0" urceno_cerp_zuct="324.00" zakl_dan1="-820.92" zakl_dan2="-3538.20" zakl_dan3="9756.46" zakl_nepodl_dph="3036.00"/>
        <KontrolniKody>
            <pkp cipher="RSA2048" digest="SHA256" encoding="base64">W7UlA4hXNsDLvCj/eeRAYeOAsNsgMSdltcJNIW98KQRsfspTMW0Lr/OGQgRHZfO5KjolZgzN3k9mgzrVoX2+N90fCNEnOri2kjrW5vzTgMK6OZ9IryAEg0xFZjjjCQ0qKsQsVi8OLQOn3ZnN/BUGG2SIduER+iIOrhfOmes7OXaa5/2jQSfPTHZHZ/Bxhqld3gL4PHvd7sevZYUupHpE1fM7Uw1+lu8i1YOdghZoMyOfKw7FcqvRJpHrW/JZL5Dr5iCgu5ClmhZrb3hZavsxlDG7P2cUhSQgmEVTxJ2n38q/Cf91KE8e52SODN4Q8BfncXpmtkQ7Go3KsRsY3xN7xg==
            </pkp>
            <bkp digest="SHA1" encoding="base16">1F1A2D90-4EAD34A8-411CFB0B-EB17616E-B2CE8114</bkp>
        </KontrolniKody>
    </Trzba>
</soap:Body>

SOAP API bohužel nejsou příliš jednoduchá, přestože mají v názvu slovo Simple. Používají se spíše ve státní sféře a finančnictví na robustní projekty a nejsou častou volbou pro klasické aplikace.

GraphQL

Pro představu, že existují i jiná aplikační rozhraní pro komunikaci na webu, si ukážeme ještě GraphQL. To vytvořil a zpopularizoval Facebook. GraphQL používá pro reprezentaci informací koncept sociálních grafů s vrcholy a hranami (jako v teorii grafů). Vrcholy jsou objekty, jako např. uživatel, fotka, stránka nebo komentář. Hrany jsou pak spojení mezi objekty, jako třeba komentáře pod fotkou.

Ukázkový dotaz níže získá uživatele s id: "10", jeho jméno, e-mail a přátele, pro které získá jejich jména:

{
  user(id: "10") {
    name
    email
    friends {
      name
    }
  }
}

GraphQL využijeme v případě, kdy je dotazy složité formalizovat a kdy je třeba si při každém dotazu říci, co přesně nás zajímá.

REST

REST je v současné době velmi oblíbená architektura rozhraní. Je to zkratka odvozená z REpresentational State Transfer – pojmu, který zavedl ve své disertační práci Roy Fielding. To je jeden ze spoluautorů protokolu HTTP, proto nepřekvapí, že REST tento protokol používá. REST implementuje čtyři základní CRUD operace. Tyto operace jsou vytvořit (Create), číst (Read), změnit (Update) a smazat (Delete). V HTTP protokolu jim odpovídají metody:

  • GET (přečíst),
  • POST (vytvořit),
  • PUT (upravit),
  • DELETE (smazat).

Právě používání různých HTTP metod je základním principem REST API. Například bychom neměli odstraňovat data přes klasický GET požadavek, který používáme, když se snažíme otevřít nějakou stránku.

Díky čtyřem zmíněným metodám je REST rozhraní jednoduché na pochopení i na používání. Oproti SOAP je mnohem stručnější, a tedy efektivnější. I přes svoji stručnost každý požadavek obsahuje všechny informace potřebné k jeho vyřízení, a server tedy nemusí držet žádný stav (je stateless). Z toho mimo jiné vyplývá, že pokud aplikace potřebuje nějaký stav, musí ho držet klient.

API, které používá rozhraní REST, se označuje jako RESTful.

API naší aplikace

V naší databázové aplikaci budeme testovat funkčnost právě RESTful API. V aplikaci je použito z výše uvedených důvodů (jednoduchost, stručnost) a také proto, že potřebujeme nad fakturami testovat operace, pro které je REST navržené. Dalším důvodem je, že i když REST podporuje mnoho formátů, převládá používání formátu JSON.

Formát JSON

JSON (zkratka odvozená z JavaScript Object Notation) je formát používaný k uchovávání dat i ke komunikaci na webu. Pokud znáte jazyk JavaScript, bude vám syntaxe JSON povědomá, protože z něj vychází. Pro definici objektů používáme složené závorky {}, pro pole hranaté závorky []. Jména vlastností objektů musí být vždy v dvojitých uvozovkách a jsou povolena pouze jednoduchá data – žádné výpočty ani volání funkcí. JSON také nesmí obsahovat žádné komentáře.

Zde je krátká ukázka formátu JSON reprezentující fakturu v naší aplikaci databáze faktur:

{
  "invoiceNumber": 2023001,
  "seller": {
    "name": "Jan Novák",
    "identificationNumber": "14025582",
    "taxNumber": "CZ14025582",
    "accountNumber": "12345678",
    "bankCode": "5500",
    "iban": "CZ00123456789",
    "telephone": "+420 900 900 900",
    "mail": "jan.novak@seznam.cz",
    "street": "Tichá 288, 742 74 Tichá",
    "zip": "744 01",
    "city": "Frenštát pod Radhoštěm",
    "country": "CZECHIA",
    "note": "Gilgamesh",
    "_id": 1
  },
  "buyer": {
    "name": "ITnetwork s.r.o.",
    "identificationNumber": "05861381",
    "taxNumber": "CZ05861381",
    "accountNumber": "123456789",
    "bankCode": "5500",
    "iban": "CZ000123456789",
    "telephone": "+420 123 123 123",
    "mail": "redakce@itnetwork.cz",
    "street": "Karlovo náměstí 290/16, Nové Město (Praha 2)",
    "zip": "120 00",
    "city": "Praha",
    "country": "CZECHIA",
    "note": "Největší IT akademie v Česku.",
    "_id": 4
  },
  "issued": "2023-07-23",
  "dueDate": "2023-07-30",
  "product": "Článek",
  "price": 100,
  "vat": 21,
  "note": "Tvorba výukových článků",
  "_id": 4
}

Vidíme zde jeden hlavní objekt definovaný pomocí {}, který reprezentuje fakturu a obsahuje spoustu vlastností. Řetězce jsou v uvozovkách, čísla píšeme bez nich. Hlavní objekt obsahuje další objekty (odběratel buyer a dodavatel seller) zapsaný opět pomocí {}.

JSON je vhodný pro webové prohlížeče, ale je lehce čitelný i člověkem.

Dokumentace k API

Náš server v Python Djangu musí poskytovat přesně to API, se kterým umí pracovat daný klient. V našem případě je to API z kurzu Node.js, jehož rozhraní je kompletně popsané v lekci API dokumentace k databázi faktur. Na tuto dokumentaci se nyní můžete podívat. Naše práce se bude neustále točit okolo tohoto dokumentu, aby naše endpointy měly správné adresy a přijímaly a odesílaly JSON ve správném formátu.

Endpointy jsou vyústění našeho API, s nimiž se dá zvenku komunikovat.

Při odesílání požadavku pomocí RESTful API nám k tomu, aby byl požadavek zpracován tak, jak potřebujeme, napomáhá správné použití URL adresy. Například pro práci s osobami budeme podle dané dokumentace později používat adresy popsané v následujících kapitolách.

POST

Pro vytvoření nové osoby nám klient pošle POST požadavek (vytvoření, odpovídá CREATE metodě CRUD) na adresu:

/api/persons

Není potřeba zadávat id osoby, jde o vytvoření položky v databázi. Databáze si id vytvoří sama.

GET

Pro seznam všech osob bude klient posílat na náš server GET požadavky (čtení, odpovídá READ metodě CRUD) na adresu:

/api/persons

A pro jednu konkrétní osobu:

/api/persons/(id)

Výraz (id) vždy nahradíme identifikátorem dané osoby.

PUT

Pro PUT požadavek upravující danou osobu (editace, odpovídá UPDATE metodě CRUD) bude adresa následující:

/api/persons/(id)

DELETE

A pro DELETE požadavek (smazání, odpovídá DELETE metodě CRUD) přistoupí klient na adresu:

/api/persons/(id)

To je pro dnešní lekci vše.

V následujícím kvízu, Kvíz - Úvod do testování, REST API, webová API, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Předchozí článek
Úvod do REST API a moderních webových aplikací
Všechny články v sekci
Praktické testování projektů - Manuální testování
Přeskočit článek
(nedoporučujeme)
Kvíz - Úvod do testování, REST API, webová API
Článek pro vás napsal David Novák
Avatar
Uživatelské hodnocení:
29 hlasů
Autor se věnuje vývoji webových aplikací v ASP.NET Core MVC
Aktivity