SlideShare a Scribd company logo
1 of 50
Occasion:
Date:
Present:
Classification:
Designing RESTfull
WebServices and Web APIs
Best Practices
CodeCamp Iasi
20-04-2013
Remus Pereni / Software Architect / remus.pereni@tss-yonder.com
Public
2
Software Architect
TSS-Yonder
Web & Mobile Web & Java
Twitter: @remuspereni
Web: http://remus.pereni.org
Remus Pereni
Yonder Romania
http://tss-yonder.com
@tssyonder
Cluj Napoca
Calea Dorobantilor 18-20 Power
Business Center
Iasi
Sos. Pacurari 138
Evolutie
3
1995
De ce avem
nevoie de Web
site?
2000 2005 2013
Bineinteles avem
website!
Bineinteles ca
avem un API!
De ce avem
nevoie de API?
4
Evolutie API-uri
Total APIs over time
Evolutie API-uri
5
Total APIs over time
REST vs. SOAP: Simplicity wins again
6
Distribution of API protocols and styles
Based on directory of 3,200 web APIs listed at ProgrammableWeb, May 2011
7
Componente
8
● https://api.taskmgm.com/createCompany
● https://api.taskmgm.com/deleteCompany
● https://api.taskmgm.com/getCompany
● https://api.taskmgm.com/getAllCompanies
● https://api.taskmgm.com/getAllProjects
● https://api.taskmgm.com/getProject
● https://api.taskmgm.com/createProject
● https://api.taskmgm.com/updateProject
● https://api.taskmgm.com/deleteProject
● https://api.taskmgm.com/createLog
● https://api.taskmgm.com/updateLog
● https://api.taskmgm.com/deleteLog
● https://api.taskmgm.com/getLogs
● https://api.taskmgm.com/getLog
Resurse Web
9
/{colecții}
conțin->
/{store-uri}
care stocheză->
/{documente}
care au datele
propriuzise
Resurse Web
10
/companies
- colectie
- lista de companii
/1234
- document
- detalii companie 1234
Resurse Web
11
● https://api.taskmgm.com/v1/companies
● https://api.taskmgm.com/v1/companies/1234
● https://api.taskmgm.com/v1/projects
● https://api.taskmgm.com/v1/projects/1234
● https://api.taskmgm.com/v1/logs
● https://api.taskmgm.com/v1/logs/12182
Resurse Web
12
/projects
- colectie
- lista de
proiecte
/favorites
-un store
-returneaza tot
o listă
-cu proiectele
favorite
/1234
- document
- detalii proiect
favorit
Resurse Web
13
● https://api.taskmgm.com/v1/projects
● https://api.taskmgm.com/v1/projects/1234
● https://api.taskmgm.com/v1/projects/favorites
● https://api.taskmgm.com/v1/projects/favorites/1234
Resurse Web
14
/{colecții}
conțin->
/{store-uri}
care
stocheză->
/{documente}
care au
datele
propriuzise
/{controlere}
modeleaza
un concept
procedural
Resurse Web
15
/users
- colectie
- lista de
utilizatori
/1234
- document
- detalii unui
anumit user
/resetPassword
-controler
reseteaza
parola
Resurse Web
16
● https://api.taskmgm.com/v1/users
● https://api.taskmgm.com/v1/users/1234
● https://api.taskmgm.com/v1/users/1234/resetPassword
● https://api.taskmgm.com/v1/users/login
Resurse Web
17
Resursă POST
Crează
GET
Citește
PUT
Actualizează
DELETE
Sterge
/companies 201 Created
Crează o nouă
companie
200 OK
Obtine lista de
companii
405 Method
Not Allowed
sau 200 OK
Actualizeaza
toată lista de
companii
405 Method
Not Allowed
sau 200 OK
Nimic sau
Sterge toata
lista de
companii
/companies/1
234
405 Method
Not Allowed
sau
404 Not
Found
200 OK
Obtine detalii
despre
compania
1234
200 OK
Daca exista
compania
1234
actualizeaza
altfel erroare:
404 Not
Found
200 OK
Sterge
compania
1234
sau 404 Not
Found daca
nu există
Operații asupra resurselor / Metode HTTP
18
● RFC 3986
● Syntaxa unui URI e:
o scheme
o "://"
o authority
o "/" path
o [ "?" query ]
o [ "#" fragment ]
● http://example.com/v1/users#name?q=Re
mus
URI
19
● Folositi substantive la plural si nu verbe
o /companies
o /users
o /getUsers
o /getCompanies
● Nu amestecati plural si singular, nu e
consistent
o /companies
o /user
o /users
URI / Best practice-uri
20
Utilizati charactere mici in URI-uri (lowercase)
● https://api.taskmgm.com/v1/users
o o resursa
● HTTP://Api.Taskmgm.com/v1/users
o aceiasi resursa ca mai sus
● https://api.taskmgm.com/v1/Users
o o alta resursa
De ce?
RFC 3896 defineste URI-urile case sensitive exceptind Protocol-ul si
componentele host-ului
scheme "://" authority "/" path [ "?" query ] [ "#" fragment ]
URI / Best practice-uri
21
Nu includeti extensie de fisiere in URI-uri
● https://api.taskmgm.com/v1/users/1234.json
Mecanismele HTTP pentru negocierea continutului
Headerele
o ACCEPT
o ContentType
URI / Best practice-uri
22
● Forward slash separator (/) indica
relatii hierarhice
o http://example.org/vinzari/2012/08/01
URI / Best practice-uri
23
● Trailing forward slash (/) nu trebuie sa termine un
URI
o http://example.org/companies/1234/
o http://example.org/companies/1234
● De ce?
o Nu adauga valoare semantica
o Poate cauza confuzie (2 uri-uri diferite trebuie sa identifice
2 resurse diferite)
URI / Best practice-uri
24
Hypens (-) pot fi folosite pentru a imbunatatii
readability-ul URI-urilor
http://example.org/blogs/remus-pereni/entry/primul-post
URI / Best practice-uri
25
Underscore (_) nu ar trebui folosite
Link-urile de obicei sunt afisate cu underline si
atuncea underscore poate fi confundat
URI / Best practice-uri
26
● Folosit pentru a obtine starea unei resurse
● Cererea poate contine headere dar nu
body
● Cereri repetate la GET nu e voie sa aiba
efecte secundare / duca la modificari de
stare
● Cache-urile depind de abilitatea de a servi
un raspuns fara a mai contacta serverul
original
Metode HTTP / GET
27
● Exact ca si GET, returneaza doar headerele
fara body
● Folosit la verifica existenta unei resurse sau
a metadatelor legat de ea
Metode HTTP / HEAD
28
● Folosit pentru insert si update-uri
● Mesajul trebuie sa contina o
reprezentare a resursei pe care clientul
doreste sa o stocheze pe server
● Continutul mesajului poate sa nu fie
identic cu cea ce ar primi de la un
request GET. Poate contine doar valorile
mutabile / variabile din starea resursei
● Operatiune Idempotenta
Metode HTTP / PUT
29
● Folosit pentru a crea o resursa noua intr-o
colectie
● Folosit pentru a invoca controleri
● Permis pentru orice actiune fara legatura cu
repetabilitatea sau efectele colaterale
(unsafe & non-idempotent)
● Nu este garantata repetabilitatea
● A nu se folosi pentru a obtine / sterge /
actualiza resurse
Metode HTTP / POST
30
● Folosita pentru a sterge o resursa dintr-
o colectie
● O data stearsa cu DELETE resursa nu
mai trebuie sa apartina colectiei (orice
GET sau HEAD pe resursa respectiva
trebuie sa se termine cu 404 NOT
FOUND
Metode HTTP / DELETE
31
● Folosita pentru a sterge o obtine lista de
operatii posibile asupra unei resurse
● Allow: GET, PUT, DELETE
Metode HTTP / OPTIONS
32
● Mai multe abordari
o Versiune in path
• http://example.com/timetrack/v1/companies/yonder
o Versiune in header
● Versiune in header / parte din negocieri
o Un URI trebuie sa identifice constant o resursa
o Modificarea URI-ului presupune o resursa noua
o Deci V1 & V2 denota 2 resurse diferite -> Incorect
Versionarea serviciilor
33
● Ascundeti complexitate in spate la ?
o https://api.taskmgm.com/v1/companies?limit=10&offset=0
● Puteti folosi limit și offset
● Să aveți valori implicite pentru ele
Paginare
34
● Implicit parte din HTTP
● header-ul: Accept
Accept = "Accept" ":"
#( media-range [ accept-params ] )
media-range = ( "*/*"
| ( type "/" "*" )
| ( type "/" subtype )
) *( ";" parameter )
accept-params = ";" "q" "=" qvalue *( accept-extension )
accept-extension = ";" token [ "=" ( token | quoted-string ) ]
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;
https://api.taskmgm.com/v1/companies?format=json
Formate multiple
35
Fie prin controller
https://api.taskmgm.com/v1/companies/search
Ascundeti complexitate in spate la ?
https://api.taskmgm.com/v1/companies?search=Yonder
Cautare
36
Coduri de răspuns, tratarea exceptiilor
Http status code : 401 Unauthorized
● {
o “developerMessage” : “Verbose, plain language description of
the problem for the app developer with hints about how to fix
it.”
o , “userMessage”:”Pass this message on to the app user if
needed.”
o , “errorCode” : 12345
o , “more info”: http://dev.teachdogrest.com/errors/12345
● }
37
Success Totul a
funcționat
Erroare
client
Aplicatia a
facut ceva
greșit
Erroare
server
Ups s-a
intinplat
ceva aiurea
Coduri de răspuns, tratarea exceptiilor
38
● HTTP Defineste 5 categorii
Coduri de răspuns, tratarea exceptiilor
1XX Informational Comunica informatii la nivel de protocol
2XX Success Cererea clientului acceptata cu success
3XX Redirectari Indica ca sunt nevoie actiuni
suplimentare pentru a complecta
requestul
4XX Errori client Erroare datorata in general request-ului
/ Clientului
5XX Errori server Erroare datorata in general serverului
39
Success 200 OK
Erroare
client
400 Bad
Reuest
Erroare
server
500 Internal
Server Error
Coduri de răspuns, tratarea exceptiilor
40
Coduri de răspuns, tratarea exceptiilor
41
Creare 201 Created
Resursa
gresita
404 Not
Found
Lipsa
autorizații
401
Unauthorized
Metoda
ne-
permisa
403
Forbidden
Coduri de răspuns, tratarea exceptiilor
42
● 200 (“OK”)
o Codul pe care clientii spra sa-l vada
o Indica success
o In general trebuie sa includa un raspuns in body
o Nu trebuie folosit in a comunica errori in continutul mesajului
● 201 (“Created”)
o Folosit de cite ori o colectie sau un store creaza o resursa noua
bazat pe cererea clientului
o Poate fi si raspuns al apelului unui controller in cazul in care o
resursa este creata
● 202 (“Accepted”)
o Folosit pentru raspunsuri asincrone
o O operatiune lunga a fost inceputa, pare valida dar poate inca
genera errori
o In general folosit la controlere
Coduri de răspuns, tratarea exceptiilor
43
● 204 (“No Content”)
o Operatia e reusita dar nu exista continut de returnat
(DELETE, de exemplu)
● 301 (“Moved Permanently”)
o Resursa s-a mutat si exista o noua locatie pentru ea
o Locatia se trimite ca parte a Location header-ului
● 303 (“See Other”)
o Controler-ul si-a terminat treaba dar in loc sa trimita un raspuns
potential nedorit poate trimite in Location un URI la o resursa
care poate prezenta interes pentru clienti
● 304 (“Not Modified”)
o Similar cu 204 (“No Content) in sensul ca body-ul e gol
o Clientul are deja cea mai recenta versiune
o Folosit impreuna cu alte headere ce determina HTTP
Conditionale
Coduri de răspuns, tratarea exceptiilor
44
● 400 (“Bad Request”)
o Mesaj de erroare generic cind nici un alt 4xx nu este potrivit
o Raspunsul poate contine body cu mesaj detaliat legat de erroare
● 401 (“Unauthorized”)
o Nu are authorizarea necesara sau nu a asigurat nici un fel de
authorizare
● 403 (“Forbidden”)
o Indica ca request-ul e corect dar backend-ul refuza sa-l onoreze
o Nu este o problema de autorizare (ar fi 401), poate clientul nu
are permisiunea de a apela acea parte din API
● 404 (“Not Found”)
o Cererea nu poate fi mapata pe o resursa
● 405 (“Method Not Allowed”)
o Daca clientul a incercat o operatie ne-permisa (ex: DELETE pe o
resursa read only)
o Trebuie sa se trimita inapoi header-ul Allow: GET, POST cu
metodele suportate
Coduri de răspuns, tratarea exceptiilor
45
● 406 (“Not Acceptable”)
o Formatul cerut de client nu este suportat (Ex. clientul cere
application/xml prin intermediul headerului Accept dar serverul
are pregatit doar application/json
● 409 (“Conflict”)
o Daca se incearca punerea unei resurse intr-o stare inconsistenta
o Ex, se incearca stergerea unei colectii care nu e goala
● 415 (“Unsuported Media Type”)
o Indica ca serverul nu poate parsa cererea in formatul descris de
header-ul Content-Type
o Ex. Body-ul contine application/xml dar serverul stie sa trateze
doar application/json
● 500 (“Internal Server Error”)
o Probleme pe partea de server, ex exceptii aruncate si ne tratate
Coduri de răspuns, tratarea exceptiilor
46
Resurse
Web API Design?
Crafting Interfaces that Developers
Love
By Brian Mulloy
Ebook gratuit oferit de apigee
http://apigee.com/about/cont
ent/web-api-design
47
Resurse
REST API Design Rulebook
Designing Consistent RESTful
Web Service Interfaces
By Mark Masse
Publisher: O'Reilly Media
Released: October 2011
Pages: 116
48
1. Atlassian REST API Design Guidelines version 1
https://developer.atlassian.com/display/DOCS/Atlassian+REST+API+Design+Guidelines+version+1
2. Thoughts on RESTful API Design
Lessons learnt from designing the Red Hat Enterprise Virtualization API
https://restful-api-design.readthedocs.org/en/latest/
Resurse
49
Întrebări?
photo cc by http://www.flickr.com/photos/horiavarlan/4273168957/
50
Thank You !
Please fill the evaluation form slide
photo cc by http://www.flickr.com/photos/wwworks/4759535950/

More Related Content

Similar to Iasi code camp 20 april 2013 designing res tfull webservices and web apis - remus pereni

Oauth vs open id
Oauth vs open idOauth vs open id
Oauth vs open idsorinm10
 
Programare Web - De la CGI la servere de aplicatii
Programare Web - De la CGI la servere de aplicatiiProgramare Web - De la CGI la servere de aplicatii
Programare Web - De la CGI la servere de aplicatiiSabin Buraga
 
Asp.net mvc bad practices
Asp.net mvc   bad practicesAsp.net mvc   bad practices
Asp.net mvc bad practicesRadu Vunvulea
 
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic..."Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...eLiberatica
 
48892700 invatam-php
48892700 invatam-php48892700 invatam-php
48892700 invatam-phpdissdiss2005
 
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...constantadevelopers
 
Instalare si administrare site grid
Instalare si administrare site gridInstalare si administrare site grid
Instalare si administrare site gridalexstanciu
 
Arduino cereri httpgetpost
Arduino cereri httpgetpostArduino cereri httpgetpost
Arduino cereri httpgetpostIulius Bors
 
Programarea aplicațiilor distribuite
Programarea aplicațiilor distribuiteProgramarea aplicațiilor distribuite
Programarea aplicațiilor distribuite Dumitru Maros
 
04 web server_deployment_ro
04 web server_deployment_ro04 web server_deployment_ro
04 web server_deployment_romcroitor
 
Programare Web - Accesul la baze de date prin PHP
Programare Web - Accesul la baze de date prin PHPProgramare Web - Accesul la baze de date prin PHP
Programare Web - Accesul la baze de date prin PHPSabin Buraga
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2Diana Tataran
 
Proiect web
Proiect webProiect web
Proiect webMEliRal
 
Code Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru PhpCode Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru Phpioanaciprian
 
Drupal Global Training Days - 31 May 2014
Drupal Global Training Days  - 31 May 2014Drupal Global Training Days  - 31 May 2014
Drupal Global Training Days - 31 May 2014romancri
 

Similar to Iasi code camp 20 april 2013 designing res tfull webservices and web apis - remus pereni (20)

Oauth vs open id
Oauth vs open idOauth vs open id
Oauth vs open id
 
Programare Web - De la CGI la servere de aplicatii
Programare Web - De la CGI la servere de aplicatiiProgramare Web - De la CGI la servere de aplicatii
Programare Web - De la CGI la servere de aplicatii
 
Asp.net mvc bad practices
Asp.net mvc   bad practicesAsp.net mvc   bad practices
Asp.net mvc bad practices
 
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic..."Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...
"Open Source and The Technology Learning Curve" by Andrei Pascal @ eLiberatic...
 
48892700 invatam-php
48892700 invatam-php48892700 invatam-php
48892700 invatam-php
 
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
 
Webappdev
WebappdevWebappdev
Webappdev
 
Instalare si administrare site grid
Instalare si administrare site gridInstalare si administrare site grid
Instalare si administrare site grid
 
Arduino cereri httpgetpost
Arduino cereri httpgetpostArduino cereri httpgetpost
Arduino cereri httpgetpost
 
Programarea aplicațiilor distribuite
Programarea aplicațiilor distribuiteProgramarea aplicațiilor distribuite
Programarea aplicațiilor distribuite
 
Etapa2
Etapa2Etapa2
Etapa2
 
04 web server_deployment_ro
04 web server_deployment_ro04 web server_deployment_ro
04 web server_deployment_ro
 
Programare Web - Accesul la baze de date prin PHP
Programare Web - Accesul la baze de date prin PHPProgramare Web - Accesul la baze de date prin PHP
Programare Web - Accesul la baze de date prin PHP
 
Irina Cureraru
Irina CureraruIrina Cureraru
Irina Cureraru
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
 
Microsoft zitec
Microsoft  zitecMicrosoft  zitec
Microsoft zitec
 
Eu code week moldova
Eu code week moldovaEu code week moldova
Eu code week moldova
 
Proiect web
Proiect webProiect web
Proiect web
 
Code Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru PhpCode Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru Php
 
Drupal Global Training Days - 31 May 2014
Drupal Global Training Days  - 31 May 2014Drupal Global Training Days  - 31 May 2014
Drupal Global Training Days - 31 May 2014
 

More from Codecamp Romania

Cezar chitac the edge of experience
Cezar chitac   the edge of experienceCezar chitac   the edge of experience
Cezar chitac the edge of experienceCodecamp Romania
 
Business analysis techniques exercise your 6-pack
Business analysis techniques   exercise your 6-packBusiness analysis techniques   exercise your 6-pack
Business analysis techniques exercise your 6-packCodecamp Romania
 
Bpm company code camp - configuration or coding with pega
Bpm company   code camp - configuration or coding with pegaBpm company   code camp - configuration or coding with pega
Bpm company code camp - configuration or coding with pegaCodecamp Romania
 
Andrei prisacaru takingtheunitteststothedatabase
Andrei prisacaru takingtheunitteststothedatabaseAndrei prisacaru takingtheunitteststothedatabase
Andrei prisacaru takingtheunitteststothedatabaseCodecamp Romania
 
2015 dan ardelean develop for windows 10
2015 dan ardelean   develop for windows 10 2015 dan ardelean   develop for windows 10
2015 dan ardelean develop for windows 10 Codecamp Romania
 
The case for continuous delivery
The case for continuous deliveryThe case for continuous delivery
The case for continuous deliveryCodecamp Romania
 
Stefan stolniceanu spritekit, 2 d or not 2d
Stefan stolniceanu   spritekit, 2 d or not 2dStefan stolniceanu   spritekit, 2 d or not 2d
Stefan stolniceanu spritekit, 2 d or not 2dCodecamp Romania
 
Sizing epics tales from an agile kingdom
Sizing epics   tales from an agile kingdomSizing epics   tales from an agile kingdom
Sizing epics tales from an agile kingdomCodecamp Romania
 
Raluca butnaru corina cilibiu the unknown universe of a product and the cer...
Raluca butnaru corina cilibiu   the unknown universe of a product and the cer...Raluca butnaru corina cilibiu   the unknown universe of a product and the cer...
Raluca butnaru corina cilibiu the unknown universe of a product and the cer...Codecamp Romania
 
Parallel & async processing using tpl dataflow
Parallel & async processing using tpl dataflowParallel & async processing using tpl dataflow
Parallel & async processing using tpl dataflowCodecamp Romania
 
Material design screen transitions in android
Material design screen transitions in androidMaterial design screen transitions in android
Material design screen transitions in androidCodecamp Romania
 
Kickstart your own freelancing career
Kickstart your own freelancing careerKickstart your own freelancing career
Kickstart your own freelancing careerCodecamp Romania
 
Ionut grecu the soft stuff is the hard stuff. the agile soft skills toolkit
Ionut grecu   the soft stuff is the hard stuff. the agile soft skills toolkitIonut grecu   the soft stuff is the hard stuff. the agile soft skills toolkit
Ionut grecu the soft stuff is the hard stuff. the agile soft skills toolkitCodecamp Romania
 
Diana antohi me against myself or how to fail and move forward
Diana antohi   me against myself  or how to fail  and move forwardDiana antohi   me against myself  or how to fail  and move forward
Diana antohi me against myself or how to fail and move forwardCodecamp Romania
 

More from Codecamp Romania (20)

Cezar chitac the edge of experience
Cezar chitac   the edge of experienceCezar chitac   the edge of experience
Cezar chitac the edge of experience
 
Cloud powered search
Cloud powered searchCloud powered search
Cloud powered search
 
Ccp
CcpCcp
Ccp
 
Business analysis techniques exercise your 6-pack
Business analysis techniques   exercise your 6-packBusiness analysis techniques   exercise your 6-pack
Business analysis techniques exercise your 6-pack
 
Bpm company code camp - configuration or coding with pega
Bpm company   code camp - configuration or coding with pegaBpm company   code camp - configuration or coding with pega
Bpm company code camp - configuration or coding with pega
 
Andrei prisacaru takingtheunitteststothedatabase
Andrei prisacaru takingtheunitteststothedatabaseAndrei prisacaru takingtheunitteststothedatabase
Andrei prisacaru takingtheunitteststothedatabase
 
Agility and life
Agility and lifeAgility and life
Agility and life
 
2015 dan ardelean develop for windows 10
2015 dan ardelean   develop for windows 10 2015 dan ardelean   develop for windows 10
2015 dan ardelean develop for windows 10
 
The bigrewrite
The bigrewriteThe bigrewrite
The bigrewrite
 
The case for continuous delivery
The case for continuous deliveryThe case for continuous delivery
The case for continuous delivery
 
Stefan stolniceanu spritekit, 2 d or not 2d
Stefan stolniceanu   spritekit, 2 d or not 2dStefan stolniceanu   spritekit, 2 d or not 2d
Stefan stolniceanu spritekit, 2 d or not 2d
 
Sizing epics tales from an agile kingdom
Sizing epics   tales from an agile kingdomSizing epics   tales from an agile kingdom
Sizing epics tales from an agile kingdom
 
Scale net apps in aws
Scale net apps in awsScale net apps in aws
Scale net apps in aws
 
Raluca butnaru corina cilibiu the unknown universe of a product and the cer...
Raluca butnaru corina cilibiu   the unknown universe of a product and the cer...Raluca butnaru corina cilibiu   the unknown universe of a product and the cer...
Raluca butnaru corina cilibiu the unknown universe of a product and the cer...
 
Parallel & async processing using tpl dataflow
Parallel & async processing using tpl dataflowParallel & async processing using tpl dataflow
Parallel & async processing using tpl dataflow
 
Material design screen transitions in android
Material design screen transitions in androidMaterial design screen transitions in android
Material design screen transitions in android
 
Kickstart your own freelancing career
Kickstart your own freelancing careerKickstart your own freelancing career
Kickstart your own freelancing career
 
Ionut grecu the soft stuff is the hard stuff. the agile soft skills toolkit
Ionut grecu   the soft stuff is the hard stuff. the agile soft skills toolkitIonut grecu   the soft stuff is the hard stuff. the agile soft skills toolkit
Ionut grecu the soft stuff is the hard stuff. the agile soft skills toolkit
 
Ecma6 in the wild
Ecma6 in the wildEcma6 in the wild
Ecma6 in the wild
 
Diana antohi me against myself or how to fail and move forward
Diana antohi   me against myself  or how to fail  and move forwardDiana antohi   me against myself  or how to fail  and move forward
Diana antohi me against myself or how to fail and move forward
 

Iasi code camp 20 april 2013 designing res tfull webservices and web apis - remus pereni

  • 1. Occasion: Date: Present: Classification: Designing RESTfull WebServices and Web APIs Best Practices CodeCamp Iasi 20-04-2013 Remus Pereni / Software Architect / remus.pereni@tss-yonder.com Public
  • 2. 2 Software Architect TSS-Yonder Web & Mobile Web & Java Twitter: @remuspereni Web: http://remus.pereni.org Remus Pereni Yonder Romania http://tss-yonder.com @tssyonder Cluj Napoca Calea Dorobantilor 18-20 Power Business Center Iasi Sos. Pacurari 138
  • 3. Evolutie 3 1995 De ce avem nevoie de Web site? 2000 2005 2013 Bineinteles avem website! Bineinteles ca avem un API! De ce avem nevoie de API?
  • 6. REST vs. SOAP: Simplicity wins again 6 Distribution of API protocols and styles Based on directory of 3,200 web APIs listed at ProgrammableWeb, May 2011
  • 8. 8 ● https://api.taskmgm.com/createCompany ● https://api.taskmgm.com/deleteCompany ● https://api.taskmgm.com/getCompany ● https://api.taskmgm.com/getAllCompanies ● https://api.taskmgm.com/getAllProjects ● https://api.taskmgm.com/getProject ● https://api.taskmgm.com/createProject ● https://api.taskmgm.com/updateProject ● https://api.taskmgm.com/deleteProject ● https://api.taskmgm.com/createLog ● https://api.taskmgm.com/updateLog ● https://api.taskmgm.com/deleteLog ● https://api.taskmgm.com/getLogs ● https://api.taskmgm.com/getLog Resurse Web
  • 10. 10 /companies - colectie - lista de companii /1234 - document - detalii companie 1234 Resurse Web
  • 11. 11 ● https://api.taskmgm.com/v1/companies ● https://api.taskmgm.com/v1/companies/1234 ● https://api.taskmgm.com/v1/projects ● https://api.taskmgm.com/v1/projects/1234 ● https://api.taskmgm.com/v1/logs ● https://api.taskmgm.com/v1/logs/12182 Resurse Web
  • 12. 12 /projects - colectie - lista de proiecte /favorites -un store -returneaza tot o listă -cu proiectele favorite /1234 - document - detalii proiect favorit Resurse Web
  • 13. 13 ● https://api.taskmgm.com/v1/projects ● https://api.taskmgm.com/v1/projects/1234 ● https://api.taskmgm.com/v1/projects/favorites ● https://api.taskmgm.com/v1/projects/favorites/1234 Resurse Web
  • 15. 15 /users - colectie - lista de utilizatori /1234 - document - detalii unui anumit user /resetPassword -controler reseteaza parola Resurse Web
  • 16. 16 ● https://api.taskmgm.com/v1/users ● https://api.taskmgm.com/v1/users/1234 ● https://api.taskmgm.com/v1/users/1234/resetPassword ● https://api.taskmgm.com/v1/users/login Resurse Web
  • 17. 17 Resursă POST Crează GET Citește PUT Actualizează DELETE Sterge /companies 201 Created Crează o nouă companie 200 OK Obtine lista de companii 405 Method Not Allowed sau 200 OK Actualizeaza toată lista de companii 405 Method Not Allowed sau 200 OK Nimic sau Sterge toata lista de companii /companies/1 234 405 Method Not Allowed sau 404 Not Found 200 OK Obtine detalii despre compania 1234 200 OK Daca exista compania 1234 actualizeaza altfel erroare: 404 Not Found 200 OK Sterge compania 1234 sau 404 Not Found daca nu există Operații asupra resurselor / Metode HTTP
  • 18. 18 ● RFC 3986 ● Syntaxa unui URI e: o scheme o "://" o authority o "/" path o [ "?" query ] o [ "#" fragment ] ● http://example.com/v1/users#name?q=Re mus URI
  • 19. 19 ● Folositi substantive la plural si nu verbe o /companies o /users o /getUsers o /getCompanies ● Nu amestecati plural si singular, nu e consistent o /companies o /user o /users URI / Best practice-uri
  • 20. 20 Utilizati charactere mici in URI-uri (lowercase) ● https://api.taskmgm.com/v1/users o o resursa ● HTTP://Api.Taskmgm.com/v1/users o aceiasi resursa ca mai sus ● https://api.taskmgm.com/v1/Users o o alta resursa De ce? RFC 3896 defineste URI-urile case sensitive exceptind Protocol-ul si componentele host-ului scheme "://" authority "/" path [ "?" query ] [ "#" fragment ] URI / Best practice-uri
  • 21. 21 Nu includeti extensie de fisiere in URI-uri ● https://api.taskmgm.com/v1/users/1234.json Mecanismele HTTP pentru negocierea continutului Headerele o ACCEPT o ContentType URI / Best practice-uri
  • 22. 22 ● Forward slash separator (/) indica relatii hierarhice o http://example.org/vinzari/2012/08/01 URI / Best practice-uri
  • 23. 23 ● Trailing forward slash (/) nu trebuie sa termine un URI o http://example.org/companies/1234/ o http://example.org/companies/1234 ● De ce? o Nu adauga valoare semantica o Poate cauza confuzie (2 uri-uri diferite trebuie sa identifice 2 resurse diferite) URI / Best practice-uri
  • 24. 24 Hypens (-) pot fi folosite pentru a imbunatatii readability-ul URI-urilor http://example.org/blogs/remus-pereni/entry/primul-post URI / Best practice-uri
  • 25. 25 Underscore (_) nu ar trebui folosite Link-urile de obicei sunt afisate cu underline si atuncea underscore poate fi confundat URI / Best practice-uri
  • 26. 26 ● Folosit pentru a obtine starea unei resurse ● Cererea poate contine headere dar nu body ● Cereri repetate la GET nu e voie sa aiba efecte secundare / duca la modificari de stare ● Cache-urile depind de abilitatea de a servi un raspuns fara a mai contacta serverul original Metode HTTP / GET
  • 27. 27 ● Exact ca si GET, returneaza doar headerele fara body ● Folosit la verifica existenta unei resurse sau a metadatelor legat de ea Metode HTTP / HEAD
  • 28. 28 ● Folosit pentru insert si update-uri ● Mesajul trebuie sa contina o reprezentare a resursei pe care clientul doreste sa o stocheze pe server ● Continutul mesajului poate sa nu fie identic cu cea ce ar primi de la un request GET. Poate contine doar valorile mutabile / variabile din starea resursei ● Operatiune Idempotenta Metode HTTP / PUT
  • 29. 29 ● Folosit pentru a crea o resursa noua intr-o colectie ● Folosit pentru a invoca controleri ● Permis pentru orice actiune fara legatura cu repetabilitatea sau efectele colaterale (unsafe & non-idempotent) ● Nu este garantata repetabilitatea ● A nu se folosi pentru a obtine / sterge / actualiza resurse Metode HTTP / POST
  • 30. 30 ● Folosita pentru a sterge o resursa dintr- o colectie ● O data stearsa cu DELETE resursa nu mai trebuie sa apartina colectiei (orice GET sau HEAD pe resursa respectiva trebuie sa se termine cu 404 NOT FOUND Metode HTTP / DELETE
  • 31. 31 ● Folosita pentru a sterge o obtine lista de operatii posibile asupra unei resurse ● Allow: GET, PUT, DELETE Metode HTTP / OPTIONS
  • 32. 32 ● Mai multe abordari o Versiune in path • http://example.com/timetrack/v1/companies/yonder o Versiune in header ● Versiune in header / parte din negocieri o Un URI trebuie sa identifice constant o resursa o Modificarea URI-ului presupune o resursa noua o Deci V1 & V2 denota 2 resurse diferite -> Incorect Versionarea serviciilor
  • 33. 33 ● Ascundeti complexitate in spate la ? o https://api.taskmgm.com/v1/companies?limit=10&offset=0 ● Puteti folosi limit și offset ● Să aveți valori implicite pentru ele Paginare
  • 34. 34 ● Implicit parte din HTTP ● header-ul: Accept Accept = "Accept" ":" #( media-range [ accept-params ] ) media-range = ( "*/*" | ( type "/" "*" ) | ( type "/" subtype ) ) *( ";" parameter ) accept-params = ";" "q" "=" qvalue *( accept-extension ) accept-extension = ";" token [ "=" ( token | quoted-string ) ] Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; https://api.taskmgm.com/v1/companies?format=json Formate multiple
  • 35. 35 Fie prin controller https://api.taskmgm.com/v1/companies/search Ascundeti complexitate in spate la ? https://api.taskmgm.com/v1/companies?search=Yonder Cautare
  • 36. 36 Coduri de răspuns, tratarea exceptiilor Http status code : 401 Unauthorized ● { o “developerMessage” : “Verbose, plain language description of the problem for the app developer with hints about how to fix it.” o , “userMessage”:”Pass this message on to the app user if needed.” o , “errorCode” : 12345 o , “more info”: http://dev.teachdogrest.com/errors/12345 ● }
  • 37. 37 Success Totul a funcționat Erroare client Aplicatia a facut ceva greșit Erroare server Ups s-a intinplat ceva aiurea Coduri de răspuns, tratarea exceptiilor
  • 38. 38 ● HTTP Defineste 5 categorii Coduri de răspuns, tratarea exceptiilor 1XX Informational Comunica informatii la nivel de protocol 2XX Success Cererea clientului acceptata cu success 3XX Redirectari Indica ca sunt nevoie actiuni suplimentare pentru a complecta requestul 4XX Errori client Erroare datorata in general request-ului / Clientului 5XX Errori server Erroare datorata in general serverului
  • 39. 39 Success 200 OK Erroare client 400 Bad Reuest Erroare server 500 Internal Server Error Coduri de răspuns, tratarea exceptiilor
  • 40. 40 Coduri de răspuns, tratarea exceptiilor
  • 41. 41 Creare 201 Created Resursa gresita 404 Not Found Lipsa autorizații 401 Unauthorized Metoda ne- permisa 403 Forbidden Coduri de răspuns, tratarea exceptiilor
  • 42. 42 ● 200 (“OK”) o Codul pe care clientii spra sa-l vada o Indica success o In general trebuie sa includa un raspuns in body o Nu trebuie folosit in a comunica errori in continutul mesajului ● 201 (“Created”) o Folosit de cite ori o colectie sau un store creaza o resursa noua bazat pe cererea clientului o Poate fi si raspuns al apelului unui controller in cazul in care o resursa este creata ● 202 (“Accepted”) o Folosit pentru raspunsuri asincrone o O operatiune lunga a fost inceputa, pare valida dar poate inca genera errori o In general folosit la controlere Coduri de răspuns, tratarea exceptiilor
  • 43. 43 ● 204 (“No Content”) o Operatia e reusita dar nu exista continut de returnat (DELETE, de exemplu) ● 301 (“Moved Permanently”) o Resursa s-a mutat si exista o noua locatie pentru ea o Locatia se trimite ca parte a Location header-ului ● 303 (“See Other”) o Controler-ul si-a terminat treaba dar in loc sa trimita un raspuns potential nedorit poate trimite in Location un URI la o resursa care poate prezenta interes pentru clienti ● 304 (“Not Modified”) o Similar cu 204 (“No Content) in sensul ca body-ul e gol o Clientul are deja cea mai recenta versiune o Folosit impreuna cu alte headere ce determina HTTP Conditionale Coduri de răspuns, tratarea exceptiilor
  • 44. 44 ● 400 (“Bad Request”) o Mesaj de erroare generic cind nici un alt 4xx nu este potrivit o Raspunsul poate contine body cu mesaj detaliat legat de erroare ● 401 (“Unauthorized”) o Nu are authorizarea necesara sau nu a asigurat nici un fel de authorizare ● 403 (“Forbidden”) o Indica ca request-ul e corect dar backend-ul refuza sa-l onoreze o Nu este o problema de autorizare (ar fi 401), poate clientul nu are permisiunea de a apela acea parte din API ● 404 (“Not Found”) o Cererea nu poate fi mapata pe o resursa ● 405 (“Method Not Allowed”) o Daca clientul a incercat o operatie ne-permisa (ex: DELETE pe o resursa read only) o Trebuie sa se trimita inapoi header-ul Allow: GET, POST cu metodele suportate Coduri de răspuns, tratarea exceptiilor
  • 45. 45 ● 406 (“Not Acceptable”) o Formatul cerut de client nu este suportat (Ex. clientul cere application/xml prin intermediul headerului Accept dar serverul are pregatit doar application/json ● 409 (“Conflict”) o Daca se incearca punerea unei resurse intr-o stare inconsistenta o Ex, se incearca stergerea unei colectii care nu e goala ● 415 (“Unsuported Media Type”) o Indica ca serverul nu poate parsa cererea in formatul descris de header-ul Content-Type o Ex. Body-ul contine application/xml dar serverul stie sa trateze doar application/json ● 500 (“Internal Server Error”) o Probleme pe partea de server, ex exceptii aruncate si ne tratate Coduri de răspuns, tratarea exceptiilor
  • 46. 46 Resurse Web API Design? Crafting Interfaces that Developers Love By Brian Mulloy Ebook gratuit oferit de apigee http://apigee.com/about/cont ent/web-api-design
  • 47. 47 Resurse REST API Design Rulebook Designing Consistent RESTful Web Service Interfaces By Mark Masse Publisher: O'Reilly Media Released: October 2011 Pages: 116
  • 48. 48 1. Atlassian REST API Design Guidelines version 1 https://developer.atlassian.com/display/DOCS/Atlassian+REST+API+Design+Guidelines+version+1 2. Thoughts on RESTful API Design Lessons learnt from designing the Red Hat Enterprise Virtualization API https://restful-api-design.readthedocs.org/en/latest/ Resurse
  • 49. 49 Întrebări? photo cc by http://www.flickr.com/photos/horiavarlan/4273168957/
  • 50. 50 Thank You ! Please fill the evaluation form slide photo cc by http://www.flickr.com/photos/wwworks/4759535950/

Editor's Notes

  1. API-urile nu exista de sine independent, in izolatie. API-urile expun un set de functionalitati ale unei aplicatii sau serviciu care exista in mod identependent de existenta API-ului. Din acest punct de vedere rolul unui designer de API REST sunt:1. Sa inteleaga suficiente detalii din aplicatia ale carei servicii urmeaza sa le expuna pentru a putea lua o decizie informata in privinta carei functionalitati trebuie expusa, cum poate fi expusa si ce poate fi lasat afara2. Sa modeleze aceasta functionalitate intr-un API care sa adreseze toate cerintele unei utilizari urmarind cit mai aproape principiile RESTExista 3 actorii in aceasta piesa1. Aplicatia2. API-ul3. Clientul
  2. Daca am concepe URI-urile in still RPC (procedural) ar iesi un API / metode stufioae si non intuitive.Asa nu.
  3. Sa le organizăm un pic.Colecții: Sunt de fapt liste de obiecte / resurse care ne intereseaza. Operatii asupra lor pot sa permita crearea unei resurse noi in colectie sau nu respectiv stergerea tuturor resurselor sau nuStore-uri: Este o colectie gestionata de catre client. In esenta ele nu creaza resurse independente, doar le colecteazaDocument-ul: Reprezintă resursa in sine cea care este gestionată propriuzis (de exemplu proiectele, clientii, entry-urile de date, samd
  4. Sa le organizăm un pic
  5. Asa da
  6. Sa le organizăm un pic
  7. Asa da
  8. Sa le organizăm un pic.Colecții: Sunt de fapt liste de obiecte / resurse care ne intereseaza. Operatii asupra lor pot sa permita crearea unei resurse noi in colectie sau nu respectiv stergerea tuturor resurselor sau nuStore-uri: Este o colectie gestionata de catre client. In esenta ele nu creaza resurse independente, doar le colecteazaDocument-ul: Reprezintă resursa in sine cea care este gestionată propriuzis (de exemplu proiectele, clientii, entry-urile de date, samdControlere: Modeleaza concepte procedurale, actiuni care nu se pot mapa pe operatiile traditionale CRUD
  9. Sa le organizăm un pic
  10. Fiti consistenti
  11. Folositi forward slash separator (/) indica relatii hierarhice