1)路由机制
路由机制:RESTful 设计、路径参数、查询参数的处理。
路由机制(Routing Mechanism)
路由机制是指如何根据客户端请求的 URL 和 请求方法(如 GET、POST、PUT、DELETE)将请求分发到相应的后端处理函数或控制器的过程。路由通常在 Web 框架(如 Express、Flask、Spring 等)中配置。
1. RESTful 设计
专题版块详见 简述 RESTful API。
RESTful 设计的关键词概况
资源(Resource)
- 一切皆资源,URL 用来标识资源(如用户、文章、订单)。
状态表示(Representation)
- 资源通过不同的表现形式(如 JSON、XML、HTML)传递状态信息。
无状态(Stateless)
- 每次请求都是独立的,服务器不保存客户端状态。
请求方法(HTTP Methods)
- 使用 HTTP 方法表示操作语义(如 GET、POST、PUT、DELETE)。
统一接口(Uniform Interface)
- 提供一致的接口风格,易于理解和扩展。
层次化(Hierarchical)
- 路径反映资源层级关系(如
/users/{id}/posts
)。
- 路径反映资源层级关系(如
客户端-服务器(Client-Server)
- 客户端负责 UI,服务器负责数据处理,二者职责分离。
缓存(Caching)
- 通过 HTTP 缓存机制提升性能。
简洁总结:资源、状态、无状态、请求方法、统一接口、层次化、分离、缓存。
2. 路径参数
路径参数是 URL 中的一部分,通常用于表示某个特定资源的标识符。路径参数通过 {} 括起来表示,用于动态地替代 URL 中的一部分。
格式:/users/{id}
,{id}
是一个路径参数,它会被实际的值替代,如 /users/123
表示访问 ID 为 123 的用户。
使用场景:路径参数通常用于标识唯一的资源或子资源,如用户、订单、商品等。
3. 查询参数
查询参数位于 URL 的问号(?
)后面,用于提供附加的参数信息,通常用于过滤、排序、分页等场景。查询参数是以 key=value
键值对的形式出现,并且多个参数使用 &
连接。
格式:/users?id=123&sort=asc&page=2
,这里的 id=123
、sort=asc
和 page=2
就是查询参数。
使用场景:查询参数通常用于非必需的附加信息,如分页、排序、筛选等。
路径参数与查询参数的区别
路径参数 是 URL 的一部分,用于指定资源的唯一标识符或层级关系,通常是必需的。
查询参数 是 URL 的附加信息,用于对返回的数据进行筛选、排序、分页等操作,通常是可选的。
4. 路由与参数处理的流程
客户端发送请求 ==> 服务器路由匹配 ==> 参数提取 ==> 处理函数 ==> 响应客户端。
- 客户端发送请求:客户端(如浏览器或移动应用)发送 HTTP 请求,带有路径参数和/或查询参数。
- 路由匹配:服务器的路由引擎根据请求的 URL 和 HTTP 方法匹配相应的路由规则。例如,
GET /users/{id}
会被路由到相应的处理函数。 - 参数提取:
- 路径参数提取:从 URL 中提取路径参数(如
{id}
)。 - 查询参数提取:从请求的 URL 查询字符串中提取查询参数(如
id=123&sort=asc
)。
- 路径参数提取:从 URL 中提取路径参数(如
- 处理请求:服务器处理请求,可能会调用数据库或执行业务逻辑。
- 返回响应:处理完请求后,服务器将响应数据返回给客户端,通常是 JSON、HTML 或其他格式的数据。
5. 路由参数处理的示例(以 Express 为例)
const express = require("express");
const app = express();
// 路由带路径参数
app.get("/users/:id", (req, res) => {
const userId = req.params.id; // 获取路径参数
res.send(`User ID: ${userId}`);
});
// 路由带查询参数
app.get("/posts", (req, res) => {
const { category, page, limit } = req.query; // 获取查询参数
res.send(`Category: ${category}, Page: ${page}, Limit: ${limit}`);
});
// 综合示例:路径参数和查询参数一起使用
app.get("/posts/:postId/comments", (req, res) => {
const postId = req.params.postId; // 获取路径参数
const { page, limit } = req.query; // 获取查询参数
res.send(`Post ID: ${postId}, Page: ${page}, Limit: ${limit}`);
});