Node.js 什么是REST API

Node.js 什么是REST API

REST API是一种遵循REST架构风格的应用程序编程接口,可以与RESTful web服务进行交互。互连网络组成了互联网。Web服务是一组用于在客户端-服务器应用程序之间交换数据的开放协议和标准。遵循REST架构的Web服务被称为RESTful Web服务。

什么是API?

API(应用程序编程接口)是一组命令、函数或协议,充当一个中间人来实现两个应用程序之间的通信。在像Zomato这样的食品配送应用程序中订购食物时,跟踪送货人的位置是非常常见的。谷歌地图API使您可以实现这一点。让我们通过餐厅的类比来理解API。每次您去餐厅时,服务员都会帮助您点餐。在接收到您的订单后,服务员会告诉厨师烹饪您想要的菜品。当餐点准备好后,服务员会将其端到您面前。在这种情况下,服务员是厨师和顾客之间的中间人。服务员接收顾客(客户端)的请求(订单),将请求传达给厨师(服务器),并取回准备好的菜品(响应)。

REST: REST代表表现状态转移(REpresentational State Transfer)。Rest是使用HTTP协议创建网站的一种架构风格。在构建网站或API时,开发人员应遵循某些架构约束。

让我们了解一下表现状态转移的含义。

假设我们有一个Web客户端和一个Web服务器(API)。客户端请求资源,服务器从其数据库中获取响应。资源是指仅属于服务器的某些内容。当客户端通过RESTful API请求资源时,服务器会发送该资源的表示形式(Representation)。因此,表示形式是服务器作为响应发送的内容。资源在某一时刻的状态被称为其状态。传输是从服务器向客户端传输数据。因此,表现状态转移意味着传输资源的表示形式的状态。这些表示形式通过HTTP以各种格式传输,包括JSON(JavaScript对象表示法)、HTML、XML或纯文本。最流行的文件格式是JSON,因为它既可以被人类读取,也可以被机器读取。

例如,以JSON格式的员工数据。

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

HTTP协议和动词: 我们已经讨论过REST是基于HTTP协议工作的,所以让我们探索一下为什么我们需要它。REST总是关于资源(名词),而SOAP则是关于行动。现在,需要动作对应名词的资源来理解我们需要对该产品做什么。超文本传输协议定义了用于确定在资源上执行的动作的几种方法(称为动词)。资源可以通过URI(统一资源标识符)或URL访问。HTTP动词(或方法)包括POST、GET、PUT、PATCH和DELETE。GET方法从系统中检索信息。POST方法用于创建新资源。PUT方法用于更新数据库,用全新的条目替换以前的条目或创建新资源。PATCH方法用于部分更新现有资源。通过查看以下示例,您可以更好地了解PUT和PATCH方法的作用:亚马逊向您发送了一辆坏掉的自行车。可以通过替换整个自行车(PUT)或只替换损坏的部件(PATCH)来解决此问题。删除方法用于删除现有的资源。

为什么要使用REST?

  • 分离客户端和服务器 :客户端和服务器之间的分离使协议非常容易独立使用于各种开发项目。它允许我们建立松散耦合的应用程序,客户端和服务器可以分别演变。
    例如:客户端和服务器可能不关心使用哪种软件。
  • REST不依赖于平台和语言。它还可以适应各种语法和工作平台,让您在各种与开发相关的项目上工作。例如:我们可以使用Windows或Mac OS。
  • 灵活性和可扩展性 :REST真正可扩展。这是由于客户端和服务器的分离。这意味着服务器不需要在其主体中保持客户端请求,也不需要与客户端通信。
  • 未受限于一种数据格式。通过将信息序列化为JSON和XML格式,提供了一种灵活的方法。
  • 可以使用HTTP缓存来优化网络并提高效率。
  • 易于使用和学习。

让我们自己创建一个RESTful API来更好地理解。 ****

方法: 我们将创建一个名为 gfg-employees 的RESTful API。我们将插入员工数据并发送HTTP请求。在此过程中,我们将获取、修改和删除员工数据。我们将使用Robo3T来处理数据库。我们将使用Postman来发送请求。以下是逐步实现的步骤。

步骤1: 创建一个新目录,转到终端,并通过运行以下命令初始化NPM。

npm init -y

Node.js 什么是REST API

步骤2: 安装 body-parser、mongoose、express

  • body-parser: 一个中间件,负责解析即将处理的传入请求体。
  • express: node.js 框架
  • mongoose: Mongoose 将 MongoDB 连接到 Express Web 应用程序
npm i body-parser mongoose express 

Node.js 什么是REST API

步骤3: 在当前目录中创建一个 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")); 
  
app.listen(3000, function() { 
    console.log("Server started on port 3000"); 
}); 

步骤4: 在Robo3T上创建一个数据库。考虑一个包含employee_name、employee_department、employee_salary字段的员工数据库。

