¿Alguna vez se preguntó cómo funciona el inicio de sesión / registro en un sitio web en el back-end? ¿O cómo cuando buscas "lindos gatitos" en YouTube, obtienes un montón de resultados y puedes transmitir desde una máquina remota?
En esta guía amigable para principiantes, lo guiaré a través del proceso de configuración de una API RESTful. Desclasificaremos parte de la jerga y veremos cómo podemos codificar un servidor en NodeJS. ¡Profundicemos un poco más en JavaScript!
Quita esa jerga
Entonces, ¿qué es REST? Según Wikipedia:
La transferencia de estado representacional ( REST ) es un estilo de arquitectura de software que define un conjunto de restricciones que se utilizarán para crear servicios web. Los servicios web RESTful permiten que los sistemas solicitantes accedan y manipulen representaciones textuales de recursos web mediante el uso de un conjunto uniforme y predefinido de operaciones sin estado.Desmitifiquemos lo que eso significa (con suerte, tienes la forma completa). REST es básicamente un conjunto de reglas para la comunicación entre un cliente y un servidor. Hay algunas limitaciones en la definición de REST:
- Arquitectura cliente-servidor : la interfaz de usuario del sitio web / aplicación debe estar separada de la solicitud / almacenamiento de datos, por lo que cada parte se puede escalar individualmente.
- Apatridia : la comunicación no debe tener un contexto de cliente almacenado en el servidor. Esto significa que cada solicitud al servidor debe realizarse con todos los datos requeridos y no se deben hacer suposiciones si el servidor tiene datos de solicitudes anteriores.
- Sistema en capas : el cliente no debería poder decir si se está comunicando directamente con el servidor o algún intermediario. Estos servidores intermediarios (ya sean proxy o equilibradores de carga) permiten la escalabilidad y la seguridad del servidor subyacente.
Bien, ahora que sabe qué son los servicios RESTful, estos son algunos de los términos utilizados en el encabezado:
- Cliente REST : código o aplicación que puede acceder a estos servicios REST. ¡Estás usando uno ahora mismo! Sí, el navegador puede actuar como un cliente REST no controlado (el sitio web maneja las solicitudes del navegador). El navegador, durante mucho tiempo, utilizó una función incorporada llamada XMLHttpRequest para todas las solicitudes REST. Pero, esto fue reemplazado por FetchAPI, un enfoque moderno basado en promesas para las solicitudes. Otros ejemplos son bibliotecas de código como axios, superagent y got o algunas aplicaciones dedicadas como Postman (o una versión en línea, postwoman!), O una herramienta de línea de comandos como cURL !.
- Servicio REST : el servidor. Hay muchas bibliotecas populares que facilitan la creación de estos servidores, como ExpressJS para NodeJS y Django para Python.
- API REST : define el punto final y los métodos permitidos para acceder / enviar datos al servidor. Hablaremos de esto con gran detalle a continuación. Otras alternativas a esto son: GraphQL, JSON-Pure y oData.
Entonces dime ahora, ¿cómo se ve REST?
En términos muy generales, le pides al servidor ciertos datos o le pides que guarde algunos datos, y el servidor responde a las solicitudes.
En términos de programación, hay un punto final (una URL) que el servidor está esperando para recibir una solicitud. Nos conectamos a ese punto final y enviamos algunos datos sobre nosotros (recuerde, REST no tiene estado, no se almacenan datos sobre la solicitud) y el servidor responde con la respuesta correcta.
Las palabras son aburridas, déjame darte una demostración. Usaré Postman para mostrarte la solicitud y la respuesta:

