¿Qué es la API REST en Node.js?

Una API REST es una interfaz de programación de aplicaciones que se adhiere a las restricciones del estilo arquitectónico REST y permite la interacción con los servicios web RESTful. Las redes interconectadas conforman la web. Un servicio web es un conjunto de protocolos y estándares abiertos que se utilizan para intercambiar datos entre aplicaciones cliente-servidor. Los servicios web que siguen la arquitectura REST se conocen como servicios web RESTful.

¿Qué es una API?

La API (Interfaz de programación de aplicaciones) es un conjunto de comandos, funciones o protocolos que actúan como un intermediario que permite que dos aplicaciones se comuniquen. Es bastante común rastrear la ubicación del repartidor cuando pides comida desde una aplicación de entrega de comida como Zomato. La API de Google Map le permite hacer esto. Entendamos API por la analogía de un restaurante. Cada vez que visitas un restaurante, el mesero te ayuda a hacer tu pedido. Después de tomar su pedido, el camarero le pide al chef que cocine el plato que desea. Cuando la comida está lista, el mesero te la trae. Un camarero sirve de intermediario entre el chef y el cliente en esta situación. El camarero recibe una solicitud (pedido) del cliente (cliente), transmite la solicitud al chef (servidor) y busca el plato preparado (respuesta).

REST : REST significa RE transferencia de estado de presentación . Rest es un estilo arquitectónico para crear sitios web utilizando el protocolo HTTP. Existen ciertas restricciones arquitectónicas que los desarrolladores deben seguir al crear sitios web o API.

Entendamos qué significa transferencia de estado representacional.

Supongamos que tenemos un cliente web y un servidor web (API). El cliente solicita un recurso y el servidor obtiene la respuesta de su base de datos. Recurso se refiere a algo que pertenece exclusivamente al servidor. Cuando un cliente solicita un recurso a través de la API de descanso, el servidor envía una Representación de ese recurso. Entonces, Representación es lo que el servidor envía como respuesta. El estado de un recurso en un momento particular en el tiempo es su estado. La transferencia es la transmisión de datos del servidor al cliente. Por lo tanto, transferencia de Estado Representacional significa la transferencia del estado de Representación del recurso. Estas representaciones se transfieren a través de HTTP a través de varios formatos, incluidos JSON (Notación de objetos de Javascript), HTML, XML o texto sin formato. El formato de archivo más popular es JSON porque puede ser leído tanto por humanos como por máquinas.

Como ejemplo, datos de empleados en formato JSON

[    
   "employee":  
  {    
       "id": 1
       "name":   "Riya",    
       "salary": 50000,    
  }    
]    

Protocolo Http y verbos:Ya hemos discutido que REST funciona en el protocolo HTTP, así que exploremos por qué necesitamos uno. REST siempre se trata de un recurso (NOUN) y SOAP se trata de acción. Ahora, necesitamos la contrapartida de acción del recurso basado en sustantivos para comprender lo que debemos hacer con ese producto. El Protocolo de transferencia de hipertexto define varios métodos (llamados verbos) para determinar la acción que se realizará en un recurso. Se puede acceder al recurso mediante el URI (Uniform Resource Identifier) ​​o la URL. Los verbos (o métodos) HTTP incluyen POST, GET, PUT, PATCH y DELETE. El método GET recupera información del sistema. El método POST se utiliza para crear nuevos recursos. El método PUT se utiliza para actualizar la base de datos con una entrada completamente nueva, reemplazar la anterior o crear un nuevo recurso. El método Patch se utiliza para actualizar parcialmente el recurso existente. Puede comprender mejor lo que hacen los métodos PUT y PATCH si observa el siguiente ejemplo: Amazon le envió una bicicleta que estaba rota. Este problema podría resolverse reemplazando el ciclo completo (PUT) o simplemente reemplazando la parte rota (PATCH). El método de eliminación se utiliza para eliminar un recurso existente. 

¿Por qué DESCANSAR?

  • Cliente y servidor separados : La separación entre cliente y servidor hace que sea muy fácil que el protocolo se use de forma independiente para varios proyectos de desarrollo. Nos permite construir aplicaciones débilmente acopladas, el cliente y el servidor pueden evolucionar por separado. 
    Por ejemplo: el cliente y el servidor pueden no estar preocupados por el software que utilizan.
  • REST es independiente de la plataforma y los idiomas. También puede adaptarse a una variedad de sintaxis y plataformas de trabajo, lo que le permite trabajar en varios proyectos relacionados con el desarrollo. por ejemplo: podemos usar windows o mac os
  • Flexibilidad y escalabilidad : REST es verdaderamente escalable. Esto se debe a la separación de cliente y servidor. Esto significa que el servidor no tiene que mantener las requests de los clientes en su cuerpo ni comunicarse con los clientes.
  • No está limitado por un formato de datos. Proporciona un enfoque flexible mediante la serialización de información en formatos JSON y XML.
  • La caché HTTP se puede utilizar para optimizar la red y aumentar la eficiencia.
  • Fácil de usar y aprender.