{

    "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"
}
  • 前往 Robo3t 并创建一个新的连接。
  • 通过点击新连接按钮创建一个名为 gfg-employees 的数据库。
  • 将会创建一个名为’gfg-employees’的数据库。现在点击它并创建一个名为’employeedatas’的新集合。
  • 要插入文档,请点击 employeedatas 并选择插入文档。
  • 将上述每个文档复制并逐个插入。
  • 要查看所有文档,请点击 employeedatas。

以下显示了如何创建数据库和插入文档。

Node.js 什么是REST API

步骤5: 设置MongoDB并编写员工数据的架构以创建模型。要设置MongoDB,我们将使用mongoose。我们将连接我们的应用程序到MongoDB的位置,并将数据库名称添加到URL字符串中。默认情况下,MongoDB使用端口27017。

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

模式定义了集合的结构。我们将创建一个名为employeeSchema的模式,由三个字段组成 – employee_name、employee_department和employee_salary。

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

现在我们将使用employeeSchema创建一个模型。

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

将以下代码添加到您现有的代码中的 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"); 
});

步骤6: 使用GET方法访问所有的员工。我们可以通过发送GET请求来获取所有的员工,需要指定资源的路由和处理请求的回调函数。

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

为了检索所有的员工,我们必须从数据库中找到员工并读取。

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

将以下代码添加到您现有的 app.js 文件中。

app.js

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

运行应用程序的步骤: 通过运行以下命令启动您的应用程序。

node app.js

输出: 我们可以通过localhost:3000/employees访问员工。

Node.js 什么是REST API

步骤7: 使用POST方法创建一个新的雇员。我们将创建一个新的雇员并将其添加到数据库中。在这里,客户端将数据发送到服务器。我们还没有前端,但是我们有一个可以访问我们数据库的服务器。我们将使用Postman来测试我们的API,而不是创建一个表单或前端。我们的目标是向服务器发送一个post请求。

我们将使用post方法:

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

一旦客户端发送了POST请求,我们需要通过req.body获取数据。

转到postman并发送POST请求到localhost:3000/employees。在body选项卡下,将编码更改为form-url coding,并添加employee_name、employee_department和employee_salary作为键,以及表示我们要发送到请求的数据的值。

key | value
—|—
employee_name | Srikant Iyer
employee_department | R&D
employee_salary | 45000
Node.js 什么是REST API

我们需要将这位员工保存在我们的数据库中。

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

将以下代码添加到app.js文件中的先前代码中。重新启动服务器并使用postman发送一个post请求。 输出: 前往Robo3T并刷新您的集合以查看添加的文章。现在我们有一个额外的条目。
Node.js 什么是REST API

步骤8: 使用findOne方法从数据库中读取特定员工的信息。

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

在这里,我们将根据员工姓名Ananya Sharma获取员工信息。

将以下代码添加到你的 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."); 
        } 
    }); 
})

输出: 我们将在URL中指定employee_name,并显示与其名称匹配的员工。我们将在employee_name中使用%20来表示名字和姓氏之间的空格。空格被编码为%20。因此,我们将从localhost:3000/employees/Ananya%20Sharma获取员工信息。

Node.js 什么是REST API

步骤9: 使用PUT方法覆盖一个员工。为了替换已经存在的员工,我们将发送一个put请求。

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

我们将使用Mongoose的更新方法来更新员工。覆盖参数指定我们想要替换整个文章。

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

将以下代码添加到你的 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."); 
            } 
        } 
    ); 
})

在这种情况下,我们将更改员工名字为Harsh Sehgal的员工数据如下:

key value
employee_name Himanshu Raj
employee_department Developer
employee_salary 56000

通过向路由localhost:3000/employees/Harsh%20Sehgal发送put请求

如果服务器找到一个employee_name为Harsh Sehgal的参数,它将用新名称替换employee_name,用新部门替换employee_department,并更新薪水字段。

Node.js 什么是REST API

步骤9: 使用PATCH方法更新员工的薪水。我们将通过发送一个Patch请求来更新现有员工,其中包含要更改的员工姓名。要更新员工,我们必须在body选项卡中给出要更改的字段。现在,我们只更改一个员工的一个字段而不是整个员工数据,调用更新方法以更新数据库时不需要覆盖方法。要更新员工,我们必须在body选项卡中给出要更改的字段。

在你的app.js文件中添加以下代码以修改员工数据。

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); 
            } 
        } 
    ); 
})

输出: 仅更新我们提供的字段。名为Riya Verma的员工的薪水更新为9500。

Node.js 什么是REST API

步骤10 :使用DELETE方法删除所有员工。要从数据库中删除所有员工,我们将使用deleteMany mongoose方法,并从postman发送一个删除请求。

将以下代码添加到你的 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); 
        } 
    }); 
}); 

输出: 我们将发送一个删除请求到localhost:3000/employees来删除我们所有的员工。访问Robo3T并刷新你的集合。如果我们从Postman发送一个删除请求,我们将看不到任何员工。

Node.js 什么是REST API

最终代码:

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"); 
});

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程