RESTful tīmekļa risinājumi Krišs Rauhvargers, 21.01.2011.
May 15, 2015
RESTful tīmekļa risinājumi
Krišs Rauhvargers,
21.01.2011.
REST
• REST (angl: representational state transfer) – tīmekļa programmatūras arhitektūras pieeja,– identificē resursus un to reprezentācijas– nodrošina datoram saprotamas pārejas starp
reprezentācijām.
• Galvenais pielietojums - dalītu sistēmu izstrāde.
2 / 36
Vai REST ir "modes lieta"?
• Termins šķietami iekļaujas SEO, SOA, AJAX, JSON (...) modes vārdu sarakstā
• Patiesībā REST tikai pilnvērtīgi izmanto tīmekļa pamatelementus: – URI protokolu– HTTP protokolu
• Terminu definē R.Fīldings (Roy Fielding) savā doktora disertācijā 2000. gadā
3 / 36
4 / 37
TĪMEKĻA DARBĪBAS PAMATPRINCIPI
Resursi tīmeklī
• Hipertelpa sastāv no resursiem, kurus savstarpēji saista hipersaites.
• Hipersaite viennozīmīgi definē citu saistītu resursu un norāda, kā tam piekļūt.
• Visbiežākais pielietojums: HTML dokuments, kurā ir saites uz citiem dokumentiem.
5 / 36
Hipertelpa
www.delfi.lv
www.leta.lvZiņa1
Ziņa2Avots 1
www.foto.lv
Attēls 1
Serveris
Resurss
Hipersaite
Saistīti resursi tīmekļa lapās
Resurss, URL:http://naivist.net/date/ 2010/09/06/
Resurss, URL:http://naivist.net/image/
2010_09_06.jpg
Resurss, URL:http://naivist.net/layout_images/skynet.gif
Lapas attēlošanai nepieciešamie resursi netiek ielādēti uzreiz!Saites uz diviem attēliem atrodas HTML dokumentā.
7 / 36
Resursu identificēšana
• Katram resursam ir savs URI• URI: "ka tik būtu unikāls"
– urn:issn:1535-3614
• URL ir specifisks URI:– http://example.com/examples/best.htm– identificē resursu– norāda piekļuves veidu– hierarhiska struktūra, pamatā: UNIX failu
sistēmas struktūra8 / 36
Piekļūšana resursam ar HTTP
• HTTP protokols ļauj piekļūt resursiem• Definē standarta darbības:
• paņemt (GET)• nosūtīt (POST)• izveidot (PUT)• dzēst (DELETE)
• Veidojas vienkārši "teikumi", izmantojot šo vārdnīcu:– lietvārds(resurss) + darbības vārds (GET/POST/...)
• GET /books/
• Vēlamo resursa reprezentāciju var mainīt, pievienojot parametrus– [resurss] + [darbība] + [reprezentācija]
• GET /books/?sort=title9 / 36
Resursi dinamiski veidotā tīmeklī
• Publicējot statiskas HTML lapas, URL struktūra veidojas atbilstoši failu sistēmas struktūrai
• http://example.com/folder • http://example.com/folder/file1.htm• http://example.com/folder/file2.htm
• Ja saturu veido dinamiski, "reprezentācijas" var patiesībā būt dažādi resursitas pats resurss var iegūt dažādas reprezentācijas:
• http://example.com/my.cgi?module=users&id=1• http://example.com/my.cgi?module=lessons&id=505
– abos gadījumos resurss ir "my.cgi", reprezentāciju nosaka padoto parametru vērtības
• Izstrādājot tīmekļa bāzētas datorsistēmas, saturs visbiežāk tiek radīts dinamiski! 10 / 36
11 / 37
REST PIEEJAS PAMATI
Resursu apzināšana
• REST pamatā ir pasaule, kas sastāv no pareizi identificētiem resursiem.– grāmatu katalogs ir resurss– grāmata ir resurss– grāmatas autors ir resurss– grāmatas cena ir resurss
• Resursi ir savā starpā saistīti– hierarhija– kolekcijas
• Resursam ir unikālas URL adreses, tās ir nemainīgas. 12 / 36
Resursu hierarhijas
Grāmatu katalogs
(bookcatalog)
Grāmata(Winnie The Pooh, ID=1)
Autori
Cena(price)
Autors(Alan Milne)
/bookcatalog/WinnieThePooh/Price/bookcatalog/1/Price
13 / 36
REST "teikumu" struktūra
• Projektējot REST sistēmas:– drīkst definēt pēc patikas daudz resursu
(lietvārdu),– jāiztiek ar standarta darbības vārdu kopu
• Darbības vārdi ir HTTP metodes:– GET: lasīt (rezultāts vienmēr vienāds)– DELETE: dzēst (neatgriezenisks)– PUT: mainīt (neatgriezenisks)– POST: izveidot (ne-drošs)
14 / 36
Komandu pielietošana REST
• Piemēri– "Nolasīt grāmatas Vinnijs Pūks cenu"
• Grāmatas cena ir resurss, tai ir sava URL adrese• Izpildām HTTP komandu GET uz šo adresi
– "Pievienot katalogam grāmatu par Karlsonu"• Grāmatu katalogs ir resurss, tam ir sava URL
adrese• Izpildām HTTP komandu PUT (vai POST) uz šo
adresi
15 / 37
Resursi paši definē savas saites
• "Cilvēks nav vientuļa sala"• Nolasot informāciju par resursu, tas sniedz arī ziņas par
saistītajiem resursiem
GET /bookcatalog/{Title: "Bērnu grāmatas", Books: [
{Title: "Vinnijs Pūks", URL: { kind: "detail", value: "/bookcatalog/WinnieThePooh/"} },{Title: "Karlsons, kas dzīvo uz jumta", URL :{kind:"detail", value: "/bookcatalog/Carlsson/"}
]}16 / 36
Resursi paši definē savas saites (2)
• GET /bookcatalog/WinnieThePooh/{Title: "Vinnijs Pūks", Description: "Jauka grāmata bērniem par...",
Price: "Ls 2.50" URL : {kind: "pricing", value: "/bookcatalog/WinnieThePooh/ price/"}}
• Klientprogramma, kas zina "pricing" un "details" saišu semantiku, var automātiski atklāt resursu struktūru
17 / 36
Kas traucē domāt resursorientēti?
• Objektorientācija– OO pieeja ļauj definēt jaunus darbības vārdus. – Darbības vārdi aizstāj dažu resursu lietošanu.
• Slinkums apgūt tehnoloģijas– konstrukcija http://example.com/my.cgi?module=users&id=1 ļauj visus pieprasījumus apstrādāt vienā skriptā
– adresu "pārrakstīšana" ļautu to pārvērst par• http://example.com/users/1/
18 / 36
19 / 37
REST DOMĀŠANAS "BRIEDUMA PAKĀPES"
REST brieduma pakāpes
Pilnīgs REST
0. līmenis: XML ir universāla valoda
1. Resursi
2. HTTP darbības vārdu izmantošana
3. Hipersaišu izmantošana
Attēls:martinfowler.com/articles/richardsonMaturityModel.html 20 / 36
0. pakāpe
• Sistēmu sadarbība tiek veikta, izmantojot vienotu piekļuves punktu
• Piekļuves punkts pieņem dažādas komandas un sniedz dažādas atbildes.
• Lietots XML-RPC un SOAP-WS
Klients Serveris
ShoppingServicePOST: getProductList("Books") >
< grāmatu saraksts
POST: PurchaseItem("Karlsons") > < pirkuma info
21 / 36
0. pakāpes saruna (klients, 1. pieprasījums)POST /shoppingSevice HTTP/1.1<getProductList category="Books" />
(serveris, 1. atbilde)HTTP/1.1 200 OK<bookList>
<book title="Karlsons" /><book title="Vinnijs Pūks" />
</bookList>
(klients, 2. pieprasījums)POST /shoppingService HTTP/1.1<purchaseBook title="Karlsons" />
(serveris, 2.atbilde)HTTP/1.1 200 OK<cartContents>
<item category="Books" title="Karlsons" /></cartContents>
(serveris, 2.atbilde, variācija)HTTP/1.1 200 OK<shoppingError>
<failure>Item currently not available.</failure></shoppingError>
22 / 36
1. pakāpe: resursi
• Katram resursam ir savs piekļuves punkts• Joprojām ir definēti daudzi darbības vārdi,
kam piekļūst ar vienu HTTP metodi• SEO mērķiem pietiek ar šī līmeņa uztveri
Klients Serveris
categories/BooksPOST: getList >
< grāmatu saraksts
POST: Purchase(1) > < pirkuma info
categories/Books/Karlsons
23 / 36
1. pakāpes saruna (klients, 1. pieprasījums)POST /categories/Books/ HTTP/1.1<getList />
(serveris, 1. atbilde)HTTP/1.1 200 OK<bookList>
<book title="Karlsons" /><book title="Vinnijs Pūks" />
</bookList>
(klients, 2. pieprasījums)POST /categories/Books/Karlsons/ HTTP/1.1<purchaseBook amount="1" />
(serveris, 2.atbilde)HTTP/1.1 200 OK<cartContents>
<item category="Books" title="Karlsons" /></cartContents>
24 / 36
2. pakāpe: HTTP darbības
• Katram resursam ir sava adrese• Tiek lietotas GET, POST komandas,
ievērojot to semantiku• Tiek lietoti HTTP kļūdu kodi
Klients Serveris
categories/BooksGet: ?status=instock
< grāmatu saraksts
POST: Purchase(1) > < pirkuma info
categories/Books/Karlsons
25 / 36
2. pakāpes saruna (klients, 1. pieprasījums)GET /categories/Books/?status=instock HTTP/1.1<getProductList category="Books" />
(serveris, 1. atbilde)HTTP/1.1 200 OK<bookList>
<book title="Karlsons" resourceName="Karlsons" /><book title="Vinnijs Pūks" resourceName="WinnieThePooh"/>
</bookList>
(klients, 2. pieprasījums)POST /categories/Books/Karlsons/ HTTP/1.1<reservationRequest amount="1" />
(serveris, 2.atbilde)HTTP/1.1 200 OK<cartContents>
<item category="Books" title="Karlsons" /></cartContents>
(serveris, 2.atbilde, variācija)HTTP/1.1 409 Sold out<shoppingError>
<failure>Item currently not available.</failure></shoppingError>
26 / 36
3. pakāpe: hipersaites
• Resursa reprezentācija satur saites uz citām būtiskām reprezentācijām.
• HATEOAS: Hypertext As The Engine Of Application State
• Pietiek ar vienu sākuma punktu, lai pārējos resursus varētu atklāt
• API ir viegli maināms, nesalaužot esošos klientus
27 / 36
3. pakāpes saruna
(klients, 1. pieprasījums)GET /categories/Books/?status=instock HTTP/1.1
(serveris, 1. atbilde)HTTP/1.1 200 OK<bookList>
<book title="Karlsons"><link rel="describedby"
uri="/categories/Books/Karlsons" /><link rel="contents" uri="/categories/Books/Karlsons/editform/" />
</bookList>
(klients, 2. pieprasījums)GET /categories/Books/Karlsons/ HTTP/1.1
...28 / 36
3. pakāpe: saišu formāti
• Mēdz lietot HTML valodā definēto LINK elementu:
• rel: saites veids no RFC (http://www.iana.org/assignments/link-relations/link-relations.xhtml) vai pašu definēts
• uri: saistītā ieraksta identifikators
• XLINK, XML dokumentu saitēšanas valoda (http://www.w3.org/TR/xlink11/)
• href: hipersaite uz saistīto dokumentu, • role: definē saistītā resursa lomu
29 / 36
30 / 37
PRAKTISKI REST PIELIETOJUMI
Valodas: Java
• JAX-RS specifikācija Java valodas papildināšanai, RESTful API automātiskai veidošanai– kodu papildina ar anotācijām, kur norāda,
• kādam resursam OO klase atbilst,• kurai HTTP metodei atbilst OO klases attiecīgā metode,• u.c.
– servera puses kods tiek ģenerēts
• Ir vairākas realizācijas, t.sk. Apache CXF, Jboss.
31 / 36
Java platforma: piemērs
@Path("/helloworld")public class HelloWorldResource { @GET @Produces("text/plain") public String getMyMessage() {
return "Hello World"; }}• Atverot http://example.com/helloworld,
saņemsim metodē minēto tekstu.• Resursu identificēšana paliek izstrādātāja ziņā.
http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features 32 / 36
Produkti: SharePoint 2010
• Microsoft SharePoint: "servera puses Access"– ļauj lietotājam definēt datu struktūras, – automātiski veido datu apstrādes formas.
• Līdz 2007. versijai piedāvā SOAP tīmekļa pakalpes
• 2010. versijā: RESTful serviss• Resursu (un saišu) aprakstīšanai - ATOM
standarts.33 / 36
Produkti: SharePoint 2010
• Hierarhija:– SharePoint vietne (http://server/)
• Dokumentu bibliotēka (/SharedDocs)– Dokuments (/1)
» Dokumenta lauks ("Title")
• Katram hierarhijas līmenim var piekļūt caur vienotu servisu
POST http://server/_vti_bin/listsdata.svc/SharedDocs(1)/Title/
<Value="Newtitle" />
34 / 36
35 / 37
NOSLĒGUMAM
36 / 37
REST: par un pret
Par
• Virzība uz mašīnlasāmu tīmekli;
• Lieto visiem pieejamas tehnoloģijas;
• Viegli dokumentēt klientprogrammu izstrādātājiem;
• Piemērots pārmaiņām nākotnē.
Pret• Metadatu pievienošana rada
papildus datu plūsmu;• Papildus izstrāde resursu
unikālo URL nodrošināšanai;• Izstrādātājam patiešām
jāizprot sistēmas pamatjēdzieni;
• "Oficiāli" REST prasa lietot PUT un DELETE metodes, tās nav vienmēr pieejamas.
Informācijas avoti iedvesmai
• Representational State Transfer (REST)– Fielding, R.– http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
• How I Explained REST to My Wife– Tomayko, R.; – http://tomayko.com/writings/rest-to-my-wife
• Richardson Maturity Model: steps toward the glory of REST– Fowler, M. ; – http://martinfowler.com/articles/richardsonMaturity Model.html
• The Maturity Heuristic– Richardson, L. – http://www.crummy.com/writing/speaking/2008-QCon/act3.html
37 / 36