第七十二课:Node.js - 使用Express构建RESTful API
学习目标
- 理解RESTful API的基本原则和优势。
- 学习在Express中处理HTTP请求的方法。
- 掌握如何格式化和发送JSON等格式的响应。
- 学习RESTful路由设计的最佳实践。
学习内容
1. RESTful API原则和优势
REST(Representational State Transfer)是一种设计风格,用于网络应用程序的API设计。它使用标准的HTTP方法,如GET、POST、PUT、DELETE等,并遵循无状态、可缓存、分层系统等六个核心原则。
优势包括:
- 易于理解和实现。
- 客户端-服务器解耦。
- 可扩展性强。
- 统一接口简化了前后端的交互。
- 通过HTTP协议利用现有的网络基础设施。
2. 请求处理
在Express中处理请求意味着定义路由以及与这些路由关联的回调函数(中间件)。
代码示例:
const express = require('express');
const app = express();
// 解析JSON格式的请求体
app.use(express.json());
// 处理GET请求
app.get('/api/items', (req, res) => {
res.send('获取物品列表');
});
// 处理POST请求
app.post('/api/items', (req, res) => {
// 创建物品并返回
const newItem = req.body; // 确保你有一个解析JSON的中间件
res.status(201).send(newItem);
});
// 监听端口
app.listen(3000, () => {
console.log('Server started on port 3000');
});
预计输出效果:
- 访问
GET /api/items
将返回文本"获取物品列表"。 - 向
POST /api/items
发送JSON格式的物品将返回同样的物品数据。
3. 响应格式化
发送响应时,常见的做法是返回JSON格式的数据。Express提供了res.json()
方法来发送JSON响应。
代码示例:
// 以GET请求处理为例
app.get('/api/items', (req, res) => {
const items = [{ id: 1, name: 'Item1' }, { id: 2, name: 'Item2' }];
res.json(items);
});
预计输出效果:
- 访问
GET /api/items
将返回JSON格式的物品列表。
4. 路由设计最佳实践
RESTful API 的概念
RESTful API 是一种 API 的设计风格,不是任何标准或协议,它基于代表性状态传输(REST)的原则。这种设计风格由 Roy Fielding 在他2000年的博士论文中定义,并且它利用了现有的网络协议,主要是 HTTP。
RESTful API 的核心原则包括:
-
客户端-服务器分离:通过将用户界面关注点与数据存储关注点分离,我们能提升用户界面的可移植性以及服务器组件的可伸缩性。
-
无状态:每次请求都包含了处理请求所需的所有信息。这意味着服务器不需要记住之前的请求。
-
可缓存:REST 允许客户端和服务器端的响应数据被标记为可缓存或不可缓存。如果响应是可缓存的,客户端就可以重用数据以提高效率和性能。
-
统一接口:统一接口简化了整个系统架构,以提高其可见性。REST 系统一般有四个接口约束:资源的标识、通过表述来操作资源、自描述消息和超媒体作为应用状态的引擎。
-
分层系统:REST 允许使用分层的系统架构,每层可以独立实施不同的安全策略。
-
按需编码(可选):服务器可以临时或定期扩展功能,向客户端提供一定程度的脚本或程序,以减少客户端的使用复杂性。
RESTful API 的操作
RESTful API 通常使用以下 HTTP 方法来执行对资源的操作:
- GET:用于检索资源。
- POST:用于创建新资源。
- PUT:用于更新现有资源。
- DELETE:用于删除资源。
- PATCH:用于对资源进行部分更新。
RESTful API 的路由设计
RESTful API 的路由应该是直观的,用于体现资源和对这些资源的操纵。例如:
- GET /articles:获取文章列表。
- POST /articles:创建一个新文章。
- GET /articles/{id}:获取一个特定的文章。
- PUT /articles/{id}:更新一个特定的文章。
- DELETE /articles/{id}:删除一个特定的文章。
RESTful API 实践示例
这是一个简单的 RESTful API 的 Express 服务器示例:
const express = require('express');
const app = express();
// 中间件,用于解析请求体
app.use(express.json());
// 路由设置
app.get('/api/resources', (req, res) => {
// 获取资源的逻辑
});
app.post('/api/resources', (req, res) => {
// 创建资源的逻辑
});
app.put('/api/resources/:id', (req, res) => {
// 更新资源的逻辑
});
app.delete('/api/resources/:id', (req, res) => {
// 删除资源的逻辑
});
// 服务器监听
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
每个动词的具体实现需要对应到具体的业务逻辑。例如,在 GET /api/resources
中,你可能需要从数据库中查询数据然后返回,而在 POST /api/resources
中,你可能需要读取请求体,然后创建一个新的资源条目。
总结
使用 RESTful 设计可以帮助你创建清晰、易于维护和扩展的 API。理解 HTTP 方法和状态码,以及资源的概念,对于设计一个好的 RESTful API 是非常重要的。实践中,你还需要考虑安全性、性能、版本控制以及文档等因素。
课后练习
- 创建一个简单的物品管理API,包括至少四个路由:获取全部物品、根据ID获取单个物品、创建新物品、根据ID更新物品。
- 实施路由保护,确保POST和PUT请求中包含了物品名称。
- 创建一个中间件来验证物品是否存在于数据库(假设数据库)中。
- 使用HTTP状态码来正确地表示操作结果。
练习解析
- 这个练习帮助你理解路由的基本设置,并实践RESTful原则。
- 路由保护实施了基本的请求数据验证,确保API的健壮性。
- 中间件的创建和使用进一步加深了你对Express中间件的理解。
- 通过使用HTTP状态码,你将学习如何在响应中正确传达操作结果的重要性。
完成后,你将能够设计并实现一个简单的RESTful API,使用Express中间件进行请求预处理,并返回适当的HTTP状态码。这将为构建更复杂的API和Web服务奠定坚实的基础。