A lo largo de los años, existieron algunas interfaces de comunicación (API) populares entre cliente y servidor. Sin embargo, el más popular se llama REST definido en 2000 por Roy Fielding. Es una arquitectura que aprovecha el protocolo HTTP para permitir la comunicación entre un cliente y una aplicación de servidor. Una aplicación de servidor que ofrece una API REST también se denomina servidor RESTful. Los servidores que no siguen la arquitectura REST al 100% se llaman RESTish en lugar de RESTful. A continuación, implementaremos dicha API REST para nuestra aplicación de servidor Express, pero primero conozcamos las herramientas que nos permiten interactuar con una API REST.
De MySQL Community Downloads, descargue e instale:
jsontool
de manera global, con: npm i -g jsontool
curl https://dawm-fiec-espol-default-rtdb.firebaseio.com/potterhead.json | json
Que resulta en:
Crea un nuevo proyecto, según Express - Bases, Express - ORM (Básico), Express - ORM (Intermedio) y Express - Parámetros de consulta y Parámetros de ruta.
hito6-api
'/rest/fotos'
en la aplicación para el controlador de rutas rest/fotos.js.var express = require('express');
var router = express.Router();
const { Sequelize, Op } = require('sequelize');
const Foto = require('../models').foto;
const Etiqueta = require('../models').etiqueta;
...
Para obtener TODOS los registros de una entidad en una base de datos relacional, implemente el controlador para el verbo GET con el método findAll de la clase.
Cree el controlador para el verbo GET de la ruta /findAll/json
que retorna un json con todos los fotos.
...
router.get('/findAll/json', function(req, res, next) {
Foto.findAll({
attributes: { exclude: ["updatedAt", "createdAt"] } ,
include: [{
model: Etiqueta,
attributes: ['texto'],
through: {attributes: []}
}],
})
.then(fotos => {
res.json(fotos);
})
.catch(error => res.status(400).send(error))
});
...
Compruebe el funcionamiento del servidor, con: npm run devstart
http://localhost:3000/rest/fotos/findAll/json
curl -X GET http://localhost:3000/rest/fotos/findAll/json | json
Para obtener UN registro de una entidad en una base de datos relacional, implemente el controlador para el verbo GET con el método findOne de la clase.
Cree el controlador para el verbo GET de la ruta /findAll/:id/json
que retorna un json dado el id de un foto.
router.get('/findById/:id/json', function(req, res, next) {
let id = parseInt(req.params.id);
Foto.findAll({
attributes: { exclude: ["updatedAt", "createdAt"] } ,
include: [{
model: Etiqueta,
attributes: ['texto'],
through: {attributes: []}
}],
where: {
[Op.and]: [
{id: id}
]
}
})
.then(fotos => {
res.json(fotos);
})
.catch(error => res.status(400).send(error))
});
Compruebe el funcionamiento del servidor, con: npm run devstart
http://localhost:3000/rest/fotos/findById/2/json
curl -X GET http://localhost:3000/rest/fotos/findById/2/json | json
Para guardar UN registro de una entidad en una base de datos relacional, implemente el controlador para el verbo POST con el método create de la clase.
Cree el controlador para el verbo POST de la ruta /save
que recibe los datos de un foto en el cuerpo del requerimiento y guarda los datos en la base de datos relacional.
router.post('/save', function(req, res, next) {
let {titulo, descripcion, calificacion,ruta} = req.body;
Foto.create({
titulo: titulo,
descripcion: descripcion,
calificacion: parseFloat(calificacion),
ruta: ruta,
createdAt: new Date(),
updatedAt: new Date()
})
.then(foto => {
res.json(foto);
})
.catch(error => res.status(400).send(error))
});
http://localhost:3000/rest/fotos/save
con los siguientes parámetros en el body:curl -X POST -d "titulo=fotos10&descripcion=Lorem ipsum dolor sit amet, consectetur adipiscing elit.&calificacion=4.35&ruta=public/images/fotos10.png" http://localhost:3000/rest/fotos/save | json
Para actualizar UN registro de una entidad en una base de datos relacional, implemente el controlador para el verbo PUT con el método update de la clase.
Cree el controlador para el verbo PUT de la ruta /update
que recibe los datos de una foto en el cuerpo del requerimiento y guarda los datos en la base de datos relacional de acuerdo con el identificador original.
router.put('/update', function(req, res, next) {
let {id, titulo, descripcion, calificacion,ruta} = req.body;
Foto.update({
titulo: titulo,
descripcion: descripcion,
calificacion: parseFloat(calificacion),
ruta: ruta,
createdAt: new Date(),
updatedAt: new Date()
},
{
where: {
id: parseInt(id)
}
})
.then(respuesta => {
res.json(respuesta);
})
.catch(error => res.status(400).send(error))
});
http://localhost:3000/rest/fotos/update
con los siguientes parámetros en el body:curl -X PUT -d "id=11&descripcion=Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.&ruta=public/images/fotos10.png&titulo=foto10&calificacion=4.73" http://localhost:3000/rest/fotos/update | json
Para eliminar UN registro de una entidad en una base de datos relacional, implemente el controlador para el verbo DELETE con el método destroy de la clase.
Cree el controlador para el verbo DELETE de la ruta /delete/:id
que recibe el id de una foto en el cuerpo del requerimiento y elimina el registro de la base de datos relacional.
...
router.delete('/delete/:id', function(req, res, next) {
let id = parseInt(req.params.id);
Foto.destroy({
where: {
id: id
}
})
.then(respuesta => {
res.json(respuesta);
})
.catch(error => res.status(400).send(error))
});
...
http://localhost:3000/rest/fotos/delete/11
con los siguientes parámetros en el body:curl -X DELETE http://localhost:3000/rest/fotos/delete/11 | json