第3章 基于请求路径与方法的Mock规则:路径匹配、HTTP方法过滤、优先级设置

Mock工具的核心能力之一是根据请求特征精准匹配并返回预设响应。本章聚焦于三个最基本的匹配维度:请求路径(URL Path)、HTTP方法(GET/POST/PUT/DELETE等)以及规则优先级(Priority)。合理配置这三者,可以模拟出真实后台的接口路由逻辑,为前端或集成测试提供可控的依赖。

规则匹配流程图 —— 从发起请求到命中响应的决策链路。
Mock规则匹配流程(路径 + 方法 + 优先级) 入站请求 按优先级排序规则 路径模式匹配 HTTP方法过滤 路径 & 方法均匹配? 返回Mock响应 继续下一规则 规则按优先级降序执行,路径支持精确匹配与通配符(如 /api/users/*),方法过滤支持同时匹配多个方法。

3.1 规则配置的结构

在大多数Mock工具(如Moco、WireMock、MockServer)中,一条Mock规则通常由以下字段组成:

字段类型说明
priority整数优先级数值,数字越小优先级越高(0为最高)
path字符串或正则请求路径模式,支持通配符 *、** 或正则
method字符串或数组HTTP方法,如 GET、POST、["GET","POST"]
response对象返回的响应内容、状态码、头信息等

3.2 路径匹配

路径匹配是规则的第一道过滤器。常见的匹配模式包括:

  • 精确匹配:/api/users 仅匹配该路径。
  • 通配符匹配:/api/users/* 匹配 /api/users/1、/api/users/list,但不匹配 /api/users/1/avatar。
  • 双星通配符:/api/** 匹配任意层级的路径(递归)。
  • 正则匹配:/users/\d+ 匹配数字结尾的路径。
注意:路径匹配时通常忽略URL中的查询参数(query string)。若需要基于查询参数做不同响应,应使用专门的参数匹配规则而非路径匹配。

3.3 HTTP方法过滤

方法过滤决定了同一路径下不同HTTP方法返回不同响应。例如,对 /api/orders:

  • GET /api/orders 返回订单列表。
  • POST /api/orders 返回创建成功的确认。
  • DELETE /api/orders/1 返回删除结果。

方法过滤可与路径变量组合使用,形成完整的RESTful模拟环境。

3.4 优先级设置

当多条规则可能匹配同一请求时,必须通过优先级决定最终生效的规则。典型场景:

  • 通配符规则优先级低,精确规则优先级高。
  • 业务异常场景(如超时、错误码)放在高优先级,正常流程在低优先级。
  • 规则评估顺序:按优先级数字升序(0→1→2…),相同优先级则按定义顺序。
实践建议:设置优先级时,将“最特殊”的规则放在最高优先级(priority=0),将默认回退规则放在最低优先级(如priority=999)。

3.5 完整配置示例(JSON格式)

以下是一个Mock规则的JSON配置,展示了路径、方法、优先级的综合应用:

[
  {
    "priority": 0,
    "path": "/api/users/current",
    "method": "GET",
    "response": {
      "status": 200,
      "json": { "id": 999, "name": "当前用户" }
    }
  },
  {
    "priority": 1,
    "path": "/api/users/*",
    "method": ["GET", "POST"],
    "response": {
      "status": 200,
      "json": { "message": "用户操作成功" }
    }
  },
  {
    "priority": 100,
    "path": "/api/**",
    "method": "GET",
    "response": {
      "status": 404,
      "json": { "error": "未找到" }
    }
  }
]

请求 GET /api/users/current 会命中第一条规则(优先级0,精确匹配),而 GET /api/users/123 会命中第二条规则(优先级1,通配符匹配)。若两个规则优先级相同,则按数组定义顺序优先匹配。

3.6 常见避坑点

  1. 通配符过宽导致意外匹配:/api/** 会匹配所有以 /api/ 开头的路径,务必搭配更高的专用规则。
  2. 方法未指定时默认行为:部分工具未指定方法字段时,默认匹配所有方法;另一些则视为无匹配。需查阅工具文档。
  3. 优先级数字大小方向:确认工具的优先级定义(数字越小优先级越高 或 越低)。多数工具采用“小=高”。
  4. 路径大小写敏感:大部分工具对路径大小写敏感,建议统一小写或添加大小写不敏感配置。

3.7 与测试框架的集成示意

在Jest或JUnit测试中,可先启动Mock服务器并加载规则,然后发起真实HTTP请求验证匹配结果:

// Node.js + Moco模拟
const moco = require('moco');
moco.run({
  rules: [
    { path: '/api/health', method: 'GET', response: { status: 200, body: 'OK' } }
  ]
});

// 测试中发送请求
fetch('http://localhost:12306/api/health')
  .then(res => res.text())
  .then(body => expect(body).toBe('OK'));

通过以上配置,Mock工具能够精确模拟后端服务在不同路径、方法和优先级下的行为,为API接入测试提供坚实的基础。