taller desarrollo de apis

32
Desarrolla tu primera API Marco Antonio Sanz

Upload: start-uc3m

Post on 08-Jul-2015

433 views

Category:

Technology


2 download

DESCRIPTION

Se aprenderá a desarrollar una API siguiendo la metodología MADA que tiene como misión reducir la complejidad a la hora de desarrollar una API y que utiliza RAML como lenguaje de definición de APIs. A patir del RAML, se generará toda la documentación necesaria para exponer a los developers, se podrá construir un fake para probarlo en la consola de pruebas y se generará un esqueleto en node.js. El taller desarrollará un ejemplo utilizando objetos en memoria y otro ejemplo utilizando MongoDB como base de datos.

TRANSCRIPT

Page 1: Taller desarrollo de apis

Desarrolla tu primera API

Marco Antonio Sanz

Page 2: Taller desarrollo de apis

¿Quienes somos?

Grupo de meetup

http://www.meetup.com/API-Addicts/

Meetups realizados

❏ MADA. Metodología ágil de

definición de APIs

❏ Taller: Definición de APIs

❏ Taller: Desarrolla tu primera API

❏ Seguridad en las APIs

❏ Las APis en el mundo Big Data

❏ Las APis en el mundo Cloud

❏ Apis como modelo de negocio

❏ Define y desarrolla tu primera API

Marco Antonio Sanz:http://es.linkedin.com/pub/marco-antonio-sanz-molina-prados/18/335/97/

Page 3: Taller desarrollo de apis

Patrocinadores

¿qué nos ofrece?

➢ know - how de apis

➢ Experiencia en el gobierno de Apis

➢ Ejemplos de arquitecturas

➢ Experiencia en el mundo Cloud

Calle Velasco 13

Tlf: 658 89 75 75

[email protected] ·

www.cloudappi.net

Page 4: Taller desarrollo de apis

❏ Realizar un documento funcional

❏ Realizar el diseño de la API

❏ Realizar una implementación fake

❏ Implementar la API

❏ Validar la API

❏ Generar documentación para developers

❏ Generar casos de prueba (códigos de ejemplo)

❏ Generar los SDks

Pasos para desarrollar una API

Índice

Page 5: Taller desarrollo de apis

Datos recogidos de google Trend

Búsquedas por lenguajes en google Commits por lenguaje en github

Datos recogidos de ohloh.net

Primeros pasos¿Qué lenguaje utilizo?

Page 6: Taller desarrollo de apis

➢ Es una tecnología que está en auge

➢ El lenguaje es Javascript, que todo el

mundo conoce.

➢ Es muy fácil desarrollar una API con el

módulo express

➢ integración con RAML (proyecto osprey)

¿Por qué node.js?

Primeros pasos

Page 7: Taller desarrollo de apis

➢ Framework javascript para ejecutar código del lado del

servidor. Se ejecuta sobre el V8 de Google.

Aspectos generales

Node.js

Page 8: Taller desarrollo de apis

➢ Es orientado a eventos y no a threads,

basándose en la programación asíncrona.

➢ Levanta un servidor web en local.

➢ Buena gestión de los paquetes con npm.

➢ El módulo express ayuda a desarrollar APIs.

Aspectos generales

Node.js

Page 9: Taller desarrollo de apis

raml http://raml.org/ url dónde se encuentra toda la

documentación de RAML

api designer http://api-

portal.anypoint.mulesof

t.com/raml/api-designer

url del api designer

c9.io https://c9.io/ Entorno para desarrollo

test.raml http://api-

portal.anypoint.mulesof

t.com/cloudsystems/api

/notifly/test.raml

raml de partida

Recursos

Implementación

Page 10: Taller desarrollo de apis

Utilizamos el proyecto Osprey

Seguimos los pasos que ponen

en Github

Generando el esqueleto

Implementación

Page 11: Taller desarrollo de apis

Instalamos Osprey-cli

npm install -g osprey-cli

Generamos el esqueleto

osprey new raml/test.raml --

name test --target test

Generando el esqueleto

Implementación

Page 12: Taller desarrollo de apis

Instalamos las dependencias

npm install (dónde esté package.json)

Revisamos el app.js

Generando el esqueleto

Implementación

Page 13: Taller desarrollo de apis

Ejecutamos la aplicación

node app.js

Probamos la consola

localhost:3000/api/consol

