Carpeta API

En una Rest Based Api (api basada en rest), la comunicación se realiza mediante diferentes tipos de request sobre una misma ruta.

Por ejemplo para la ruta /products tendremos los siguientes métodos.

  • GET : muestra los detalles del producto.

  • POST : crea un nuevo producto.

  • PUT : borra el producto y crea uno nuevo en su lugar.

  • DELETE : borra el product.

Es decir, solo cambiando el método del request podemos indicarle a express que realice diferentes operaciones asociadas con un elemento del modelo de negocios de nuestro sistema (en este caso products).

Hello World Api

Para nuestro proyecto vamos a seguir la siguiente convección para crear nuestras rutas de la API api/<your_api_endpoint> por ejemplo api/products o api/users. En esta carpeta es común tener los archivos para modelos, servicios, eventos, controladores, etc.

Crearemos nuestro primer controlador llamado helloWorld.controller.js los controladores serán los encargados de administrar la interacción de la base de datos con la API, tendrá la responsabilidad de consultar, eliminar y crear los datos de nuestra aplicación.

En la sesión de sobre Mongoose abordaremos más de este tema.

Nuestro primer controlador tendrá el siguiente código:

/**
 * Show hello world
 */
function index(req, res) {
  return res.status(200).json({ message: 'hello wolrd!!' });
}

module.exports = { index };

La función index recibe dos parametros request y response.

Express Requests

El objeto request tiene mas propiedades que la petición del http request del cual exitende. Estas propiedades simplifican el desarrollo y proveen funcionalidad adicional.

  • request.params : parametros del url.

  • request.query : parametros del query string.

  • request.route : ruta actual como string.

  • request.cookies : cookies (requiere de cookie parser).

  • request.signedCookies : cookies firmadas (requiere de cookie parser).

  • request.body : contenido del cuerpo de la petición (requiere de cookie parser).

  • request.headers : cabeceras de la petición.

Atajos para el manejo de las cabeceras request.headers.

  • request.get(headerKey) : valor de la cabecera de la cual se especifica su llave.

  • request.accepts(type) : verifica si el tipo es valido.

  • request.acceptsLanguage(language) : verifica el lenguaje.

  • request.appcetsCharset(charset) : verifica el charset.

  • request.is(type) : verifica el tipo.

  • request.ip : dirección ip.

  • request.ips : direcciones ip (cuando se habilita uso del proxy).

  • request.path : path del url.

  • request.host : host.

  • request.fresh : verifica la rescura.

  • request.stale : verifica el estancamiento.

  • request.xhr : verdadero para los ajax requests.

  • request.protocol : retorna el protocolo HTTP.

  • request.secure : verifica si el protocolo es https.

  • request.subdomains : arreglo de subdominios.

  • request.originalUrl : dirección url original.

Express Responses

El response puede ser utilizado y modificado antes de ser enviado de regreso.

Métodos del response.

El objeto response tiene métodos adicionales a statusCode(), writeHead(), end() y write().

  • response.redirect(url) : redireccionar la respuesta.

  • response.send(data) : envía la respuesta.

  • response.json(data) : envia un json de regreso y agrega las cabeceras apropiadas.

  • response.sendfile(path, options, callback) : envía un archivo para descarga.

  • response.render(template, locals, callback) : procesa un template.

  • response.locals : envia datos al template.

HTTP Status Codes.

Para especificar un código de estatus, utilice la función de respuesta response.status(400).

  • 2## : para respuestas de procesos satisfactorios.

  • 3## : para redirecciones o información del cache.

  • 4## : para errores del lado del cliente.

  • 5## : para errores del lado del servidor.

Tome en cuenta que para los errores 3##, el cliente debe realizar una operación adicional para completar la petición.

Algunas respuestas como la 204 no soportan ningún tipo de mensaje dentro del cuerpo de la respuesta.

res.status(203).end();

Como lo hablamos en nuestra sección sobre Express, vamos a manejar una convección llamada Folder-by-feature la cual nos indica que cada carpeta debe contener todo lo necesario para que esa característica funcione.

Ademas en en el punto anterior indicamos que las rutas de cada endpoint contendrá los verbos http mas comunes POST, GET, PUT, DELET, por esta razón vamos a irnos a nuestra carpeta api/helloworld y vamos a crear un archivo index.js que será en el cargado de manejar estos verbos.

api/helloworld/index.js
/**
 * Hello World Endpoint
 */

const { Router } = require('express');
const controller = require('./helloWorld.controller');

const router = new Router();

// All Verbs
router.get('/', controller.index);

/**
 * If we had other verbs HTTP
router.delete('/:id', controller.destroy);
router.put('/:id/', controller.update);
router.get('/:id', controller.show);
router.post('/', controller.create);
*/

module.exports = router;

Last updated