REST API in Practice: What, why and how
1st step: forget about REST
1st step: forget about REST
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3571848/63895353.jpg)
1st step: forget about REST
2nd step: Let's build a software
2nd step: Let's build a software
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3571864/giphy.gif)
Your Code
Your Code
Class Foo
Class Bar
Your Code
Class Foo
Foo.X()
Class Bar
Bar.A()
Your Code
Class Foo
Foo.X()
Foo._Y()
Class Bar
Bar.A()
Bar._B()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
Private methods used by Foo.X()
Private methods used by Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
You want to provide this service to your client
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
How?
You want to provide this service to your client
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
Just give the source code to your client
var Foo = require('./YourCode/Foo.js');
var Bar = require('./YourCode/Bar.js');
let f = new Foo();
let b = new Bar();
f.X();
b.A();
// So much win
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
What's the problem with this solution?
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
Your client doesn't know how to write code
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572069/dbc97d3b537a3b38f323b2cd9e97228de9342018e72bb18e3b36ec235a8783f5.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572074/abbcaa9ddfe856683cda20e6ee5757bb3783c01a2082365a53e1f562e0a3e1a3.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572075/14608107_1180665285312703_1558693314_n.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572076/59582971.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572081/Meme-black-girl-confused-4-407x300.jpg)
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
Oh! There's another problem!
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
You don't want to expose private methods
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572089/2742427-2715407869-image.png)
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
What's your solution now?
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
What's your solution now?
"Expose a simple API" - you say
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
Easier access to functionality + access control
var YourCodeAPI = require('./YourCode/API.js');
let api = new YourCodeAPI();
api.Foo.X();
api.Bar.Y();
// So much win
Easier access to functionality + access control
var YourCodeAPI = require('./YourCode/API.js');
let api = new YourCodeAPI();
api.Foo.X();
api.Bar.Y();
// So much win
But Hey!
Easier access to functionality + access control
var YourCodeAPI = require('./YourCode/API.js');
let api = new YourCodeAPI();
api.Foo.X();
api.Bar.Y();
// So much win
Your client still doesn't know how to write code
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572126/confused-black-girl---confusception_gp_3489431.jpg)
But Hey!
How to solve this dilemma?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572130/Wat8.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572131/65-wat.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572133/watican-meme.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572134/jabba-the-wat.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572136/wat-meme-3.jpg)
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
What's a server anyway?
What's a server anyway?
A simple loop always listening for requests
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572214/Untitled_Diagram__2_.png)
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
What's missing?
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
The main glue
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
Endpoints
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
Endpoints
/bar
/foo
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
Endpoints
/bar
/foo
that.get("/bar", Bar.A())
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
Endpoints
/bar
/foo
that.get("/bar", Bar.A())
that.get("/foo", Foo.X())
API
Foo.X()
Bar.A()
Your Code
Class Foo
Class Bar
Foo.X()
Foo._Y()
Foo._Z()
Bar.A()
Bar._B()
Bar._C()
JSON
JSON
![](https://s3.amazonaws.com/media-p.slid.es/uploads/326946/images/3572163/internet-cloud-clip-art-at-clker-com-vector-clip-art-online-royalty-sTEbDg-clipart.png)
HTTP Requests
Server
Req
Res
Endpoints
/bar
/foo
The flow of a request
Incoming request (JSON wrapped in HTTP)
The flow of a request
Incoming request (JSON wrapped in HTTP)
Server forwards to a endpoint
/foo
/bar
The flow of a request
Incoming request (JSON wrapped in HTTP)
Server forwards to a endpoint
/foo
/bar
The flow of a request
Incoming request (JSON wrapped in HTTP)
Server forwards to a endpoint
/foo
/bar
Server calls the method (Server.Foo.X())
The flow of a request
Incoming request (JSON wrapped in HTTP)
Server forwards to a endpoint
/foo
/bar
Server calls the method (Server.Foo.X())
Foo.X() processes the request and return response
Core logic
e.g: addDataset()
Core logic
e.g: addDataset()
Server method to handle Req/Res
e.g: Server.Dataset()
Core logic
e.g: addDataset()
Server method to handle Req/Res
Endpoint that will call a server method to handle the request
e.g: that.server.put("/dataset/:id", Server.dataset())
e.g: Server.Dataset()
Live coding!
REST API in Practice: What, why and how
By Rodrigo Araújo
REST API in Practice: What, why and how
- 1,925