Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST...

39
Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität München Practical Course Web Development WS 16/17 - 04 - 1

Transcript of Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST...

Page 1: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

PracticalCourse:WebDevelopment

RESTAPIswithNodeJSWinterSemester2016/17

TobiasSeitz

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 1

Page 2: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Today’sAgenda

• APIs– Whatisit?– REST– AccessControl

• APIswithNodeJS– Express– StrongLoop /Loopback– Addingadatasource

• Hands-On

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 2

Page 3: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

WhatisanAPI

• “ApplicationProgrammingInterface”• Interface:Allowotherservicestouseprogramlogic• Goal:Allowpiecesofsoftwaretotalktoeachother• CharacteristicsofaGreatAPI:

– Makeiteasyforotherstouseyoursoftware.– “AGoodAPIneedstoappealtolaziness”KevinLackner– Intuitive (makeittrivial)– Documented (ifsomethingisnottrivial)– Opinionated (doitthewaytheAPIencouragesyou)

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 3

Page 4: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

RESTAPI

• RepresentationalStateTransfer• Provideclientsaccesstoresources• Yourappmanagesthestatesoftheresources,butletsother

softwareaccessthestatethroughtheAPI• ReasonsforusingRESTAPIs[5]:

– Scalability– GeneralitybyusingHTTP– Independencefromotherpartsoftheapp– ReducedLatencywithcaching– SecuritywithHTTPheaders– Encapsulation- APIsdonotneedtoexposeeverything

• Mostcommonformatthesedays:JSON

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 4

Page 5: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

ATypicalAPIURL

https://www.mywebapp.com/api/v1/things/thing_id

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 5

DedicatedPath

APIVersion

DataModel

URI

Page 6: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

RESTAPIQuickGlance

• GoandlookforaRESTAPI• Examples

– Spotify– GoogleMaps– Flickr– FacebookGraphAPI

• Questions:– Whatdoyouthinkmakesitagood/badAPI?– Whatkindofaccesscontroldoesithave?– Whatkindofrestrictionsarethere?

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 6

Page 7: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

APIParadigm:CRUD

• Create

≈INSERTINTOmyData VALUES(....)• Read

≈SELECT*FROMmyData WHERE...• Update

≈UPDATEmyData WHERE...• Delete

≈DELETEFROMmyData WHERE...

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 7

Page 8: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

RESTAPISWITHNODEJS

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 8

Page 9: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Youshouldknow

• OneofthemostpopularNodeJS frameworks.• Characteristics:

– minimalistic– easytouseAPI– manyutilitymethodsandmiddlewarefunctionalities– thinlayerontopofNodeJS– Supportsmultipletemplateengines(Pug/Jade,Handlebars,EJS)

• Findthedocumentationhere:http://expressjs.com/• Package:

npm install --save express

• Expressgenerator:npm install -g express

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 9

Page 10: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

SimpleExpressApp

var express = require('express');var app = express();

app.get('/', function (req, res) {res.send('Hello World!');

});

var server = app.listen(3000, function () {var host = server.address().address;var port = server.address().port;console.log('app listening at http://%s:%s',

host, port)});

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 10

basics/app.js

Page 11: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

ExpressGenerator

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 11

• Goal:automaticallygeneratethebasicstructureofanexpressappthatincludesviews,routes,commondependencies

• Requirements:Installthegeneratorglobally:$ npm install -g express-generator$ express eg-app

• Documentation:http://expressjs.com/starter/generator.html

• Youstillhavetoinstallthedependenciesmanually:$ cd eg-app && npm install

Page 12: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

FullStackSolutions

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 12

mean.io

Page 13: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

CRUDwithExpress

• ExampleAPIthatmanagesproducts.• Createanewproduct:

POST /products

• Retrieveallproducts:GET /products

• Retrieveaparticularproduct:GET /product/:id

• Replaceaproduct:PUT /product/:id

• UpdateaproductPATCH /product/:id

• DeleteaproductDELETE /product/:id

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 13

Page 14: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

TestingPOST/PUT/DELETE

• RecommendedTool:Postmanhttps://www.getpostman.com/• Don’tforgettheheaders,e.g.Content-type:application/json• MakesureyourJSONonlyusesdoublequotes

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 14

Page 15: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Dummydatabase:JavaScriptObject.