Los datos devueltos están en JSON (JavaScript Object Notation) y se puede acceder a ellos directamente.
Aquí, //official-joke-api.appspot.com/random_joke
se denomina punto final de una API. Habrá un servidor escuchando en ese punto final para solicitudes como la que hicimos.
Anatomía del DESCANSO:
Muy bien, ahora sabemos que el cliente puede solicitar datos y el servidor responderá de manera adecuada. Veamos más a fondo cómo se forma una solicitud.
- Punto final : ya te he hablado de esto. Para actualizar, es la URL donde está escuchando el servidor REST.
- Método : anteriormente, escribí que puede solicitar datos o modificarlos, pero ¿cómo sabrá el servidor qué tipo de operación desea realizar el cliente? REST implementa múltiples 'métodos' para diferentes tipos de solicitud, los siguientes son los más populares:
- GET : Obtiene un recurso del servidor.
- POST : crea un recurso para el servidor.
- PATCH o PUT : Actualiza el recurso existente en el servidor.
- BORRAR : Elimina el recurso existente del servidor.
- Encabezados : los detalles adicionales proporcionados para la comunicación entre el cliente y el servidor (recuerde, REST no tiene estado). Algunos de los encabezados comunes son:
Solicitud:
- host : la IP del cliente (o desde donde se originó la solicitud)
- accept-language : lenguaje comprensible para el cliente
- user-agent : datos sobre el cliente, el sistema operativo y el proveedor
Respuesta :
- estado : el estado de la solicitud o código HTTP.
- content-type : tipo de recurso enviado por el servidor.
- set-cookie : establece cookies por servidor
- Datos : (también llamado cuerpo o mensaje) contiene información que desea enviar al servidor.
Suficiente con los detalles, muéstrame el código.
Comencemos a codificar un servicio REST en Node. Implementaremos todas las cosas que aprendimos anteriormente. También usaremos ES6 + para escribir nuestro servicio.
Asegúrese de tener Node.JS instalado node
y de que npm
esté disponible en su ruta. Usaré Node 12.16.2 y NPM 6.14.4.
Cree un directorio rest-service-node
y cd en él:
mkdir rest-service-node cd rest-service-node
Inicialice el proyecto de nodo:
npm init -y
La -y
bandera omite todas las preguntas. Si desea completar todo el cuestionario, simplemente ejecute npm init
.
Let's install some packages. We will be using the ExpressJS framework for developing the REST Server. Run the following command to install it:
npm install --save express body-parser
What's body-parser
there for? Express, by default, is incapable of handling data sent via POST request as JSON. body-parser
allows Express to overcome this.
Create a file called server.js
and add the following code:
const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.use(bodyParser.json()); app.listen(5000, () => { console.log(`Server is running on port 5000.`); });
The first two lines are importing Express and body-parser.
Third line initializes the Express server and sets it to a variable called app
.
The line, app.use(bodyParser.json());
initializes the body-parser plugin.
Finally, we are setting our server to listen on port 5000
for requests.
Getting data from the REST Server:
To get data from a server, we need a GET
request. Add the following code before app.listen
:
const sayHi = (req, res) => { res.send("Hi!"); }; app.get("/", sayHi);
We have created a function sayHi
which takes two parameters req
and res
(I will explain later) and sends a 'Hi!' as response.
app.get()
takes two parameters, the route path and function to call when the path is requested by the client. So, the last line translates to: Hey server, listen for requests on the '/' (think homepage) and call the sayHi
function if a request is made.
app.get
also gives us a request
object containing all the data sent by the client and a response
object which contains all the methods with which we can respond to the client. Though these are accessible as function parameters, the general naming convention suggests we name them res
for response
and req
for request
.
Enough chatter. Let's fire up the server! Run the following server:
node server.js
If everything is successful, you should see a message on console saying: Server is running on port 5000.
Note: You can change the port to whatever number you want.

Open up your browser and navigate to //localhost:5000/
and you should see something like this:

There you go! Your first GET
request was successful!
Sending data to REST Server:
As we have discussed earlier, let's setup how we can implement a POST
request into our server. We will be sending in two numbers and the server will return the sum of the numbers. Add this new method below the app.get
:
app.post("/add", (req, res) => { const { a, b } = req.body; res.send(`The sum is: ${a + b}`); });
Here, we will be sending the data in JSON format, like this:
{ "a":5, "b":10 }
Let's get over the code:
On line 1, we are invoking the .post()
method of ExpressJS, which allows the server to listen for POST
requests. This function takes in the same parameters as the .get()
method. The route that we are passing is /add
, so one can access the endpoint as //your-ip-address:port/add
or in our case localhost:5000/add
. We are inlining our function instead of writing a function elsewhere.
On line 2, we have used a bit of ES6 syntax, namely, object destructuring. Whatever data we send via the request gets stored and is available in the body
of the req
object. So essentially, we could've replaced line 2 with something like:
const num1 = req.body.a; const num2 = req.body.b;
On line 3, we are using the send()
function of the res
object to send the result of the sum. Again, we are using template literals from ES6. Now to test it (using Postman):

