Tiesa apie REST

Pastaba: šis tekstas daugiausia orientuotas į programuotojus, tad daugelis sąvokų laikomos akivaizdžiomis ir smulkiai neaiškinamos.

Tikriausiai kažkiek sujaukia mintis, kai kažkas netikėtai tampa populiariu dalyku. Matyt populiarumas ir buvo priežastis to, kas daroma neteisingai, su REST (Representional State Transfer). Kas tai ir kokie jo apribojimai?

Kas tai yra? Pirmiausia gali pasirodyti, kad REST yra visai paprastas dalykas – URL panaudojimas kviečiant nutolintas procedūras. Ir iš tikro – tai sudaro 80% REST‘o.

Panaudodami RPC (remote procedure calls) galime sukurti kiek tik norime komandų tokiu pavidalu:
http://saitas/metodas?parametrai

Jas bet kurią programavimo kalbą galima išversti kaip:
metodas(parametrai)

Metodus galima panaudoti įrašų įrašymui, koregavimui, šalinimui ir bet kokiems kitiems veiksmams atlikti. Gražinamas rezultatas gali būti HTML, XML, „Jason“ ar bet kokiu kitu, tame tarpe ir savu, formatu. Metodus galima realizuoti Java, .Net, PHP ar bet kokia kita norima kalba. RPC dažnai vadinamas „routing“, tačiau iš tikro yra dar nuo CGI.

Tačiau kai tik tuos metodus padarote viešais, prasideda betvarkė. Tad REST bando įvesti tam tikrą RPC naudojimo struktūrą (kitaip tariant taisykles).

Pirma taisyklė: URL turi perteikti tik resursus, t.y. URL yra tarsi adresas į tam tikrą „daiktą“ (t.y., duomenis). Tad kaip galime nurodyti komandas?

Antra taisyklė: komandos nurodomos tik panaudojant 4-ias pagrindines HTTP komandas: GET, PUT, POST ir DELETE. Bug and feature

Pagrindinis principas – kad internetas yra labai platus, o jo taikymai turi atrodyti tarsi standartinės tranzakcijos. Aiškinama, kad HTTP infrastruktūra žino, kaip tvarkyti tuos elementus – kešuojant, autorizuojant ir pan. Kam išradinėti ratą, jei jį jau turime?

Pastaba: dažnai aptariant REST aiškinama, kad GET ir DELETE yra nieko nekeičiantys, t.y., juos panaudojus kelis kartus nėra pasikeitimų (išmestas resursas pakartotinai metamas lieka išmestu). Tačiau juk realioje aplinkoje GET nėra nieko nekeičiantis (ypač, kai kviečiami dinaminiai puslapiai , kuriuose yra skaitliukai, laiko nurodymai ir kiti kintantys dalykai).

Filosofiškai PUT ir POST yra labai panašūs (nes POST irgi galima panaudoti resurso įrašymui). Jie skiriasi tik tuo, kad PUT nieko nekeičia, nes kelis kartus įrašius tą patį resursą, niekas nesikeičia.

Tačiau REST tą skirtumą padidina, reikalaudamas, kad PUT visada būtų siejamas su URL‘u į kuriamą ar atnaujinamą resursą, tuo tarpu POST, jei jį gražina kaip rezultatą, turi nurodyti naują URL.

Tad jei norite prisilaikyti REST, galite laikytis tokios nuostatos (atskiram įrašui ar visam įrašų rinkiniui), pvz.
GET paima resursą (resursus, pvz., užsakymą ar užsakymų sąrašą), PUT – įrašo naujus resursus, POST – keičia resursų savybes, DELETE – šalina resursus.

Užbaigianti REST komponentė paprastai apibūdinama kaip „hipermedija kaip būsenos variklis“. Skamba paslaptingai, tačiau tai tereiškia nuorodas į kitus žingsnius.

Jei norite griežtai laikytis REST ir sprendimą turėti kliento pusėje, išeitimi gali būti „Ajax“ – „JQuery Ajax“ palaiko visas Tačiau iš tikro pats „Ajax“ yra būsenas turintis klientas ir jame REST nelabai tinkamas.

Tačiau yra dar viena problema: metodus galite kviesti tik iš to paties serverio (domeno). Tačiau negalima kreiptis į kitus domenus (nei yra www puslapis). O tai iš tikro rimtai apriboja REST API naudojimą. Aišku, yra daug šio apribojimo apėjimų (HTML5 vidiniai pranešimai puslapyje, JSONP, CORS ir tokios bibliotekos, kaip XDM), tačiau tai jau nebus elegantiški griežti REST sprendimai.

Tad tėra vienas praktinis būdas naudoti REST API iš kito domeno – susikurti „proxy“, t.y., serveryje pasirašote tam tikrą kodą, kuris užklausas iš „Ajax“ nukreipia į kitus domenus. Vėlgi ne elegantiška, nesaugu ir nelabai gražu.

Tai ką daryti? Prisiminti, kad REST nėra vienintelis pasirinkimas.
Punishment by programming

Ankstesnės "Advanced HTML" skyrelio temos:
Tcl kalba
"Ruby" kalba
Debesies architektūra
JavaScript kitoniškumas
ASP patarimų liūnas
Visata kaip kompiuteris
Programavimo kalbų klegesys
Viešojo rakto kriptografija
Pelė uodega švystelėjo...
Tikroji Interneto pabaiga
CGI.pm biblioteka: sausainiai
Ką delne mums neša HTML 4.0?
Kaip nukreipti į kitą WWW puslapį
Įvadas į Perl kalbą: Kas naudoja Perl?
Kaip sužinoti ekrano charakteristikas?
AWK kalba - sena ir nuolat aktuali
Vaizdi rašysena - VB Script
Pagalba paieškai (patarimai)
Kaip atsiranda piešinukai? JavaScript atspindžiai
Ateities kalbos?
Fagano patikra
Minčių schema

JavaScript pradmenys
Nutylimųjų savybių ieškant
MS SQL užklausų rezultatų puslapiavimas
Kolmogorovo DI alfa ir omega
Didelių duomenų analizės terminai
Programavimo kalbų istorija
Vartiklis