var products = {'id_A': {name: 'Product A',price: 30

},'id_B': {name: 'Product B',price: 50

}};

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 15

Page 16: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

GET/products

router.get('/', function(req, res) {var productArray =Object.keys(products).map(function(key) {var entry = products[key];entry.id = key;return entry;

});var response = {code: 200,products: productArray

};res.json(response);

});

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 16

Page 17: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Responsewithallproducts

{"code": 200,"products": [{"name": "Product A","price": 30,"id": "id_A"

},{"name": "Product B","price": 50,"id": "id_B"

]}

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 17

Opinionated:ProductsisanArray,insteadofanObjectliteral.

Page 18: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

POST/products

router.post('/', function(req, res) {var entry, id, response;if (req.body.name && req.body.price) {id = uuid.v1();entry = {};entry[id] = {id : id,name: req.body.name,price: req.body.price

};products[id] = entry[id];response = {code: 201,message: 'created product',products: [entry]

};} else {response = {code: 1000,message: 'missing parameter. required: name, price.'

}}res.json(response);

});

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 18

Intuitive:FollowAPIstandards≈POSTcreatesobjects

Page 19: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Response:Productwascreated

{"code": 201,"message": "created product","products": [{"182348e0-abfd-11e6-92a7-4fdc0c2e84f9": {"id": "182348e0-abfd-11e6-92a7-4fdc0c2e84f9","name": "Product C","price": 100

}}

]}

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 19

Intuitive:Respondwiththeentirecreateddocument,soclientscanupdatetheirviews.

Page 20: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

What’supwiththis?

• Lookatthefile/routes/products.js

• CanyouthinkofpotentialproblemsforyourAPI?

• Howwouldyousolvethem?

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 20

Page 21: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

APIFrameworks

• Goal:Simpler,fastercreationofAPIsandCRUDparadigmforresources

• Oftenwithanabstractionlayer• Popularexamples:

– loopback.io - https://loopback.io/– hapi.js - http://hapijs.com/– Restify - http://restify.com/

• Comparison:https://strongloop.com/strongblog/compare-express-restify-hapi-loopback/

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 21

Page 22: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

LoopBack

• NowpartofStrongLoop Arc(IBM)• Installation:

npm install -g strongloop

• Getting started wizard:slc loopback

– api-server:already contains authentication methods– empty-server:most basic setup– hello-world:small working sample– notes-app:full working example for anote-taking api

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 22

Page 23: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Step1:Setuptheproject

spengler:04-apis Tobi$ slc loopback

_-----_ | | ╭──────────────────────────╮|--(o)--| │ Let's create a LoopBack │`---------´ │ application! │

( _´U`_ ) ╰──────────────────────────╯/___A___\ /| ~ |

__'.___.'__ ´ ` |° ´ Y `

? What's the name of your application? loopback-api? Enter name of the directory to contain the project: loopback-api

create loopback-api/info change the working directory to loopback-api

? Which version of LoopBack would you like to use? 2.x (stable)? What kind of application do you have in mind? hello-worldGenerating .yo-rc.json …

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 23

Page 24: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Step2:Createamodel

spengler:loopback-api Tobi$ slc loopback:model? Enter the model name: product? Select the data-source to attach product to: db (memory)? Select model's base class PersistedModel? Expose product via the REST API? Yes? Custom plural form (used to build REST URL): products? Common model or server only? commonLet's add some product properties now.

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 24

Page 25: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Step3:Addproperties

Enter an empty property name when done.? Property name: name

invoke loopback:property? Property type: string? Required? Yes? Default value[leave blank for none]:

Let's add another product property....

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 25

Page 26: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Step4:Runtheapp

spengler:loopback-api Tobi$ node .Web server listening at: http://0.0.0.0:3000Browse your REST API at http://0.0.0.0:3000/explorer

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 26

Page 27: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

SupportedMethods

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 27

localhost:3000/api/products

UsePostmantoaddsomedata...

Response:{"name": "Product A","price": 10,"id": 1

}

Page 28: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

PersistingModelstoaDatabase

• Loopbackallowsusing“connectors”forvariousdatabases• MySQLconnector:

npm install --save loopback-datasource-

juggler loopback-connector-mysql

• Gettingstarted:slc loopback:datasource

• Thisisnotatrivialstep,soyoureallyneedtotrythisyourself.• Links:

– http://loopback.io/doc/en/lb2/Connecting-to-MySQL.html– http://loopback.io/doc/en/lb2/MySQL-connector.html– http://loopback.io/doc/en/lb2/Data-source-generator.html– https://github.com/strongloop/loopback-connector-mysql

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 28

Page 29: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

AddaMySQLDatasource

spengler:loopback-api Tobi$ slc loopback:datasource? Enter the data-source name: mysql? Select the connector for mysql: MySQL (supported by StrongLoop)Connector-specific configuration:? Connection String url to override other settings (eg: mysql://user:pass@host/db):? host: localhost? port: 3306? user: pwp? password: *************? database: pwp

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 29

Thiswilladdanewentrytoserver/datasources.json

Page 30: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

server/model-config.json

{..."product": {"dataSource": "mysql","public": true

}}

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 30

Page 31: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Thingstonoteatthispoint

• Ifyoutrytoruntheappnow,youwillgetanerror.• Problem:Thereisnotable“products”inyourdatabase• Goal:YouwantLoopBack togeneratethistableforyou.• Solution:Automigration.• Automigration alsoworks,ifyouwanttoswitchthedatabase

(e.g.replaceMySQLwithCloudant)

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 31

Page 32: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Automigration

var path = require('path');var app = require(path.resolve(__dirname, '../server/server'));

var ds = app.datasources.mysql;ds.automigrate('product', function(err) {

if (err) throw err;var products = [

{name: 'Product A',price: 10

},{

name: 'Product B',price: 50

}];

products.forEach(function(product, i) {app.models.product.create(product, function(err, model) {

if (err) throw err;console.log('Created: ', model);if (i === products.length - 1) {

ds.disconnect();}

});});

});

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 32

Page 33: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

PerformAutomigration

spengler:loopback-api Tobi$ node bin/automigrate.js

Created: { name: 'Product A', price: 10, id: 1 }

Created: { name: 'Product B', price: 50, id: 2 }

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 33

Page 34: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

AfterAutomigration:Wehaveatable!

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 34

Page 35: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

APIforyourproject

• ThinkofaResourcethatisgoingtobeaccessiblethroughyourprojectAPI

• Trytomodelit– properties– datatypes

• Performallstepswithloopback

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 39

Page 36: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Thingsthatwecouldn’tcover

• Autodiscovery ofSchemas(LoopBack)• SecuringanAPI• ManualDeploymentandConfiguration• ProcessManagementandProxies• Dockerizing aNodeJS app• ....andmuchmore.

• ==>We’llgetthere,whenweneedthemduringtheprojectphase.

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 40

Page 37: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

PersonalExperiences

• PutalotofworkintodesigningandspecifyingyourAPI.APIchangescanbreakmuchoftheapplicationsusingtheinterface.

• Youdon’twanttomaintainalotofdifferentversionsoftheAPI,soit’sbettertoplanahead.

• MakesuretobundleAPIcallsonthefrontendè OnlyonemodulecontainsAPIinformation.ThemodulethenexportsmethodstousetheAPIacrosstheentirefrontend.

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 41

Page 38: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Links‘n’Stuff

Mustread:1. http://www.restapitutorial.com/

Shouldread:1. https://geemus.gitbooks.io/http-api-design/content/en/

Wouldn’tdoanyharm:1. https://www.toptal.com/api-developers/5-golden-rules-for-designing-a-

great-web-api2. https://www.youtube.com/watch?v=heh4OeB9A-c3. https://www.youtube.com/watch?v=qCdpTji8nxo4. https://www.youtube.com/watch?v=hdSrT4yjS1g5. https://stormpath.com/blog/fundamentals-rest-api-design6. http://web.archive.org/web/20151229055009/http://lcsd05.cs.tamu.edu

/slides/keynote.pdf

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 42

Page 39: Practical Course: Web Development REST APIs with NodeJS · Practical Course: Web Development REST APIs with NodeJS Winter Semester 2016/17 Tobias Seitz Ludwig-Maximilians-Universität

Links‘n’Stuff

• http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

• http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

• https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html• https://github.com/RestCheatSheet/api-cheat-sheet#api-

design-cheat-sheet

Ludwig-Maximilians-UniversitätMünchen PracticalCourseWebDevelopmentWS16/17- 04- 43