规则系统
规则让你声明"哪些请求需要什么治理",无需在每个请求处重复配置。
规则字段
| 字段 | 类型 | 说明 |
|---|---|---|
enabled | boolean | 规则开关,设为 false 跳过该规则 |
url | string | RegExp | Array | Function | URL 匹配器 |
method | string | RegExp | Array | Function | 请求方法匹配(单个) |
methods | 同上 | 请求方法匹配(多个) |
match | (config) => boolean | 自定义匹配函数 |
duplicate | boolean | object | function | 匹配后的防重配置 |
retry | boolean | object | function | 匹配后的重试配置 |
circuitBreaker | boolean | object | function | 匹配后的熔断配置 |
匹配优先级
请求级配置(最高) > 规则匹配(首个命中项生效) > 全局默认(最低)完整示例
javascript
const requestManager = setupRequestGuard(axios, {
rules: [
// ---- 字符串匹配 ----
// 精确匹配 URL,所有方法都生效
{ url: '/api/order/submit', duplicate: { strategy: 'block' } },
// ---- 正则匹配 ----
// 所有 POST 请求且 URL 以 /submit 结尾的,开启防重
{ url: /\/submit$/, method: 'post', duplicate: true },
// ---- 多方法匹配 ----
// GET 和 POST 的查询接口使用 reuse 策略
{ url: /\/api\/(list|search|query)/, methods: ['get', 'post'], duplicate: { strategy: 'reuse' } },
// ---- 函数式规则(动态返回配置) ----
// 根据请求内容动态决定配置
(config) => {
if (config.url.includes('/api/payment')) {
return { duplicate: { strategy: 'block', message: '支付处理中' } };
}
return null; // 不匹配返回 null
},
// ---- 自定义匹配器 ----
// 带特定 header 的请求使用 block 策略
{
match: (config) => config.headers?.['X-Idempotent'] === 'true',
duplicate: { strategy: 'block' }
},
// ---- 能力配置为函数(按请求动态返回) ----
{
url: /\/api\//,
method: 'post',
retry: (config, rule) => {
// 幂等接口才开启重试
if (config.headers?.['Idempotency-Key']) {
return { attempts: 3, delay: 500 };
}
return false;
}
}
]
});TIP
规则按声明顺序匹配,首个命中项生效,后续规则不再扫描。更具体的规则应写在更前面。
