taller desarrollo de apis

Post on 08-Jul-2015

433 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

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

Desarrolla tu primera API

Marco Antonio Sanz

¿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/

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

admin@cloudappi.net ·

www.cloudappi.net

❏ 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

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?

➢ 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

➢ Framework javascript para ejecutar código del lado del

servidor. Se ejecuta sobre el V8 de Google.

Aspectos generales

Node.js

➢ 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

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

Utilizamos el proyecto Osprey

Seguimos los pasos que ponen

en Github

Generando el esqueleto

Implementación

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

Instalamos las dependencias

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

Revisamos el app.js

Generando el esqueleto

Implementación

Ejecutamos la aplicación

node app.js

Probamos la consola

localhost:3000/api/consol

e

Probando el fake

Implementación

Probamos la API

try it

Probando el fake

Implementación

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

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

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

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

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

¿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

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

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

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

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

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

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

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

➢ 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

➢ 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

Ruegos y preguntas

Contacta en:

Email: admin@apiaddicts.org

Web:

http://www.meetup.com/APIAddicts

Siguenos en:

➢ Linkedin: ApiAddicts

➢ Twitter: @apiaddicts

➢ Facebook: APIAddicts

➢ Meetup: APIAddicts

Contacta

top related