{"id":239,"date":"2021-10-27T00:58:36","date_gmt":"2021-10-27T00:58:36","guid":{"rendered":"https:\/\/constancy.com.ar\/wp\/?p=239"},"modified":"2021-10-27T01:00:40","modified_gmt":"2021-10-27T01:00:40","slug":"api-rest-sencilla-con-nodejs-y-express","status":"publish","type":"post","link":"https:\/\/constancy.com.ar\/wp\/2021\/10\/27\/api-rest-sencilla-con-nodejs-y-express\/","title":{"rendered":"API REST sencilla con NodeJS y Express"},"content":{"rendered":"
\n

\"Creating<\/h1>\n<\/div>\n

Actualmente a\u00fan hay muchas empresas que siguen utilizando el cl\u00e1sico WebService viejo con XML con el que tienes que entender c\u00f3mo demonios mandarle los datos y c\u00f3mo demonios responde y es demasiado complicado para hacer una solicitud sencilla y las API REST est\u00e1n aqu\u00ed para salvarnos de esa complejidad ya que gracias al env\u00edo de datos por medio de JSON o su recepci\u00f3n por este medio podemos hacer desarrollo m\u00e1s r\u00e1pido.<\/p>\n

Hoy en d\u00eda las API\u00a0R<\/span>EST est\u00e1n en un gran apogeo ya que la mayor\u00eda hace uso de esta tecnolog\u00eda para poder como menciono, enviar y recibir datos de forma sencilla y r\u00e1pida, aunque una tecnolog\u00eda que est\u00e1 en crecimiento es el GraphQL que busca reemplazar a las API REST para hacerlas a\u00fan m\u00e1s sencillas y a la vez m\u00e1s robustas.<\/p>\n

Las API REST aprovechan los m\u00e9todos HTTP, desde un simple POST o GET hasta m\u00e9todos personalizados, sin embargo, nosotros veremos \u00fanicamente POST, GET, PUT y DELETE en su forma m\u00e1s sencilla y las Headers que son para autenticaci\u00f3n, decirle qu\u00e9 tipo de dato va, etc. Pero esto no lo veremos aqu\u00ed.<\/p>\n

Asimismo, utilizaremos a Express para ser nuestro servidor HTTP, una recomendaci\u00f3n es que, las API REST siempre est\u00e9n detr\u00e1s de Nginx ya que en caso de falla, Nginx puede seguir respondiendo, adem\u00e1s que, permite una mejor manipulaci\u00f3n de datos, protecci\u00f3n de enlaces y dem\u00e1s cosas pero tampoco veremos esto en este tutorial, solo quise mencionarlo.<\/p>\n

Bueno, si ya tenemos NodeJS y NPM instalados, entonces manos a la obra y si no,\u00a0https:\/\/nodejs.org\/es\/download\/<\/a>\u00a0aqu\u00ed pueden descargar el paquete, el proceso de instalaci\u00f3n como de costumbre no lo voy a explicar.<\/p>\n

Inicializando una nueva app<\/h1>\n

Para inicializar nuestra primer API REST hay 3 modos, creando el\u00a0package.json<\/code>\u00a0a mano (no recomendado), haciendo uso del comando\u00a0npm init<\/code>\u00a0(de cierta forma el m\u00e1s recomendado) o usando la dependencia de\u00a0express-generator<\/code>\u00a0pero en esta ocasi\u00f3n haremos uso del\u00a0npm init<\/code>\u00a0para ello, nos ponemos en la consola de comandos (Linux, Windows o Mac, en mi caso Windows) y navegamos al directorio donde queremos que est\u00e9 nuestra API REST, en mi caso, mi carpeta de\u00a0Documentos\u00a0<\/code>en una carpeta llamada,\u00a0api<\/code>\u00a0. Dentro de esta carpeta corremos el comando previamente mencionado y nos ir\u00e1n apareciendo una serie de preguntas:<\/p>\n

Primero nos pedir\u00e1 el nombre del paquete (en si, es el nombre de nuestro proyecto), aqu\u00ed ponemos\u00a0api-rest<\/code><\/p>\n

Despu\u00e9s nos pedir\u00e1 la versi\u00f3n del proyecto, pondremos 1.0.0 (cabe mencionar que en estos casos podemos dejar las defaults dando enter nada m\u00e1s)<\/p>\n

En descripci\u00f3n pondremos \u201cMi primer API REST\u201d.<\/p>\n

Luego en la parte de entry point nos pide c\u00f3mo se llamar\u00e1 nuestro archivo de entrada, el principal digamos. Dejaremos\u00a0index.js<\/code>\u00a0tal cual.<\/p>\n

Despu\u00e9s nos pide un comando de prueba, un repositorio de git, palabras clave que dejaremos vac\u00edas, solo damos enter. La parte de autor, ponemos nuestro nombre si gustan.<\/p>\n

Por \u00faltimo nos pide una licencia, pondremos MIT (aunque tambi\u00e9n se puede dejar la que est\u00e1 o poner Private) si lo desean, no es relevante a menos que vayan a liberar su API REST por alguna raz\u00f3n.<\/p>\n

Una vez que tenemos esto, nos dice,\u00a0\u00bfEst\u00e1 todo correcto?<\/em>\u00a0y le decimos que si dando enter.<\/p>\n

Si ya qued\u00f3, entonces se generar\u00e1 en nuestra carpeta nuestro archivo\u00a0package.json<\/code>\u00a0y si es as\u00ed, entonces sigue instalar Express, para ello corremos el siguiente comando:<\/p>\n

npm install express --save<\/code><\/p>\n

Con esto, la dependencia de express se instala y se guarda en nuestro package y estamos listos para empezar.<\/p>\n

Empezando con nuestra API<\/h1>\n

Como hab\u00eda mencionado previamente a la hora de inicializar nuestro proyecto, decidimos que nuestro archivo de entrada se llamara\u00a0index.js<\/code>\u00a0y es por ello que entonces crearemos este archivo en la carpeta ra\u00edz (\u00a0...\/Documents\/api\/index.js<\/code>\u00a0) y dentro le pondremos el siguiente c\u00f3digo:<\/p>\n

const express = require(\"express\");\r\nconst app = express();<\/span>app.listen(3000, () => {\r\n console.log(\"El servidor est\u00e1 inicializado en el puerto 3000\");\r\n});<\/span><\/pre>\n

La primer l\u00ednea llama a express y la asigna, despu\u00e9s, nuestra segunda l\u00ednea la reasigna a app y as\u00ed, tenemos el objeto de express para llamar\u00a0listen<\/code>\u00a0en nuestra cuarta l\u00ednea y ah\u00ed, le pasamos los par\u00e1metros para que inicialice el servidor.<\/p>\n

Vamos a ejecutar el comando\u00a0node index.js<\/code>\u00a0y \u00a1\u00c9xito!, tenemos nuestro primer servidor, el cual, ya es\u00a0accesible<\/em>\u00a0desde\u00a0localhost:3000<\/code>\u00a0pero, al abrir esto en nuestro navegador nos muestra un error, \u00bfqu\u00e9 pas\u00f3?.<\/p>\n

Bueno, en este caso hemos iniciado un servidor pero Express no tiene ninguna declaraci\u00f3n, es decir, ninguna ruta por lo que no sabe a d\u00f3nde ir. Vamos a agregar la siguiente l\u00ednea arriba de\u00a0app.listen(...)<\/code>\u00a0:<\/p>\n

app.get('\/', function (req, res) {\r\n  res.send('Saludos desde express');\r\n});<\/span><\/pre>\n

Detenemos nuestro servidor con CTRL+C (recordemos que yo estoy usando Windows por lo que este tipo de cosas ser\u00e1 orientado a este SO) y despu\u00e9s lo volvemos a iniciar con\u00a0node index.js<\/code>\u00a0, actualizamos la p\u00e1gina en el navegador y, \u00a1vual\u00e1!, tenemos una p\u00e1gina de inicio que nos muestra\u00a0Saludos desde express.<\/em><\/p>\n

\u00bfQu\u00e9 pas\u00f3 aqu\u00ed?, bueno, con\u00a0.get()<\/code>\u00a0le dimos que la ruta ra\u00edz\u00a0\/<\/code>\u00a0ser\u00e1 la que reciba de entrada nuestras peticiones por el m\u00e9todo GET.<\/p>\n

Veamos r\u00e1pido los m\u00e9todos:<\/p>\n

GET es el m\u00e9todo que permite obtener un recurso desde la URL. Es decir, si yo tengo\u00a0http:\/\/localhost:3000\/hola<\/code>\u00a0el recurso solicitado es\u00a0\/hola<\/code>\u00a0si en express modificamos el primer par\u00e1metro por\u00a0\/hola<\/code>\u00a0y vamos a la direcci\u00f3n previamente mencionada veremos el saludo, pero si vamos a la ra\u00edz de nuevo, veremos el mismo error de hace un momento.<\/p>\n

POST es un m\u00e9todo que permite el env\u00edo de informaci\u00f3n del cliente hacia nuestro servidor, y puede\u00a0combinarse<\/em>\u00a0(por as\u00ed decirlo) con una parte de GET ya que, POST tambi\u00e9n puede saber la URL en la cual estar\u00e1 recibiendo este m\u00e9todo. Si nosotros cambiamos\u00a0.get(...)<\/code>\u00a0por\u00a0.post(...)<\/code>\u00a0y vamos a la misma URL de\u00a0\/hola<\/code>\u00a0veremos un error, pero, si hacemos uso de una herramienta tercera y le mandamos un POST (como ARC) veremos \u201cSaludos desde express\u201d:<\/p>\n

\n
\n
\n
\n
\n
<\/div>\n

\"\"<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n

Ahora, si duplicamos el c\u00f3digo y lo ponemos en ambos casos, con GET y POST y visitamos el link, podemos ver que funcionan ambos casos, pero modifiquemos un poco el c\u00f3digo quedando algo como esto:<\/p>\n

const express = require(\"express\");\r\nconst app = express();<\/span>app.post('\/hola', function (req, res) {\r\n  res.send('[POST]Saludos desde express');\r\n});<\/span>app.get('\/hola', function (req, res) {\r\n  res.send('[GET]Saludos desde express');\r\n});<\/span>app.listen(3000, () => {\r\n console.log(\"El servidor est\u00e1 inicializado en el puerto 3000\");\r\n});<\/span><\/pre>\n

Y como sabemos, necesitamos reiniciar nuestro servidor cada vez que hagamos cambios, esto se puede evitar con Nodemon o PM2 pero no los veremos haremos todo una y otra vez por ahora.<\/p>\n

Si visitamos\u00a0http:\/\/localhost:3000\/hola<\/code>\u00a0veremos\u00a0[GET]Saludos desde express<\/code>\u00a0y si le mandamos un POST a la misma direcci\u00f3n veremos\u00a0[POST]Saludos desde express<\/code><\/p>\n

As\u00ed es como manejamos, GET y POST. A su vez como mencion\u00e9 previamente est\u00e1 PUT, este m\u00e9todo es id\u00e9ntico a POST y DELETE es id\u00e9ntico a GET.<\/p>\n

\u00bfPero en qu\u00e9 se diferencian?, vamos a hacerlo de la siguiente forma:<\/p>\n

    \n
  • GET = Obtener<\/li>\n
  • POST = Crear<\/li>\n
  • PUT = Actualizar<\/li>\n
  • DELETE = Eliminar<\/li>\n<\/ul>\n

    Entonces, entendiendo esto, podemos reutilizar la misma URL con distintos m\u00e9todos, por ejemplo pensando que tenemos una libreta de direcciones podemos usar la URL\u00a0\/usuario<\/code>\u00a0para obtener un usuario en GET, POST para crearlo, PUT para actualizarlo y DELETE Para eliminarlo.<\/p>\n

    Vamos a crear un objeto global entonces aprovechando esta idea, con la siguiente informaci\u00f3n:<\/p>\n

    let usuario = {\r\n nombre:'',\r\n apellido: ''\r\n};<\/span><\/pre>\n

    Y modificaremos el c\u00f3digo base para tener las 4 opciones disponibles, GET, POST, PUT, DELETE con su respectiva direcci\u00f3n en\u00a0\/usuario<\/code>\u00a0plus, dos direcciones, una para el error 404 de una ruta no encontrada y, una para la ra\u00edz\u00a0\/<\/code>\u00a0.<\/p>\n

    Por \u00faltimo agregaremos una variable de\u00a0datos<\/code>\u00a0que nos permitir\u00e1 enviar la respuesta del servidor al cliente que nos consulta esa informaci\u00f3n.<\/p>\n

    Voy a poner primero todo el c\u00f3digo y despu\u00e9s iremos desmenuzando por partes, pero antes de ponerlo, necesitaremos una dependencia adicional para el manejo de datos en la recepci\u00f3n (es decir, manejar m\u00e1s f\u00e1cil los datos de POST a nuestro servidor), para ello instalamos con:<\/p>\n

    npm install body-parser --save<\/code><\/p>\n

    Una vez hecho esto ahora s\u00ed, al c\u00f3digo:<\/p>\n

    const express = require(\"express\");\r\nconst bodyParser = require('body-parser');\r\nconst app = express();<\/span>app.use(bodyParser.urlencoded({ extended: false }));\r\napp.use(bodyParser.json());<\/span>let usuario = {\r\n nombre:'',\r\n apellido: ''\r\n};<\/span>let respuesta = {\r\n error: false,\r\n codigo: 200,\r\n mensaje: ''\r\n};<\/span>app.get('\/', function(req, res) {\r\n respuesta = {\r\n  error: true,\r\n  codigo: 200,\r\n  mensaje: 'Punto de inicio'\r\n };\r\n res.send(respuesta);\r\n});<\/span>app.get('\/usuario', function (req, res) {\r\n respuesta = {\r\n  error: false,\r\n  codigo: 200,\r\n  mensaje: ''\r\n };\r\n if(usuario.nombre === '' || usuario.apellido === '') {\r\n  respuesta = {\r\n   error: true,\r\n   codigo: 501,\r\n   mensaje: 'El usuario no ha sido creado'\r\n  };\r\n } else {\r\n  respuesta = {\r\n   error: false,\r\n   codigo: 200,\r\n   mensaje: 'respuesta del usuario',\r\n   respuesta: usuario\r\n  };\r\n }\r\n res.send(respuesta);\r\n});<\/span>app.post('\/usuario', function (req, res) {\r\n if(!req.body.nombre || !req.body.apellido) {\r\n  respuesta = {\r\n   error: true,\r\n   codigo: 502,\r\n   mensaje: 'El campo nombre y apellido son requeridos'\r\n  };\r\n } else {\r\n  if(usuario.nombre !== '' || usuario.apellido !== '') {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 503,\r\n    mensaje: 'El usuario ya fue creado previamente'\r\n   };\r\n  } else {\r\n   usuario = {\r\n    nombre: req.body.nombre,\r\n    apellido: req.body.apellido\r\n   };\r\n   respuesta = {\r\n    error: false,\r\n    codigo: 200,\r\n    mensaje: 'Usuario creado',\r\n    respuesta: usuario\r\n   };\r\n  }\r\n }\r\n \r\n res.send(respuesta);\r\n});<\/span>app.put('\/usuario', function (req, res) {\r\n if(!req.body.nombre || !req.body.apellido) {\r\n  respuesta = {\r\n   error: true,\r\n   codigo: 502,\r\n   mensaje: 'El campo nombre y apellido son requeridos'\r\n  };\r\n } else {\r\n  if(usuario.nombre === '' || usuario.apellido === '') {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 501,\r\n    mensaje: 'El usuario no ha sido creado'\r\n   };\r\n  } else {\r\n   usuario = {\r\n    nombre: req.body.nombre,\r\n    apellido: req.body.apellido\r\n   };\r\n   respuesta = {\r\n    error: false,\r\n    codigo: 200,\r\n    mensaje: 'Usuario actualizado',\r\n    respuesta: usuario\r\n   };\r\n  }\r\n }\r\n \r\n res.send(respuesta);\r\n});<\/span>app.delete('\/usuario', function (req, res) {\r\n if(usuario.nombre === '' || usuario.apellido === '') {\r\n  respuesta = {\r\n   error: true,\r\n   codigo: 501,\r\n   mensaje: 'El usuario no ha sido creado'\r\n  };\r\n } else {\r\n  respuesta = {\r\n   error: false,\r\n   codigo: 200,\r\n   mensaje: 'Usuario eliminado'\r\n  };\r\n  usuario = { \r\n   nombre: '', \r\n   apellido: '' \r\n  };\r\n }\r\n res.send(respuesta);\r\n});<\/span>app.use(function(req, res, next) {\r\n respuesta = {\r\n  error: true, \r\n  codigo: 404, \r\n  mensaje: 'URL no encontrada'\r\n };\r\n res.status(404).send(respuesta);\r\n});<\/span>app.listen(3000, () => {\r\n console.log(\"El servidor est\u00e1 inicializado en el puerto 3000\");\r\n});<\/span><\/pre>\n

    Lo primero, nuevamente, es cargar express, pero ahora tambi\u00e9n cargamos el body-parser e inicializar express en nuestra constante\u00a0app<\/code>\u00a0. Posterior, gracias a body-parser podremos manejar los datos en formato JSON de la recepci\u00f3n en POST\/PUT desde el cliente, es decir, que, cuando el cliente haga una petici\u00f3n, indicar\u00e1 la cabecera\u00a0Content-Type: application\/json<\/code>\u00a0y nuestra API va a servir esta petici\u00f3n ejecutando lo que el cliente necesita.<\/p>\n

    Despu\u00e9s, creamos la variable\u00a0usuario<\/code>\u00a0para tener sus propiedades previamente asignadas de forma global, as\u00ed como una variable llamada\u00a0respuesta<\/code>que nos permitir\u00e1 enviar una respuesta hacia el cliente.<\/p>\n

    Posterior creamos una ruta ra\u00edz\u00a0\/<\/code>\u00a0que nos permitir\u00e1 poder mostrar una base de nuestra API.<\/p>\n

    Por \u00faltimo el caso del error 404 que previamente comentaba.<\/p>\n

    Y ahora s\u00ed, nuestro primer m\u00e9todo, en\u00a0GET<\/code>\u00a0vamos a revisar, \u00bfel cliente ya se cre\u00f3?, si no se ha creado, entonces asignamos el error a nuestra variable de respuesta, en otro caso, mandamos el usuario en la respuesta y le indicamos al cliente que todo bien.<\/p>\n

    \n
    \n
    \n
    \n
    \"\"<\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el usuario no se ha creado<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el usuario ya se cre\u00f3<\/figcaption><\/figure>\n

    Despu\u00e9s en\u00a0POST<\/code>\u00a0revisamos si, el cuerpo del POST incluye el nombre y el apellido, si no los incluye, mostraremos un error, si lo incluye pero el usuario no est\u00e1 vac\u00edo, mostramos un error pero si est\u00e1 vac\u00edo e incluye los par\u00e1metros solicitados, entonces lo creamos y le respondemos al cliente con la informaci\u00f3n.<\/p>\n

    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el usuario ya se cre\u00f3<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el POST no est\u00e1 correcto<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando se crea el usuario<\/figcaption><\/figure>\n

    Siguiente en\u00a0PUT<\/code>\u00a0vamos a recibir la solicitud, seguimos la misma l\u00f3gica que en POST pero, si en este caso, est\u00e1 vac\u00edo el nombre o el apellido significa que no ha sido creado el usuario, por lo tanto no hay nada que actualizar, sin embargo, si no est\u00e1 vac\u00edo y recibimos ambos par\u00e1metros, entonces, actualizamos al usuario.<\/p>\n

    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso cuando el usuario no ha sido creado<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso cuando alg\u00fan campo no est\u00e1 incluido<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso del usuario actualizado<\/figcaption><\/figure>\n

    Por \u00faltimo tenemos el DELETE que eliminar\u00e1 al usuario.<\/p>\n

    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el usuario no ha sido creado<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>

    Caso para cuando el usuario se elimina<\/figcaption><\/figure>\n

    Hasta aqu\u00ed creo que ya se entendi\u00f3 la base de qu\u00e9 es cada uno, dejar\u00e9 un ejemplo de ARC (es una extensi\u00f3n\/aplicaci\u00f3n de Chrome que yo utilizo pero pueden usar otras como POSTMAN o cualquier otro que les sirva para probar):<\/p>\n

    \n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>

    Esta es la vista del body<\/figcaption><\/figure>\n
    \n
    \n
    \n
    \n
    \n
    <\/div>\n

    \"\"<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>

    Y esta es la vista de los Headers<\/figcaption><\/figure>\n

    Ahora, vamos a modificar y simplificar un poco nuestro c\u00f3digo usando\u00a0app.route()<\/code>\u00a0de express, que nos permite agrupar la misma URL que responder\u00e1 a distintos m\u00e9todos ya que los vimos por separado y dejaremos este tutorial hasta aqu\u00ed.<\/p>\n

    const express = require(\"express\");\r\nconst bodyParser = require('body-parser');\r\nconst app = express();<\/span>app.use(bodyParser.urlencoded({ extended: false }));\r\napp.use(bodyParser.json());<\/span>let usuario = {\r\n nombre:'',\r\n apellido: ''\r\n};<\/span>let respuesta = {\r\n error: false,\r\n codigo: 200,\r\n mensaje: ''\r\n};<\/span>app.get('\/', function(req, res) {\r\n respuesta = {\r\n  error: true,\r\n  codigo: 200,\r\n  mensaje: 'Punto de inicio'\r\n };\r\n res.send(respuesta);\r\n});<\/span>app.route('\/usuario')\r\n .get(function (req, res) {\r\n  respuesta = {\r\n   error: false,\r\n   codigo: 200,\r\n   mensaje: ''\r\n  };\r\n  if(usuario.nombre === '' || usuario.apellido === '') {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 501,\r\n    mensaje: 'El usuario no ha sido creado'\r\n   };\r\n  } else {\r\n   respuesta = {\r\n    error: false,\r\n    codigo: 200,\r\n    mensaje: 'respuesta del usuario',\r\n    respuesta: usuario\r\n   };\r\n  }\r\n  res.send(respuesta);\r\n })\r\n .post(function (req, res) {\r\n  if(!req.body.nombre || !req.body.apellido) {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 502,\r\n    mensaje: 'El campo nombre y apellido son requeridos'\r\n   };\r\n  } else {\r\n   if(usuario.nombre !== '' || usuario.apellido !== '') {\r\n    respuesta = {\r\n     error: true,\r\n     codigo: 503,\r\n     mensaje: 'El usuario ya fue creado previamente'\r\n    };\r\n   } else {\r\n    usuario = {\r\n     nombre: req.body.nombre,\r\n     apellido: req.body.apellido\r\n    };\r\n    respuesta = {\r\n     error: false,\r\n     codigo: 200,\r\n     mensaje: 'Usuario creado',\r\n     respuesta: usuario\r\n    };\r\n   }\r\n  }\r\n  \r\n  res.send(respuesta);\r\n })\r\n .put(function (req, res) {\r\n  if(!req.body.nombre || !req.body.apellido) {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 502,\r\n    mensaje: 'El campo nombre y apellido son requeridos'\r\n   };\r\n  } else {\r\n   if(usuario.nombre === '' || usuario.apellido === '') {\r\n    respuesta = {\r\n     error: true,\r\n     codigo: 501,\r\n     mensaje: 'El usuario no ha sido creado'\r\n    };\r\n   } else {\r\n    usuario = {\r\n     nombre: req.body.nombre,\r\n     apellido: req.body.apellido\r\n    };\r\n    respuesta = {\r\n     error: false,\r\n     codigo: 200,\r\n     mensaje: 'Usuario actualizado',\r\n     respuesta: usuario\r\n    };\r\n   }\r\n  }\r\n  \r\n  res.send(respuesta);\r\n })\r\n .delete(function (req, res) {\r\n  if(usuario.nombre === '' || usuario.apellido === '') {\r\n   respuesta = {\r\n    error: true,\r\n    codigo: 501,\r\n    mensaje: 'El usuario no ha sido creado'\r\n   };\r\n  } else {\r\n   respuesta = {\r\n    error: false,\r\n    codigo: 200,\r\n    mensaje: 'Usuario eliminado'\r\n   };\r\n   usuario = { \r\n    nombre: '', \r\n    apellido: '' \r\n   };\r\n  }\r\n  res.send(respuesta);\r\n });<\/span>app.use(function(req, res, next) {\r\n respuesta = {\r\n  error: true, \r\n  codigo: 404, \r\n  mensaje: 'URL no encontrada'\r\n };\r\n res.status(404).send(respuesta);\r\n});<\/span>app.listen(3000, () => {\r\n console.log(\"El servidor est\u00e1 inicializado en el puerto 3000\");\r\n});<\/span><\/pre>\n

    De esta forma agrupamos la URL\u00a0\/usuario<\/code>\u00a0y ya podemos utilizar sus m\u00e9todos ya que por ejemplo, pensemos que la URL\u00a0\/usuario<\/code>\u00a0no deber\u00eda poder eliminar usuarios, borramos el\u00a0.delete()<\/code>\u00a0de estos y su contenido y listo, el DELETE queda desactivado de esta URL y as\u00ed, si hacemos un m\u00f3dulo por ejemplo, podemos exportar estas rutas y hacer nuestro c\u00f3digo m\u00e1s sencillo.<\/p>\n

    \u00bfQu\u00e9 se puede mejorar en este c\u00f3digo?, que detecte si el tipo de contenido no sea\u00a0application\/json<\/code>\u00a0nos rechace, una forma m\u00e1s sencilla de setear la respuesta con una funci\u00f3n, meter un servicio de autorizaci\u00f3n, entre muchas, muchas, muchas otras.<\/p>\n

    Conclusi\u00f3n<\/h1>\n

    En conclusi\u00f3n un API REST es una interfaz donde podemos conectar nuestras aplicaciones para obtener, crear, actualizar o eliminar datos de forma sencilla, ya sea nosotros como clientes, o como proveedores del servicio permitir a otros realizar estas acciones gracias a los distintos m\u00e9todos b\u00e1sicos (o principales) de HTTP (POST, GET, PUT, DELETE).<\/p>\n

    Se puede reutilizar la misma direcci\u00f3n para hacer distintas acciones.<\/p>\n

    GET sirve para obtener, POST para crear, PUT para actualizar y DELETE para eliminar.<\/p>\n

    Aprendimos a inicializar una app en NodeJS y a crear un servidor en Express y usarlo en su forma b\u00e1sica.<\/p>\n

    Y antes de irnos, te dejo una tarea, investiga qu\u00e9 es un servidor HTTP (para saber m\u00e1s de Express), investiga acerca de NPM para saber acerca de las dependencias, investiga m\u00e1s acerca de la autenticaci\u00f3n en APIs REST y sigue adelante con qu\u00e9 son las APIs REST investigando m\u00e1s y m\u00e1s.<\/p>\n","protected":false},"excerpt":{"rendered":"

    Actualmente a\u00fan hay muchas empresas que siguen utilizando el cl\u00e1sico WebService viejo con XML con el que tienes que entender c\u00f3mo demonios mandarle los datos y c\u00f3mo demonios responde y es demasiado complicado para hacer una solicitud sencilla y las API REST est\u00e1n aqu\u00ed para salvarnos de esa complejidad ya que gracias al env\u00edo de […]<\/p>\n","protected":false},"author":1,"featured_media":240,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[57,58,60,61,59],"_links":{"self":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/239"}],"collection":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/comments?post=239"}],"version-history":[{"count":2,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/239\/revisions"}],"predecessor-version":[{"id":242,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/239\/revisions\/242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/media?parent=239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/categories?post=239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/tags?post=239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}