e

Probando el fake

Implementación

Page 14: Taller desarrollo de apis

Probamos la API

try it

Probando el fake

Implementación

Page 15: Taller desarrollo de apis

Nuestros primeros pasos

➢ Instalación de módulos con npm

install <módulo> o package.json

➢ Importación de módulos con

require

➢ Ejecución del servidor

➢ Módulo express

var express = require('express');

var path = require('path');

var osprey = require('osprey');

var app = module.exports = express();

app.use(express.bodyParser());

app.use(express.methodOverride());

app.use(express.compress());

app.use(express.logger('dev'));

app.set('port', process.env.PORT || 3000);

api = osprey.create('/api', app, {

ramlFile: path.join(__dirname, '/assets/raml/api.raml'),

logLevel: 'debug' // logLevel: off->No logs | info->Show Osprey modules initializations | debug->Show all

});

if (!module.parent) {

var port = app.get('port');

app.listen(port);

console.log('listening on port ' + port);

}

Generando el esqueleto

Implementación

Page 16: Taller desarrollo de apis

GET /api/users

{ "result": {

"info": "OK"

},

"data": [

{"name": "Marco",

"firstname": "2",

"lastname":

"2",

"address":

{

"descripcion": "blab

bla",

"number":

"2"

},

"id": "0"

} ] }

app.get('/api/users', function(req, res) {

res.statusCode = 200;

res.type('application/json');

res.send({ result: { "result": {

"info": "OK"},

"data": {

"users": users

}

}});

});

Resultado

Creando un GET

Implementación

Page 17: Taller desarrollo de apis

POST /api/users

app.post('/api/users', function(req, res) {

users.push(req.body);

req.body.id=users.length-1;

res.statusCode = 201;

res.type('application/json');

res.send({ "result": {

"info": "user created"},

"data": { "id": users.length-1 }

});

});

Resultado

