rest api's
TRANSCRIPT
REST APIDos and Dont`s
@abonfiglioAdriano Bonfiglio
What is REST and RESTful APIsHTTP MethodsHTTP Status CodeResources and EndpointsRelationsPaginationDEMOAuthentication
Agenda
SAP Labs Latin AmericaAdriano Bonfiglio
300,000customers in 190 countries
More than
76,500employees and offices in 130 countries
More than
€ 20,8billionin 2015
Annual revenue of
A 44-year history of innovation and growth as a true industry leader
The best company to work for in BrazilNamed by Você S/A magazine and Great Place to Work
2015
2015
2015
Multi-cultural environmentTraining (+24 hours/year/employee)Competitive compensation policyFlexible working timeFlexible benefitsSAP BusFree drinks & snacks
Benefits
Bachelor degree in progress or complete
IT Technical knowledge
Business process knowledge
Advanced English skills
Spanish skills (plus)
Passion for innovation
Team player
How to work @ SAP
http://bit.ly/1Qs0Z7a
Join our talent community!And get to know about our opportunities
RESTREpresentational
State
Transfer
RESTful
REST Webservice
REST API
REST API v1router.get("/app/users/findAll", userController.list);
response: {message: ok, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: {message: ok, results:{}}
router.post("/app/user/update/:id", userController.update);response: {message: ok, results:{}}
router.post("/app/user/save", userController.save);response: {message: ok, results:{}}
router.get("/app/user/delete/:id", userController.remove);response: {message: ok}
router.get("/app/users/findAll", userController.list);response: {message: ok, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: {message: ok, results:{}}
router.post("/app/user/update/:id", userController.update);response: {message: ok, results:{}}
router.post("/app/user/save", userController.save);response: {message: ok, results:{}}
router.get("/app/user/delete/:id", userController.remove);response: {message: ok}
FIRST PROBLEM
REST API v1
HTTP MethodsGETPOST
get a representation of a resource
create a new resource
PUT update a resource
PATCH update part of a resource
DELETE delete a resource
router.get("/app/users/findAll", userController.list);response: {message: ok, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: {message: ok, results:{}}
router.put("/app/user/update/:id", userController.update);response: {message: ok, results:{}}
router.post("/app/user/save", userController.save);response: {message: ok, results:{}}
router.delete("/app/user/delete/:id", userController.remove);response: {message: ok}
REST API v2
router.get("/app/users/findAll", userController.list);response: {message: ok, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: {message: ok, results:{}}
router.put("/app/user/update/:id", userController.update);response: {message: ok, results:{}}
router.post("/app/user/save", userController.save);response: {message: ok, results:{}}
router.delete("/app/user/delete/:id", userController.remove);response: {message: ok}
SECOND PROBLEM
REST API v2
HTTP Status2xx Success
3xx Redirection
200: Ok201: Created204: No content
304: Not modified
4xx Client Error 404: Not Found, 400: Bad Request,401: Unauthorized, 403: Forbidden,405: Method not allowed, 422: Unprocessable Entity
router.get("/app/users/findAll", userController.list);response: HTTP1.1 200 OK {message: “”, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: HTTP1.1 200 OK {message: ok, results:{}}
router.put("/app/user/update/:id", userController.update);response: HTTP1.1 200 OK {message: “”, results:{}}
router.post("/app/user/save", userController.save);response: HTTP1.1 201 Created {message: “”, results:{}}
router.delete("/app/user/delete/:id", userController.remove);response: HTTP1.1 204 No Content
REST API v3
router.get("/app/users/findAll", userController.list);response: HTTP1.1 200 OK {message: “”, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: HTTP1.1 200 OK {message: ok, results:{}}
router.put("/app/user/update/:id", userController.update);response: HTTP1.1 200 OK {message: “”, results:{}}
router.post("/app/user/save", userController.save);response: HTTP1.1 201 Created {message: “”, results:{}}
router.delete("/app/user/delete/:id", userController.remove);response: HTTP1.1 204 No Content
REST API v3
router.get("/app/users/findAll", userController.list);response: HTTP1.1 200 OK {message: “”, results:[...]}
router.get("/app/user/findOne/:id", userController.findOne);response: HTTP1.1 200 OK {message: ok, results:{}}
router.put("/app/user/update/:id", userController.update);response: HTTP1.1 200 OK {message: “”, results:{}}
router.post("/app/user/save", userController.save);response: HTTP1.1 201 Created {message: “”, results:{}}
router.delete("/app/user/delete/:id", userController.remove);response: HTTP1.1 204 No Content
REST API v3
THIRD PROBLEM
Resources and EnpointsNouns
Plural
Consistent
router.get("/app/users/", userController.list);response: HTTP1.1 200 OK {message: “”, results:[...]}
router.get("/app/users/:id", userController.findOne);response: HTTP1.1 200 OK {message:””, results:{}}
router.put("/app/users/:id", userController.update);response: HTTP1.1 200 OK {message: “”, results:{}}
router.post("/app/users/", userController.save);response: HTTP1.1 201 Created {message: “”, results:{}}
router.delete("/app/users/:id", userController.remove);response: HTTP1.1 204 No Content
REST API v4
What about Relations?
User
Role
router.get("/app/users/:id/roles", userController.findAll);response: HTTP1.1 200 OK {message:””, results:{}}
router.get("/app/users/:id/roles/:roleId", userController.findOne);response: HTTP1.1 200 OK {message:””, results:{}}
router.put("/app/users/:id/roles/:roleId", userController.update);response: HTTP1.1 200 OK {message: “”, results:{}}
router.post("/app/users/:id/roles", userController.save);response: HTTP1.1 201 Created {message: “”, results:{}}
router.delete("/app/users/:id/roles/:id", userController.remove);response: HTTP1.1 204 No Content
What about Relations?
GET /app/users?page=1&order=desc&sort=name
What about Pagination?
GET /app/users?fields=name,lastname
Fields
Keep it SimpleGET http://got/hodor
Respose:HTTP1.1 200 OK{ “message”:”hodor”}
GET http://localhost://users/1
Respose:HTTP1.1 200 OK{ “c_id”:”1”, “c_interna_id”:”12132”, “c_Name”:”foo”, “c_lastName”:”barr”, “c_structure”: {
“reference”:”32434”,“code”:”2454435”,
}, “c: last_modified”: “02-29-2016”}
Keep it clear & clean
GET http://localhost://users/1
Respose:HTTP1.1 200 OK{ “id”:”1”, “name”:”foo”, “lastName”:”barr”, “last_modified”: “02-29-2016”}
Keep it clear & clean
DEMO
Authentication
GET / HTTP/1.1Host: example.orgAuthorization: Basic Zm9vOmJhcg=
BASIC
Authentication
GET / HTTP/1.1Host: example.orgAuthorization: Basic Zm9vOmJhcg=
BASIC
AuthenticationDIGEST
AuthenticationOAUTH2
ReferencesRESTful Web APIs – O`REILLY
https://developer.github.com/v3/
https://developers.trello.com/advanced-reference
https://github.com/adrianobonfiglio/rest-api
THANKS!Questions?