Upload
start-uc3m
View
433
Download
2
Embed Size (px)
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.
Citation preview
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
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: [email protected]
Web:
http://www.meetup.com/APIAddicts
Siguenos en:
➢ Linkedin: ApiAddicts
➢ Twitter: @apiaddicts
➢ Facebook: APIAddicts
➢ Meetup: APIAddicts
Contacta