{

"result": {

"info": "user created",

"data": {"id": 2}

}

Creando un POST

Implementación

Page 18: Taller desarrollo de apis

PUT /api/users/0

app.put('/api/users/:userid', function(req, res) {

var result=users[req.params.userid];

res.statusCode = 200;

res.type('application/json');

req.body.id = req.params.userid;

users[req.params.userid] = req.body;

res.send({"result": {"info": "OK"},

"data": users[req.params.userid] });

});

Resultado

{"result": { "info": "OK"},

"data": {

"name": "Marco",

"firstname": "2",

"lastname": "2",

"address": {

"descripcion": "blab bla",

"number": "2" },

"id": "0"}}

Creando un PUT

Implementación

Page 19: Taller desarrollo de apis

DELETE /api/users/0

app.delete('/api/users/:userid', function(req, res) {

users.splice(req.params.userid,1);

res.send({

"result": {

"info": "OK"

},

"data": users

});

});

Resultado

{"result": { "info": "OK"},

"data": {

"name": "Marco",

"firstname": "2",

"lastname": "2",

"address": {

"descripcion": "blab bla",

"number": "2" },

"id": "0"}}

Creando un DELETE

Implementación

Page 20: Taller desarrollo de apis

¿Qué es MongoDB?

Es una base de datos opensource noSQL orientada a documento. Sus principales

características son las siguientes:

- Orientada a documento. La información se organiza como colecciones de

documentos json.

- Los documentos están en formato BSON

- Permite indexar por cualquier campo

- Permite alta disponibilidad y replicación de la información

- Auto - sharding. Permite escalamiento horizontal.

- Map Reduce

- Permite realizar queries basadas en documentos

Conectando a la BBDD

Implementación

Page 21: Taller desarrollo de apis

Conectando node con MongoDB

Es una base de datos opensource noSQL orientada a documento. Sus principales

características son las siguientes:

- Orientada a documento. La información se organiza como colecciones de

documentos json.

- Los documentos están en formato BSON

- Permite indexar por cualquier campo

- Permite alta disponibilidad y replicación de la información

- Auto - sharding. Permite escalamiento horizontal.

- Map Reduce

- Permite realizar queries basadas en documentos

Conectando a la BBDD

Implementación

Page 22: Taller desarrollo de apis

Instalando el driver de Mongo. package.json

{

"name": "test",

"version": "0.0.1",

"private": true,

"dependencies": {

"express": "3.4.4",

"osprey": "0.1.1",

"mongodb":"*"

}

var MongoClient = require ('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/meetup',function(err,db){

if (err) throw err;

});

Conectando a la base de datos. app.js

Configurando MongoDB

Implementación

Page 23: Taller desarrollo de apis

GET /api/users

app.get('/api/users', function(req, res) {

var params={};

if (req.params){

params=req.params;

}

db.collection('users').find(params).toArray(function(er

r,users){

if (err)throw err;

res.send({

"result": {

"info":

"OK"

},

"data": users

});

});

});

Resultado

{

"result": {

"info": "OK"

},

"data": [

{

"name": "Marco",

"firstname": "Polo",

"lastname": "2",

"address": {

"descripcion": "blab bla",

"number": "2"

},

"_id": "53cee9b7e892d0c91d7ab299"

}]}

Creando un GET con BBDD

Implementación

Page 24: Taller desarrollo de apis

POST /api/users

app.post('/api/users', function(req, res) {

var user=req.body;

db.collection('users').insert(user,function(err,user){

res.send({

"result": {

"info":

"OK"

},

"data": user

});

});

});

Resultado

{

"result": { "info": "OK" },

"data": [ {

"name": "Marco",

"firstname": "Polo",

"lastname": "2",

"address": {

"descripcion": "blab bla",

"number": "2"

},

"_id": "53ceee94e657ff1a1f93893c"

}

]

}

Creando un POST con BBDD

Implementación

Page 25: Taller desarrollo de apis

PUT /api/users/53cee9c8e892d0c91d7ab29b

app.put('/api/users/:userid', function(req, res) {

var objectId = new ObjectID(req.params.userid);

var user = req.body;

db.collection('users').update({_id:objectId},user,function(er

r,updated){

res.send({

"result": {

"info": "OK"

},

"data": updated

});

});

});

Resultado

{

"result": {

"info": "OK"

},

"data": 0

}

Creando un PUT con BBDD

Implementación

Page 26: Taller desarrollo de apis

DEL /api/users/53cee9c8e892d0c91d7ab29b

app.delete('/api/users/:userid', function(req, res) {

var objectId = new ObjectID(req.params.userid);

db.collection('users').remove({_id:objectId},function(e

rr,user){

res.send({

"result": {

"info": "OK"

},

"data": user

});

});

});

Resultado

{

"result": {

"info": "OK"

},

"data": 0

}

Creando un DELETE con BBDD

Implementación

Page 27: Taller desarrollo de apis

Código:

https://github.com/cloudsystems/meetup/tree/master/meetup

Colección de pruebas postman:

https://www.getpostman.com/collections/771041a6437349596cf2

RAML de ejemplo:

http://api-portal.anypoint.mulesoft.com/cloudsystems/api/notifly/test.raml

Código de ejemplo

Enlaces de interés

Page 28: Taller desarrollo de apis

➢ Mongoose, mongoose-validate, mongoose-schema-extend:

Permite definir esquemas para mongo

➢ Express.router: Permite unificar todas las rutas en un sólo fichero

➢ Express validator: Permite validar parámetros

➢ Errorhandler: Permite manejar los errores de un forma más fácil

➢ Log4js-node: Permite configurar y manejar los logs

➢ Node-schedule: Permite configurar tareas batch

Utilidades

➢ ForEver: Permite ejecutar continuamente el script node

➢ Node-supervidor: Permite realizar actualizaciones en caliente

Módulos interesantes

Algunas cosas más

Page 29: Taller desarrollo de apis

➢ MongoDB: http://www.mongodb.org/

➢ RAML: http://raml.org/

➢ Nodejs: http://nodejs.org/

➢ IDe para poder desarrollar y ejecutar nuestras pruebas: http://c9.io

➢ API designer: http://api-portal.anypoint.mulesoft.com/raml/api-designer:

➢ Cursos de Mongo con node: https://university.mongodb.com/

Enlaces de interésEnlaces

Page 30: Taller desarrollo de apis

Ruegos y preguntas

Page 31: Taller desarrollo de apis
Page 32: Taller desarrollo de apis

Contacta en:

Email: [email protected]

Web:

http://www.meetup.com/APIAddicts

Siguenos en:

➢ Linkedin: ApiAddicts

➢ Twitter: @apiaddicts

➢ Facebook: APIAddicts

➢ Meetup: APIAddicts

Contacta