So we have sent the data 5 and 10 as a
and b
using them as the body. Postman attaches this data to the request and sends it. When the server receives the request, it can parse the data from req.body
, as we did in the code above. The result is shown below.
Alright, the final code:
const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.use(bodyParser.json()); const sayHi = (req, res) => { res.send("Hi!"); }; app.get("/", sayHi); app.post("/add", (req, res) => { const { a, b } = req.body; res.send(`The sum is: ${a + b}`); }); app.listen(5000, () => { console.log(`Server is running on port 5000.`); });
REST Client:
Okay, we have created a server, but how do we access it from our website or webapp? Here the REST client libraries will come in handy.
We will be building a webpage which will contain a form, where you can enter two numbers and we will display the result. Let's start.
First, let's change the server.js
a bit:
const path = require("path"); const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.use(bodyParser.json()); app.get("/", (req, res) => { res.sendFile(path.join(__dirname, "index.html")); }); app.post("/add", (req, res) => { const { a, b } = req.body; res.send({ result: parseInt(a) + parseInt(b) }); }); app.listen(5000, () => { console.log(`Server is running on port 5000.`); });
We imported a new package path
, which is provided by Node, to manipulate path cross-platform. Next we changed the GET
request on '/' and use another function available in res
, ie. sendFile
, which allows us to send any type of file as response. So, whenever a person tries to navigate to '/', they will get our index.html
page.
Finally, we changed our app.post
function to return the sum as JSON and convert both a
and b
to integers.
Let's create an html page, I will call it index.html
, with some basic styling:
REST Client * { margin: 0; padding: 0; box-sizing: border-box; } .container { height: 100vh; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; display: flex; flex-direction: column; justify-content: center; align-items: center; } form { display: flex; flex-direction: column; margin-bottom: 20px; } label, input[type="submit"] { margin-top: 20px; } Simple POST Form
Number 1: Number 2: Click Add!
Let's add a script
tag just before the closing body tag, so we don't need to maintain a .js
file. We will begin by listening for the submit
event and call a function accordingly:
document.addEventListener("submit", sendData);
First we need to prevent page refresh when the 'Add' button is clicked. This can be done using the preventDefault()
function. Then, we will get the value of the inputs at that instant:
function sendData(e) { e.preventDefault(); const a = document.querySelector("#num1").value; const b = document.querySelector("#num2").value; }
Now we will make the call to the server with both these values a
and b
. We will be using the Fetch API, built-in to every browser for this.
Fetch takes in two inputs, the URL endpoint and a JSON request object and returns a Promise. Explaining them here will be out-of-bounds here, so I'll leave that for you.
Continue inside the sendData()
function:
fetch("/add", { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json" }, body: JSON.stringify({ a: parseInt(a), b: parseInt(b) }) }) .then(res => res.json()) .then(data => { const { result } = data; document.querySelector( ".result" ).innerText = `The sum is: ${result}`; }) .catch(err => console.log(err));
First we are passing the relative URL of the endpoint as the first parameter to fetch
. Next, we are passing an object which contains the method we want Fetch to use for the request, which is POST
in this case.
We are also passing headers
, which will provide information about the type of data we are sending (content-type
) and the type of data we accept as response (accept
).
Next we pass body
. Remember we typed the data as JSON while using Postman? We're doing kind of a similar thing here. Since express deals with string as input and processes it according to content-type provided, we need to convert our JSON payload into string. We do that with JSON.stringify()
. We're being a little extra cautious and parsing the input into integers, so it doesn't mess up our server (since we haven't implemented any data-type checking).
Finally, if the promise (returned by fetch) resolves, we will get that response and convert it into JSON. After that, we will get the result from the data
key returned by the response. Then we are simply displaying the result on the screen.
At the end, if the promise is rejected, we will display the error message on the console.
Here's the final code for index.html
:
REST Client * { margin: 0; padding: 0; box-sizing: border-box; } .container { height: 100vh; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; display: flex; flex-direction: column; justify-content: center; align-items: center; } form { display: flex; flex-direction: column; margin-bottom: 20px; } label, input[type="submit"] { margin-top: 20px; } Simple POST Form
Number 1: Number 2: Click Add! document.addEventListener("submit", sendData); function sendData(e) { e.preventDefault(); const a = document.querySelector("#num1").value; const b = document.querySelector("#num2").value; fetch("/add", { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json" }, body: JSON.stringify({ a: parseInt(a), b: parseInt(b) }) }) .then(res => res.json()) .then(data => { const { result } = data; document.querySelector( ".result" ).innerText = `The sum is: ${result}`; }) .catch(err => console.log(err)); }
I have spun up a little app on glitch for you to test.
Conclusion:
So in this post, we learnt about REST architecture and the anatomy of REST requests. We worked our way through by creating a simple REST Server that serves GET
and POST
requests and built a simple webpage that uses a REST Client to display the sum of two numbers.
You can extend this for the remaining types of requests and even implement a full featured back-end CRUD app.
I hope you have learned something from this. If you have any questions, feel free to reach out to me over twitter! Happy Coding!