Ólafur Sverrir Kjartansson, [email protected]
- Margt fellur undir hugtakið vefþjónusta
- Í grunninn einhver samskipti milli tölva yfir net
- Verið til í einhverri mynd síðan farið var að tengja saman tölvur
- W3C skilgreining:
- "A Web service is a software system designed to support interoperable machine-to-machine interaction over a network"
- Vefþjónusta er hugbúnaðarkerfi hannað til að eiga samvirk samskipti, vél-í-vél yfir net
- Samvirkni gengur út á að láta kerfi virka saman
- Syntactic interoperability – málskipunarsamvirkni
- Við getum talað saman og skipst á gögnum
- Semantic interoperability – merkingarbærsamvirkni
- Við vitum merkinguna í samskiptum okkar—getum túlkað
- Remote Procedure Calls (RPC) milli client og server, notað á níunda áratugnum
- Kallað í fall á annari tölvu
- Common Object Request Broker Architecture (CORBA), staðall sem skilgreindi samskipti dreifðra kerfa um 1991
- XML-RPC RPC kall kóðað í XML sent yfir HTTP, frá um 1998
- Hönnunar og arkitektúra mynstur sem byggir á því að hugbúnaður veiti virkni sem þjónustu til annars hugbúnaðar
- Til þess þurfum við
- Lýsingu á þjónustu
- Lýsingu á samskiptum
- Web Service Description Language, lýsing á þjónustu sem byggir á XML og er stöðluð af W3C
- Skilgreinir t.d.:
- Týpur, einfaldar og flóknar
- Aðgerðir og inntak/úttak þeirra
- Endapunkt, hvert á að kalla á þjónustuna
- Langoftast eru notuð tól sem búa til kóða útfrá WSDL
- Eru oftast stór og mikil XML skjöl...
- Protocol—samskiptareglur—til að skiptast á skipulegum gögnum í útfærslum á vefþjónustum
- Notar XML fyrir form og oftast HTTP fyrir gagnasendingar –
POST
-um gögnum á endapunkt - Stóð upprunalega fyrir Simple Object Access Protocol en því var hætt þegar W3C tók yfir stöðlun
- SOAP skilaboð eru sett inn í umslag sem inniheldur haus (valkvæmt) og meginmál
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
>
<soap:Body>
<m:message>
<m:string>Hello world</m:string>
</m:message>
</soap:Body>
</soap:Envelope>
- Windows Communication Foundation (WCF)
- Keyrsluumhverfi og API til að útbúa SOA forrit
- Mikið notað í .NET
- Nýleg túlkun á SOA til að útfæra dreifð kerfi
- Einblínir á að skipta forriti upp í lauslega tengda (loosely coupled) hluta
- Góð hugmynd en krefst mikils aga og skipulags í útfærslu
GET
– biður um útgáfu af tilgreindri auðlind, lang mest notaða aðferðinHEAD
– einsogGET
, nema vill aðeins fá hausa skilgreinda fyrir auðlindPOST
– Biður server um að taka við einingu í request sem nýrri einingu, skilgreinda með URI. T.d. nýtt svar við umræðuþræði eða ný gögn í gagnagrunni
PUT
– biður um að eining í request sé geymd undir URI, ef önnur er til nú þegar skal uppfæra hanaDELETE
– biður um að það sem geymt er á URI sé eyttPATCH
– uppfærir aðeins þá hluta einingar sem sendir eruTRACE
– Skilar request til baka, debugOPTIONS
– Skilar til baka hvaða aðferðir þjónn styður
- Ákveðnar aðgerðir (t.d.
GET
ogHEAD
) eru skilgreindar sem öruggar að því leiti að köll í þær fyrir auðlind á ekki að breyta neinni stöðu - Aðrar aðgerðir (t.d.
POST
ogPUT
) eru það ekki, þær munu að öllum líkindum breyta stöðu á vefþjón
PUT
ogDELETE
eru aðgerðir sem eru idempotent, þ.e.a.s. að kalla í þær mörgum sinnum með sömu skilyrðum hefur sömu áhrif og að kalla einu sinniPOST
ogPATCH
eru ekki idempotent þar sem hvert kall getur bætt við nýrri einingu eða breytt hluta einingarGET
ogHEAD
eru einnig idempotent þar sem HTTP er stöðulaust
Þegar vefþjónn svarar með response gefur hann upp stöðukóða, sem tölu og lesanlegan texta
1xx
– Til upplýsinga2xx
– Gekk, success3xx
– Áframsending, redirection4xx
– Villa hjá client5xx
– Villa hjá server
200 OK
– Staðlaða svarið, m.v. aðgerð gekk það sem beðið var um upp201 Created
– Beiðni hefur verið uppfyllt og ný eining varð til202 Accepted
– Beiðni móttekin en aðgerð hefur ekki verið uppfyllt204 No Content
– Beiðni hefur verið uppfyllt en engu er svarað, t.d. vegna þess að einingu var eytt
301 Moved Permanently
– Þessi og allar beiðnir í framtíði eiga að fara á nýtt URI (gefið íLocation
haus)304 Not Modified
– Ekkert hefur breyst síðan í fyrri beiðni, m.v.If-Modified-Since
eðaIf-None-Match
hausa
400 Bad Request
– Server getur ekki tekið við beiðni vegna villu hjá client, t.d. eru gögn ekki gild401 Unauthorized
– Auðkenningar er krafist til að geta svarað beiðni403 Forbidden
– Beiðni gild en server skilar ekki svari, t.d. er auðkenning ekki næg til að fá aðgang404 Not Found
– Ekkert fannst á URI451 Unavailable For Legal Reasons
500 Internal Server Error
– Server villa kom upp501 Not Implemented
– Server skildi svar en kann (ekki ennþá) að svara503 Service Unavailable
– Server getur ekki svarað, t.d. vegna anna
- Representational State Transfer, skilgreint í doktorsritgerð Roy Fielding frá árinu 2000
- REST er arkitektúrsstíll sem hunsar útfærslu og samskipti en einblínir á hlutverk eininga, samskipti þeirra á milli og takmarkanir þar á
- Skilgreinir sex takmarkanir á arkitektúr
- Client-server – samræmt viðmót aðskilur client og server
- Stöðulaust – engin staða er geymd á milli beiðna
- Cacheable – client getur geymt afrit af svari, svör verða því að skilgreina hvort það megi eða ekki
- Lagskipt kerfi – client þarf ekki að vita hvort hann sé tengdur enda server eða hvort hann tengist einhverjum millilið
- Kóði eftir þörfum (ekki krafist) – server getur sent kóða til client til að auka virkni hans
- Samræmt viðmót – Grunnur að hönnun á REST þjónustu, einfaldur og aðskildur arkítektúr þ.a. client og server geta vaxið óháð hvor öðrum
- Auðkennum auðlindir – biðjum um auðlind og fáum hana ekki sjálfa heldur framsetningu á henni
- Biðjum um notanda og fáum einhverja framsetningu, t.d. sem JSON eða XML þó að vefþjónn noti þær ekki sjálfur til að geyma notanda
- Sjálf-lýsandi skilaboð, við vitum alltaf nóg til að geta unnið með skilaboðin
- Vinnum með auðlindir gegnum framsetningu – client sem þekkir framsetningu á auðlind veit nóg til að geta breytt henni
- Framsettar upplýsingar um notanda eru nægar til að við getum breytt notanda
- HATEOS
- Hypermedia As The Engine Of Application State
- Client þarf engar frekari upplýsingar en þær sem hann fær í byrjun
- Á skjön við t.d. WSDL þar sem við vitum allt í byrjun
- Notar hypermedia til að komast áfram – fáum tengla til að fá frekari upplýsingar og breyta stöðum
- Hypertext Application Language (HAL) staðlar hvernig þessum upplýsingum er komið til skila
{
"_links": {
"self": {
"href": "http://example.com/api/book/hal-cookbook"
},
"next": {
"href": "http://example.com/api/book/hal-case-study"
}
},
"_embedded": {
"author": {
"id": "foo",
"name": "Foo Bar"
}
},
}
- Vefurinn er stærsta útfærsla á REST arkitektúr
- Fielding einn af aðalhöfundum HTTP
- Notum:
- URI fyrir auðlindirnar okkar – nafnorðin
- Content types fyrir framsetningu á auðlindum
- HTTP aðgerðir til að tilgreina hvað við gerum – sagnirnar
- HTTP skilgreinir caching, auðkenningu, content negotiation...
- Þar sem REST skilgreinir ekki útfærslu er hægt að nota margt
- Í fyrstu notuðu flestar REST vefþjónustur XML
- Núna er JSON lang mest notað, bæði til að taka við gögnum og senda þau til baka
- Margar vefþjónustur í dag útfærðar sem REST eða RESTful, þó þær uppfylli ekki öll skilyrði
- RESTful: notum JSON, HTTP aðgerðir og stöðu kóða en látum annað liggja milli hluta
- Kórrétt REST er flókið
- (Ætlaður) einfaldleikinn er heillandi, sérstaklega í byrjun þegar fólk var þreytt á stórum og miklum XML skjölum
- Gerum okkar besta til að útbúa góðar vefþjónustur sem er þægilegt að nota
- Skilgreiningar á REST milli fólks er mismunandi—REST vs RESTful
- Lítið af stöðluðum tólum sem hægt er að nýta
- Takmarkanir á HTTP: stöðu kóðar og aðgerðir ná ekki yfir allt sem við viljum gera
- Þurfum oft að gera mörg köll til að fá öll þau gögn sem okkur vantar
- Eitt fyrir grein, annað fyrir höfund, enn annað fyrir flokk o.s.fr.
- Í hverju kalli fáum við oft of mikið af upplýsingum
- Postman - GUI tól til að gera HTTP fyrirspurnir
- cURL – CLI tól til að gera HTTP fyrirspurnir
- Request - Library til að gera HTTP fyrirspurnir með node.js
- JSON Formatter – Extension fyrir Chrome sem birtir JSON lesanlega
- Express getur auðveldlega sent frá sér JSON
res.json({ data: 'Einhver JS hlutur' });
- Express kemur með JSON body parser middleware
app.use(express.json());
- Fyrir skráa upload þurfum við samt ennþá middleware sem styður multipart
- Sækir allar færslur eða staka, fylki eða object
- Ef færsla finnst, skilum
200 OK
- Ef færsla finnst ekki, skilum
404 Not Found
- Býr til nýja færslu útfrá gefnu JSON
- Ef færsla er lögleg, skilum
201 Created
, stundum með færslu - Ef færsla er ekki lögleg (t.d. gögn eru ekki gild), skilum
400 Bad Request
- Þurfum að passa upp á JSON villur frá notanda
- Ef notandi sendir JSON þarf að túlka það
- Villur í JSON munu kasta keyrslu villu og án þess að bregðast við því myndum við senda
500 Internal Server Error
þegar villan liggur hjá notanda
- Villur í JSON munu kasta keyrslu villu og án þess að bregðast við því myndum við senda
- Getum bætt við athugun í villumeðhöndlun sem lætur vita
if (err instanceof SyntaxError &&
err.status === 400 && 'body' in err) {
return res
.status(400)
.json({ error: 'Invalid json' });
}
- Uppfærir færslu að öllu leiti með gefnu JSON
- Ef færsla finnst ekki, skilum
404 Not Found
- Ef færsla er lögleg, skilum
200 OK
, stundum með færslu - Ef færsla er ekki lögleg (t.d. gögn eru ekki gild), skilum
400 Bad Request
- Eyðir færslu
- Ef færsla finnst ekki, skilum
404 Not Found
- Annars skilum við
204 No Content
með tóma JSON
- Tilraun til að „laga“ það sem er að REST
- Þróað og stutt af Facebook
- Spec sem skilgreinir týpu kerfi og fyrirspurnarmál
- Staðlaðar útfærslur og tól í mörgum málum
type Project {
name: String
tagline: String
contributors: [User]
}
{
project(name: "GraphQL") {
tagline
}
}
{
"project": {
"tagline": "A query language for APIs"
}
}
- Töluvert ólíkt því að hanna vefi með útliti
- Neytendur okkar eru aðrir forritarar og þeirra forrit
- Mun minna rými til að túlka eitthvað einsog villu á vef
- Getum sparað öðrum ótrúlega mikinn tíma með því að vanda okkur
- Þurfum að hugsa vel um samræmi
- Samræmi á heitum (ekki
username
,userName
oguser-name
) - Samræmi á URI (ekki
/get-users
,/products
og/cats
) - Samræmi á villuskilaboðum
- Samræmi á heitum (ekki
- Hugsum heildstætt, hvað gerist í hverju tilfelli?
- Hvað ef beðið er um eitthvað sem er ekki til
- Hvað ef villa kemur upp
- o.s.fr.
- Oft gott að aðskilja virknina okkar frá vefþjónustulaginu
- Vefþjónustan kemur sem „þunnt lag“ ofan á virkni