jsdays desarrolla tu primera api

35
Desarrolla tu primera API Marco Antonio Sanz

Upload: meetup

Post on 04-Aug-2015

94 views

Category:

Technology


1 download

TRANSCRIPT

Desarrolla tu primera API

Marco Antonio Sanz

¿Quienes somos?

Grupo de meetuphttp://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 [email protected] · 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 https://anypoint.mulesoft.com url del api designer

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

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

raml de partida

Código ejemplo https://github.com/cloudsystems/meetup.git

Código de ejemplo

Recursos

Implementación

Creamos una APi en el APi portal

Api Portal

Implementación

https://anypoint.mulesoft.com

Importamos el RAML

Api Designer

Implementación

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

Revisando los servicios

Api Designer

Implementación

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

Utilizamos el proyecto Osprey

Seguimos los pasos que ponen en Github

Generando el esqueleto

Implementación

http://raml.org/

https://github.com/mulesoft/osprey

Instalamos Osprey-clinpm install -g osprey-cli

Generamos el esqueletoosprey new --name test --target test

Generando el esqueleto

Implementación

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

Obtenemos el fichero test.raml

Instalamos las dependenciasnpm install (dónde esté package.json)

Revisamos el app.js

Generando el esqueleto

Implementación

Ejecutamos la aplicaciónnode app.js

Probamos la consolalocalhost:3000/api/console

Probando el fake

Implementación

Probamos la APItry 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(err,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(err,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: [email protected]

Web:

http://www.meetup.com/APIAddicts

Siguenos en:

➢ Linkedin: ApiAddicts

➢ Twitter: @apiaddicts

➢ Facebook: APIAddicts

➢ Meetup: APIAddicts

Contacta