Hagamos nuestra propia API RESTful para tener una mejor comprensión. 

Enfoque: Crearemos una API RESTFUL llamada gfg-employees . Insertaremos los datos de los empleados y enviaremos requests HTTP. En este proceso, buscaremos, modificaremos y eliminaremos los datos de los empleados. Robo3T se utilizará para la base de datos. El cartero se utilizará para enviar requests. A continuación se muestra la implementación paso a paso.

Paso 1: cree un nuevo directorio, vaya a la terminal e inicialice NPM ejecutando el siguiente comando.

npm init -y

Inicializando npm 

Paso 2: Instalar analizador de cuerpo, mangosta, express

  • analizador de cuerpo: un middleware responsable de analizar el cuerpo de la solicitud entrante antes de que pueda ser manejado.
  • expreso:  marco node.js
  • mongoose: Mongoose conecta MongoDB a la aplicación web Express
npm i body-parser mongoose express 

Instalación de body-parser mongoose express 

Paso 3: Cree un archivo app.js en el directorio actual y configure el servidor. Importaremos los paquetes a nuestro proyecto y configuraremos nuestro servidor.

app.js

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require('mongoose');
  
const app = express();
  
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(express.static("public"));
  
app.listen(3000, function() {
    console.log("Server started on port 3000");
});

Paso 4: Creación de una base de datos en Robo3T. Considere una base de datos de empleados con los campos nombre_empleado, departamento_empleado, salario_empleado.

{

    "employee_name" : "Riya Verma",
    "employee_department" : "IT",
    "employee_salary":"90000"
},
{

    "employee_name" : "Saransh Gupta",
    "employee_department" : "Finance",
    "employee_salary":"75000"
},
{

    "employee_name" : "Harsh Sehgal",
    "employee_department" : "Production",
    "employee_salary":"60000"
},
{

    "employee_name" : "Arihant Kumar",
    "employee_department" : "Marketing",
    "employee_salary":"85000"
},
{

    "employee_name" : "Ananya Sharma",
    "employee_department" : "Human Resource Management",
    "employee_salary":"50000"
}
  • Vaya a Robo3t y cree una nueva conexión.
  • Cree una base de datos llamada gfg-employees haciendo clic en el botón de nueva conexión.
  • Se creará una base de datos ‘gfg-employees’. Ahora haga clic en él y cree una nueva colección llamada ‘employeedatas’
  • Para insertar documentos, haga clic en datos de empleados y seleccione insertar documento.
  • Copie cada documento de arriba e insértelo uno por uno.
  • Para ver todos los documentos, haga clic en datos de empleados.

A continuación se muestra cómo crear una base de datos e insertar documentos. 

Creación de una base de datos de empleados.

Paso 5: configure MongoDB y escriba el esquema para los datos de nuestros empleados para crear modelos. Para configurar MongoDB, usaremos una mangosta. Conectaremos nuestra aplicación a la ubicación de MongoDB y agregaremos el nombre de la base de datos a la string de URL. De manera predeterminada, MongoDB usa el puerto 27017.

mongoose.connect("mongodb://localhost:27017/gfg-employees", {useNewUrlParser: true});

El esquema define la estructura de nuestra colección. Crearemos un esquema llamado employeeSchema que consta de tres campos: nombre_empleado, departamento_empleado y salario_empleado. 

const employeeSchema = {
 employee_name: String,
 employee_department: String,
 employee_salary : Number
};

Ahora crearemos un modelo a partir de employeeSchema.

const EmployeeData = mongoose.model("EmployeeData", employeeSchema);

Agregue el siguiente código a su código existente en el archivo  app.js.

app.js

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require('mongoose');
  
const app = express();
  
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(express.static("public"));
  
// Connecting gfg-employees database to our express application 
  
mongoose.connect("mongodb://localhost:27017/gfg-employees", 
  { useNewUrlParser: true });
  
  
// Writing schema for employee-data collection
const employeeSchema = {
    employee_name: String,
    employee_department: String,
    employee_salary: Number
};
  
// Creating a model around employeeSchema
const EmployeeData = mongoose.model(
  "EmployeeData", employeeSchema);
  
app.listen(3000, function() {
    console.log("Server started on port 3000");
});

Paso 6: Acceder a todos los empleados mediante el método GET. Podemos buscar a todos los empleados enviando una solicitud de obtención especificando la ruta del recurso y una función de devolución de llamada que maneja la solicitud.

app.get(route, (req,res)=>{
})

Para recuperar a todos los empleados, tenemos que encontrar a los empleados y leerlos de la base de datos.

