• Stopaล™ลฏv prลฏvodce REST API

    Nultá úroveลˆ

    Jedná se o samotný pล™enos dat. REST se totiลพ neváลพe na HTTP, takลพe je teoreticky moลพné pouลพít jinou metodu pล™enosu. HTTP je ale dnes tak rozšíล™ený protokol, ลพe snad ani nemá cenu mluvit o jiných moลพnostech. Navíc za nás vyล™eší spoustu vฤ›cí, a tak mลฏลพeme rovnou skoฤit na další bod.

    První úroveลˆ - zdroje (Resources)

    Místo toho, aby se všechny poลพadavky posílaly na jeden centrální bod, pouลพije se jich více. Kaลพdý zdroj (resource) má pak právฤ› jeden koncový bod, kde ho lze dosáhnout. Napล™. GET /articles - vrátí seznam ฤlánkลฏ, GET /articles/1/comments vrátí seznam komentáล™ลฏ k jednomu danému ฤlánku apod. Je dลฏleลพité zvolit si nฤ›jaký standard pojmenovávání zdrojลฏ (tล™eba pouลพívat buฤ jen mnoลพné ฤíslo - GET /articles, GET /comments, nebo jen jednotné GET /article, /comment)

    Druhá úroveลˆ - HTTP Verbs

    V protokolu HTTP je asi nejznámฤ›jší metoda GET. Byla by ale chyba omezovat se pล™i návrhu API jen na ni. Protokol HTTP jich totiลพ nabízí mnohem více. Jsou to: PUT, PATCH, DELETE, OPTIONS a další. Samotné názvy zdrojลฏ neobsahují slovesa, jen podstatná jména. Akci, kterou chceme provést, vyjádล™íme právฤ› pomocí HTTP Verbs.

    Významy jednotlivých HTTP Verbs jsou následující:

    • GET - získání dat
    • POST - vytvoล™ení
    • PUT - úpravy (upraví celý zdroj - chová se jako SET)
    • DELETE - smazání
    • PATCH - ฤásteฤné úpravy

    Metodu PATCH pล™itom v originální specifikaci HTTP nenajdeme. Ale jelikoลพ je HTTP rozšiล™itelný protokol, ฤasem zaฤaly vznikat nová uลพiteฤná rozšíล™ení. Pouลพíváním metody PATCH sníลพíme tok informací po sítí, protoลพe pล™enášíme jen data, která se zmฤ›nila, kdeลพto u PUT pล™enášíme vลพdy celý zdroj.

    Stavové kódy

    V http také najdeme stavové kódy a je jich zdaleka víc neลพ jen 200 OK. Pomฤ›rnฤ› známý je ještฤ› kód 404 Not Found (nenalezeno). Pro nás vývojáล™e pravdฤ›podobnฤ› ještฤ› 500 Server Error. V REST API jsou nejฤastฤ›ji pouลพívané:

    • 200 OK - poลพadavek probฤ›hl v poล™ádku
    • 201 Created - pล™i POST, pokud byl vytvoล™en nový obsah
    • 204 No Content - kdyลพ poลพadavek na server probฤ›hne v poล™ádku, ale server nic nevrátí
    • 304 No Modified - pokud nebyl od posledního poลพadavku nebyl zmฤ›nฤ›n obsah – pouลพívá se pro nativní http cache
    • 400 Bad Request - poลพadavek na server je nฤ›jakým zpลฏsoben neฤitelný (tล™eba špatný JSON apod.)
    • 401 Unauthorized - klient není ovฤ›ล™en
    • 403 Forbidden - klient nemá pล™ístup k danému obsahu
    • 404 Nod Found - zdroj není nalezen
    • 405 Method Not Allowed - zdroj není dostupný pro tuto metodu. Napล™íklad je moลพné pouลพít GET /articles a POST /articles, ale uลพ tล™eba nemลฏลพeme ฤlánek smazat. Nelze tedy zavolat DELETE /articles - je vhodné uลพivatelลฏm našeho API v tomto momentu poskytnout seznam podporovaných metod pro danou URL
    • 410 Gone - zdroj není uลพ na téhle adrese dostupný - to se pouลพívá pล™i verzování
    • 415 Unsupported Media Type - klient v poลพadavku na server uvedl hlaviฤku Content-Type, kterou server nepodporuje
    • 422 Unprocessable Entity - chyba validace dat - tล™eba formuláล™e apod.
    • 429 Too-Many Requests - pokud klient pล™ekroฤil maximální poฤet poลพadavkลฏ, tล™eba za den

    Nezapomeลˆte, ลพe je HTTP rozšiล™itelný protokol. Ve specifických pล™ípadech tak mลฏลพeme pouลพít vlastní stavový kód, pokud bude zachována hlavní tล™ída (tj. odpovฤ›ฤ: 1xx - informaฤní, 2xx - úspฤ›šná, 3xx - pล™esmฤ›rování, 4xx - chyba klienta, 5xx - chyba serveru)

    Velice dลฏleลพité je udrลพet REST API bezstavové. To znamená, ลพe by napล™. ovฤ›ล™ení uลพivatele nemฤ›lo záviset na session nebo cookies. Kaลพdý poลพadavek by mฤ›l obsahovat ovฤ›ล™ovací údaje, podle kterých REST API pozná, kdo se pล™ipojil. Moลพností, jak takové ovฤ›ล™ení provést, je víc. Nejrozšíล™enฤ›jším standardem je OAuth. Poฤítá i s pล™ípady, kdy nelze u klienta jako je Android nebo JavaScript uchránit citlivé údaje.

    Tล™etí úroveลˆ – Hypermedia Controls

    Poslední tล™etí úroveลˆ je známá pod akronymem HATEOAS (Hypertext as the Engine of Application State). Zjednodušenฤ› jde o to, ลพe známe pouze základní koncový bod, který vrací spolu s daty také odkazy na další zdroje, ty zase na další a tak dále. Kaลพdý zdroj tak klientovi dává moลพnosti, jakou akci mลฏลพe provést nebo co dál udฤ›lat. Pล™edstavit si to mลฏลพeme jako HTML dokument s odkazy na další stránky. Výhody jsou zล™ejmé – klient není závislý na URL adresách (musí znát pouze tu první, dál jen „kliká“ na odkazy), ty se mohou klidnฤ› za bฤ›hu mฤ›nit. Dále lze pล™idávat nebo mฤ›nit další funkฤnost, aniลพ by bylo potล™eba cokoli zmฤ›nit u klienta.

    Pล™estoลพe sami autoล™i REST tvrdí, ลพe REST API musí být ล™ízené odkazy, zatím se HATEOAS moc nepouลพívá. V souฤasné dobฤ› totiลพ není moc dostupných nástrojลฏ a materiálลฏ pro HATEOAS.

    Implementace REST API

    GZIP komprese

    Kompresí zdrojลฏ mลฏลพeme ušetล™it aลพ 80 % velikosti zdroje, ฤím se sníลพí pล™enos dat po síti.

    JSON jako hlavní formát

    JSON je dnes hodnฤ› rozšíล™ený formát, se kterým umí dobล™e pracovat spousta jazykลฏ. Pokud by ale bylo nutné podporovat i jiný formát, pouลพijeme hlaviฤku Content-Type pro detekci. Pล™.: kdyลพ klient pošle poลพadavek s Content-Type: application/json vrátíme mu JSON, kdyลพ Content-Type: application/xml, vrátíme XML - kdyลพ nฤ›co jiného, vrátíme klientovi error 415 Unsupported Media Type. Detekci typu mลฏลพeme dát i do URL (GET /articles.xml, GET /articles.json), ale v tom pล™ípadฤ› je vhodné hlaviฤku Content-Type úplnฤ› ignorovat. Pouลพití HTTP hlaviฤky je "ฤistší" ล™ešení.