Skip to content

1)路由机制

路由机制:RESTful 设计、路径参数、查询参数的处理。

路由机制(Routing Mechanism)

路由机制是指如何根据客户端请求的 URL请求方法(如 GET、POST、PUT、DELETE)将请求分发到相应的后端处理函数或控制器的过程。路由通常在 Web 框架(如 Express、Flask、Spring 等)中配置。

1. RESTful 设计

专题版块详见 简述 RESTful API

An image

An image

RESTful 设计的关键词概况

  1. 资源(Resource)

    • 一切皆资源,URL 用来标识资源(如用户、文章、订单)。
  2. 状态表示(Representation)

    • 资源通过不同的表现形式(如 JSON、XML、HTML)传递状态信息。
  3. 无状态(Stateless)

    • 每次请求都是独立的,服务器不保存客户端状态。
  4. 请求方法(HTTP Methods)

    • 使用 HTTP 方法表示操作语义(如 GET、POST、PUT、DELETE)。
  5. 统一接口(Uniform Interface)

    • 提供一致的接口风格,易于理解和扩展。
  6. 层次化(Hierarchical)

    • 路径反映资源层级关系(如 /users/{id}/posts)。
  7. 客户端-服务器(Client-Server)

    • 客户端负责 UI,服务器负责数据处理,二者职责分离。
  8. 缓存(Caching)

    • 通过 HTTP 缓存机制提升性能。

简洁总结:资源状态无状态请求方法统一接口层次化分离缓存

2. 路径参数

路径参数是 URL 中的一部分,通常用于表示某个特定资源的标识符。路径参数通过 {} 括起来表示,用于动态地替代 URL 中的一部分。

格式/users/{id}{id} 是一个路径参数,它会被实际的值替代,如 /users/123 表示访问 ID 为 123 的用户。

使用场景:路径参数通常用于标识唯一的资源或子资源,如用户、订单、商品等。

3. 查询参数

查询参数位于 URL 的问号(?)后面,用于提供附加的参数信息,通常用于过滤、排序、分页等场景。查询参数是以 key=value 键值对的形式出现,并且多个参数使用 & 连接。

格式/users?id=123&sort=asc&page=2,这里的 id=123sort=ascpage=2 就是查询参数。

使用场景:查询参数通常用于非必需的附加信息,如分页、排序、筛选等。

路径参数与查询参数的区别

路径参数 是 URL 的一部分,用于指定资源的唯一标识符或层级关系,通常是必需的

查询参数 是 URL 的附加信息,用于对返回的数据进行筛选、排序、分页等操作,通常是可选的

4. 路由与参数处理的流程

客户端发送请求 ==> 服务器路由匹配 ==> 参数提取 ==> 处理函数 ==> 响应客户端。

  • 客户端发送请求:客户端(如浏览器或移动应用)发送 HTTP 请求,带有路径参数和/或查询参数。
  • 路由匹配:服务器的路由引擎根据请求的 URL 和 HTTP 方法匹配相应的路由规则。例如,GET /users/{id} 会被路由到相应的处理函数。
  • 参数提取
    • 路径参数提取:从 URL 中提取路径参数(如 {id})。
    • 查询参数提取:从请求的 URL 查询字符串中提取查询参数(如 id=123&sort=asc)。
  • 处理请求:服务器处理请求,可能会调用数据库或执行业务逻辑。
  • 返回响应:处理完请求后,服务器将响应数据返回给客户端,通常是 JSON、HTML 或其他格式的数据。

5. 路由参数处理的示例(以 Express 为例)

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