第3章 基于请求路径与方法的Mock规则:路径匹配、HTTP方法过滤、优先级设置
Mock工具的核心能力之一是根据请求特征精准匹配并返回预设响应。本章聚焦于三个最基本的匹配维度:请求路径(URL Path)、HTTP方法(GET/POST/PUT/DELETE等)以及规则优先级(Priority)。合理配置这三者,可以模拟出真实后台的接口路由逻辑,为前端或集成测试提供可控的依赖。
规则匹配流程图 —— 从发起请求到命中响应的决策链路。
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 常见避坑点
- 通配符过宽导致意外匹配:
/api/**会匹配所有以/api/开头的路径,务必搭配更高的专用规则。 - 方法未指定时默认行为:部分工具未指定方法字段时,默认匹配所有方法;另一些则视为无匹配。需查阅工具文档。
- 优先级数字大小方向:确认工具的优先级定义(数字越小优先级越高 或 越低)。多数工具采用“小=高”。
- 路径大小写敏感:大部分工具对路径大小写敏感,建议统一小写或添加大小写不敏感配置。
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接入测试提供坚实的基础。