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í.