úterý 16. října 2007

A REST

Representational State Transfer (REST) je koncept pro design distribuované architektury. Distribuovaná architektura v tomto smyslu znamená, že části programu běží na různých strojích a pro svojí komunikaci využívají síť. Pod programem si můžete představit například webovou aplikaci, kde internetový prohlížeč komunikuje s webovým serverem, aplikaci pro výměnu dat mezi finančními institucemi, kde dochází k vzájemnému volání mezi servery.

REST navrhnul a popsal v roce 2000 Roy Fielding v rámci disertační práce Architectural Styles and the Design of Network-based Software Architectures. V kontextu práce je nejzajímavější kapitola 5, ve které Fielding odvozuje principy RESTu na základě známých přístupů k architektuře.

Základní principy RESTu

  • stav aplikace a chování je vyjádřen takzvaným resourcem (klíčová abstrakce)
  • každý resource má unikátní identifikátor (URL, URN)
  • je definován jednotný přístup pro získání a manipulaci s resourcem v podobě čtyř operací CRUD (Create, Read, Update, Delete)
  • resource může mít různé reprezentace (XML, HTML, JSON, SVG, PDF)
Komunikační protokol
  • client/server - slouží k oddělení odpovědností
  • bezestavovost (stateless)- každý požadavek musí obsahovat všechny informace nutné k jeho vykonání
  • cache - každý požadavek může být explicitně označený jako cacheovatelný či necacheovatelný, to umožňuje transparentně zvýšit výkonnost přidáním cache mezi klient a server
  • Code-On-Demand - funkcionalita klienta může být rozšířena kódem, který zašle server (například JavaScript)
  • vrstevnatost - umožňuje skládání vrstev poskytujících služby za účelem zvýšení variabilnosti (cache, transformace, rozložení zátěže atd.)

Existují samozřejmě i další přístupy k řešení distribuované architektury jako Remote Procedure Call (RPC). Obecně můžeme říci, že rozdíl mezi RESTem a RPC je ve dvouch rovinách, sémantice operací a tím co se distribuuje. Sémantika operací v RESTu je konečná a tvoří ji pouze CRUD (create, read, update, delete) na daném resourcu. Oproti tomu v RPC sémantika odpovídá metodám, které jsou volány. V RESTU se distribuuje stav (data představovaná resourcem), oproti chování, které se distribuuje v RPC.

Výhody REST konceptu oproti RCP jsou následující.

  • jednoduché a změnám odolné rozhraní - snadná rozšiřitelnost
  • malé nároky na klienta z hlediska porozumění sémantice operací
  • transparentnost - resource lze na "cestě" velice snadno cahceovat, transformovat atd.

Nevýhody REST konceptu oproti RPC jsou následující.

  • klient musí s každým požadavkem posílat všechny informace nutné k jeho vykonání
  • chybějící podpora na úrovni middleware - všechno si člověk musí napsat sám

Právě chybějící podpora na úrovní middleware je asi největším problémem protože vede k velkému nepohodlí při práci s RESTem. Samozřejmě existují výjimky jako Google a jeho GData, pomocí kterých je využívání Google služeb přes REST pohodlné. GData mají klientské knihovny pro Java, JavaScript, .NET, PHP, C++ a Python.

V Jave se můžeme těšit na JSR 311 - Java API for RESTful Web services, které doufejme přinese usnadnění práce s RESTEm v Jave. Referenční implementace této specky nese název Jersey a můžete se o ní něco dozvědět v rozhovoru RESTful Web Services and Jersey. Spíše bych vám doporučil prezentaci JSR 311: JAX-RS, ve které jsou vidět praktické ukázky.

REST bude tématem některého z příštích CZJUGu a o Jersey bychom se měli pobavit přímo s jedním z jeho autorů v dalších podcastech. Na závěr přidávám pár zajímavých odkazů.