<ModelName>.find({conditions},function(err,results){
// Using the result
});

Agregue el siguiente código a su archivo  app.js existente.

app.js

// Fetching all the employees  
  
app.get("/employees", (req, res) => {
    EmployeeData.find((err, foundEmployees) => {
        if (!err) {
            res.send(foundEmployees)
        } else {
            res.send(err);
        }
    })
})

Paso para ejecutar la aplicación: Inicie su aplicación ejecutando el siguiente comando.

node app.js

Salida: Podemos acceder a los empleados en localhost:3000/employees. 

Obtención de todos los empleados mediante el envío de una solicitud GET 

Paso 7:  Cree un nuevo empleado utilizando el método POST. Crearemos un nuevo empleado que se añadirá a la base de datos. Aquí, el cliente envía datos al servidor. Todavía no tenemos un front-end, pero tenemos un servidor que tiene acceso a nuestra base de datos. Probaremos nuestra API usando Postman, en lugar de crear un formulario o una interfaz. Nuestro objetivo es enviar una solicitud de publicación a nuestro servidor.

Usaremos el método post:

app.post(route,(req,res)=>{
   ...
})

Una vez que el cliente envía la solicitud de publicación, debemos obtener esos datos mediante req.body.

Dirígete al cartero y envía una solicitud de publicación a localhost:3000/employees. En la pestaña del cuerpo, cambie la codificación a codificación de URL de formulario y agregue el nombre del empleado, el departamento del empleado y el salario del empleado en la clave, junto con el valor que representa los datos que queremos enviar junto con la solicitud.

llave  valor
nombre de empleado Srikant Iyer
empleado_departamento I+D
empleado_salario 45000

Agregar los campos en la pestaña del cuerpo 

Necesitamos guardar a este empleado en nuestra base de datos.

const <constantName>=new <ModelName>({
<fieldName>:<fielddata>,..
});

Agregue el siguiente código al código anterior en el archivo app.js. Reinicie su servidor y envíe una solicitud de publicación usando cartero.

Salida: Vaya a Robo3T y actualice su colección para ver el artículo agregado. Ahora tenemos una entrada adicional. 

Enviar una solicitud de publicación para agregar un nuevo empleado

Paso 8: Obtención de un empleado específico. Leeremos un empleado específico de nuestra base de datos utilizando el método findOne.

<ModelName>.findone({conditions},(req,res)=>{
});

aquí, buscaremos al empleado con nombre_empleado Ananya Sharma. 

Agregue el siguiente código a su archivo  app.js.

app.js

// Fetching a specific employee
app.get("/employees/:employee_name", function(req, res) {
  
    Article.findOne({ employee_name: req.params.employee_name }, 
                     function(err, foundEmployees) {
        if (foundEmployees) {
            res.send(foundEmployees);
        } else {
            res.send("No employee matching that name was found.");
        }
    });
})

Salida: Especificaremos el nombre_empleado en la URL y se mostrará el empleado cuyo nombre coincida. Usaremos %20 en la URL para indicar un espacio entre el Nombre y el Apellido en el nombre_empleado. Los espacios se codifican como %20. Por lo tanto, obtendremos la información de los empleados de localhost:3000/employees/Ananya%20Sharma. 

Obtención de un empleado específico

Paso 9:  sobrescribir un empleado con el método PUT. Para reemplazar a un empleado existente, enviaremos una solicitud de venta.

app.put(route ,(req,res)=>{
...
});

Actualizaremos al empleado utilizando el método de actualización Mongoose. La sobrescritura especifica que queremos reemplazar todo el artículo.  

<ModelName>.update(
{conditions},
{updates},
{overwrite:true}
(err,results)=>{
})

Agregue el siguiente código a su archivo  app.js

app.js

// Overwriting the employee data
app.put("/employees/:employee_name", (req, res) => {
    EmployeeData.updateOne(
        { employee_name: req.params.employee_name }, 
        { employee_name: req.body.employee_name, 
        employee_department: req.body.employee_department,
        employee_salary: req.body.employee_salary }, 
        { overwrite: true },
        function(err) {
            if (!err) {
                res.send(
"Successfully updated the selected employee.");
            }
        }
    );
})

En este caso, cambiaremos nuestros datos de empleado de employee_name Harsh Sehgal de la siguiente manera: 

llave valor
nombre de empleado Himanshu Raj
empleado_departamento Desarrollador
empleado_salario 56000

enviando una solicitud de venta a la ruta localhost:3000/employees/Harsh%20Sehgal

Si el servidor encuentra un parámetro con un nombre_empleado de Harsh Sehgal, reemplazará el nombre_empleado con un nuevo nombre, departamento_empleado con un nuevo departamento y también actualizará el campo de salario. 

