2. 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
3. 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
5. 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
7. 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_im
ages/skynet.gif
Lapas attēlošanai nepieciešamie resursi netiek ielādēti uzreiz!
Saites uz diviem attēliem atrodas HTML dokumentā.
7 / 36
8. 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ūra
8 / 36
9. 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=title
9 / 36
10. 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
12. 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
13. Resursu hierarhijas
/bookcatalog/WinnieThePooh/Price
Grāmatu /bookcatalog/1/Price
katalogs
(bookcatalog)
Grāmata
(Winnie The
Pooh, ID=1) Cena
(price)
Autors
Autori
(Alan Milne)
13 / 36
14. 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
15. 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
16. 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
17. 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
18. 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
20. REST brieduma pakāpes
Pilnīgs REST
3. Hipersaišu izmantošana
2. HTTP darbības vārdu izmantošana
1. Resursi
0. līmenis: XML ir universāla valoda
Attēls:martinfowler.com/articles/richardsonMaturityModel.html 20 / 36
21. 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
ShoppingService
POST: getProductList("Books") >
< grāmatu saraksts
Klients Serveris
POST: PurchaseItem("Karlsons") >
< pirkuma info
21 / 36
22. 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) variācija)
(serveris, 2.atbilde,
HTTP/1.1 200 OK
HTTP/1.1 200 OK
<cartContents>
<shoppingError>
<item category="Books" not available.</failure>
<failure>Item currently title="Karlsons" />
22 / 36
</cartContents>
</shoppingError>
23. 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
categories/Books
POST: getList >
< grāmatu saraksts
Klients Serveris
categories/Books/Karlsons
POST: Purchase(1) >
< pirkuma info
23 / 36
24. 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" />
24 / 36
</cartContents>
25. 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
categories/Books
Get: ?status=instock
< grāmatu saraksts
Klients Serveris
categories/Books/Karlsons
POST: Purchase(1) >
< pirkuma info
25 / 36
26. 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) variācija)
(serveris, 2.atbilde,
HTTP/1.1 409 Sold out
HTTP/1.1 200 OK
<cartContents>
<shoppingError>
<item category="Books" not available.</failure>
<failure>Item currently title="Karlsons" />
26 / 36
</cartContents>
</shoppingError>
27. 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
28. 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
29. 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
31. 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
32. 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
33. 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
34. 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
36. REST: par un pret
Par Pret
• Virzība uz mašīnlasāmu • Metadatu pievienošana
tīmekli; rada papildus datu plūsmu;
• Papildus izstrāde resursu
• Lieto visiem pieejamas unikālo URL
tehnoloģijas; nodrošināšanai;
• Viegli dokumentēt • Izstrādātājam patiešām
klientprogrammu jāizprot sistēmas
pamatjēdzieni;
izstrādātājiem;
• "Oficiāli" REST prasa lietot
• Piemērots pārmaiņām PUT un DELETE metodes,
nākotnē. tās nav vienmēr pieejamas.
36
37. Informācijas avoti iedvesmai
• Representational State Transfer (REST)
– Fielding, R.
– http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_st
yle.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