Sobrescribir los datos del empleado enviando una solicitud PUT 

Paso 9:  Actualización del salario de un empleado mediante el método PATCH. Actualizaremos a un empleado existente enviando una solicitud de Parche con el nombre del empleado que deseamos actualizar. Para actualizar el empleado, debemos dar los campos que queremos cambiar en la pestaña del cuerpo. Ahora que estamos cambiando solo un campo de un empleado en lugar de todos los datos del empleado, el método de sobrescritura no es necesario cuando llamamos al método de actualización para actualizar nuestra base de datos. Para actualizar el empleado, debemos dar los campos que queremos cambiar en la pestaña del cuerpo.

Agregue el siguiente código en su archivo app.js para modificar los datos de los empleados.

app.js

// Updating an employee 
app.patch("/employees/:employee_name", function(req, res) {
  
    EmployeeData.update({employee_name:req.params.employee_name }, 
    { $set: req.body },
        function(err) {
            if (!err) {
                res.send("Successfully updated employee's salary.");
            } else {
                res.send(err);
            }
        }
    );
})

Salida : Actualiza solo los campos que proporcionamos. El salario de una empleada llamada Riya Verma se actualiza a 9500

Actualización de los datos del empleado mediante el envío de una solicitud PATCH 

Paso 10 : Eliminación de todos los empleados utilizando el método DELETE. Para eliminar a todos los empleados de nuestra base de datos, utilizaremos el método deleteMany mongoose y enviaremos una solicitud de eliminación del cartero.

Agregue el siguiente código a su archivo  app.js.

app.js

// Deleting all the employees
app.delete("/employees", function(req, res) {
  
   EmployeeData.deleteMany(function(err) {
        if (!err) {
            res.send("Successfully deleted all employees.");
        } else {
            res.send(err);
        }
    });
});

Salida: enviaremos una solicitud de eliminación a localhost:3000/employees para eliminar a todos nuestros empleados. Visite Robo3T y actualice su colección. Si enviamos una solicitud de eliminación de nuestro cartero, no observaremos a ningún empleado. 

Eliminación de todos los empleados

Código definitivo:

app.js

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require('mongoose');
  
const app = express();
  
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(express.static("public"));
  
// Connecting gfg-employees database to our express application 
  
mongoose.connect(
  "mongodb://localhost:27017/gfg-employees", 
   { useNewUrlParser: true }
);
  
// Writing schema for employee-data collection
const employeeSchema = {
    employee_name: String,
    employee_department: String,
    employee_salary: Number
};
  
// Creating a model around employeeSchema
const EmployeeData = mongoose.model(
  "EmployeeData", employeeSchema);
  
// Fetching all the employees  
app.get("/employees", (req, res) => {
    EmployeeData.find((err, foundEmployees) => {
        if (!err) {
            res.send(foundEmployees)
        } else {
            res.send(err);
        }
    })
})
  
// Posting a new employee
app.post("/employees", (req, res) => {
    const newEmployee = new EmployeeData({
        employee_name: req.body.employee_name,
        employee_department: req.body.employee_department,
        employee_salary: req.body.employee_salary
    });
  
    // Saving the employee
    newEmployee.save(function(err) {
        if (!err) {
            res.send("Successfully added a new employee.");
        } else {
            res.send(err);
        }
    });
})
  
// Fetching a specific employee
app.get("/employees/:employee_name", function(req, res) {
  
    EmployeeData.findOne({ employee_name: req.params.employee_name }, 
                         function(err, foundEmployees) {
        if (foundEmployees) {
            res.send(foundEmployees);
        } else {
            res.send("No employee matching that name was found.");
        }
    });
})
  
// Replacing a specific employee
app.put("/employees/:employee_name", (req, res) => {
  
    EmployeeData.update({ employee_name: req.params.employee_name }, 
                       { employee_name: req.body.employee_name, 
                        employee_department: req.body.employee_department, 
                        employee_salary: req.body.employee_salary },
                        { overwrite: true },
        function(err) {
            if (!err) {
                res.send("Successfully updated the selected employee.");
            }
        }
    );
})
  
// Updating an employee 
app.patch("/employees/:employee_name", function(req, res) {
  
    EmployeeData.update({ employee_name: req.params.employee_name },
    { $set: req.body },
        function(err) {
            if (!err) {
                res.send("Successfully updated employee's salary.");
            } else {
                res.send(err);
            }
        }
    );
})
  
// Deleting all the employees
app.delete("/employees", function(req, res) {
  
    EmployeeData.deleteMany(function(err) {
        if (!err) {
            res.send("Successfully deleted all employees.");
        } else {
            res.send(err);
        }
    });
});
  
  
app.listen(3000, function() {
    console.log("Server started on port 3000");
});

Publicación traducida automáticamente

Artículo escrito por riyaa7vermaa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *