whistle 的操作值可以分为两类,字符串 和 JSON 对象
1、如果字符串不包含空格,可以直接写到配置里面
pattern opProtocol://(strValue)
2、如果字符串里包含空格,则可以把操作值先放到 whistle 界面的 Values:
# 在Values里面创建一个key为 test.txt 的 key-value 对
pattern opProtocol://{test.txt}
3、如果操作值为 JSON 对象,则可以用以下几种格式:
正常的JSON格式:
{
"key1": value1,
"key2": value2,
"keyN": valueN
}
行格式:
# 以 `冒号+空格` 分隔
key1: value1
key2: value2
keyN: valueN
# 如果没有 `冒号+空格` ,则以第一个冒号分隔,如果没有冒号,则 value 为空字符串
key1: value1
key2:value2
key3
keyN: valueN
内联格式(请求参数格式):
# key 和 value 最好都 encodeURIComponent
key1=value1&key2=value2&keyN=valueN
4、模板字符串
whistle 支持类似于 ES6 的模板字符串,通过模板字符串可以读取信息的一些信息并设置到规则中:
pattern1 protocol://`xxx${reqCookie.cookieName}yyy`
www.test.com/api http://`${clientIp}:8080`
pattern3 protocol://`{test.json}`
test.json
{
"url": "${url}",
"port": "${port}",
"version": "${version}",
"query": "${query}", // 相当于 location.search ,如果 url 里面没有 ? 则为空字符串
"search": "${search}", // 相当于 location.search ,如果 url 里面没有 ? 则为空字符串
"queryString": "${queryString}", // 相当于 location.search ,但如果 url 里面没有 ? 则为 ?
"searchString": "${searchString}", // 相当于 location.search ,但如果 url 里面没有 ? 则为 ?
"queryValue": "${query.name}",
"host": "${host}",
"hostname": "${hostname}",
"path": "${path}",
"pathname": "${pathname}",
"reqId": "${reqId}",
"now": ${now},
"method": "${method}",
"xff": "${reqHeaders.x-test}",
"other": "${reqHeaders.other}",
"cookie": "${reqCookie}",
"cookieValue": "${reqCookie.cookieName}",
"clientIp": "${clientIp}"
}
这里 test.json 在规则中一定要用模板字符串引入
protocol://`{test.json}`
如下配置
www.test.com/api http://`${clientIp}:8080`
10.12.2.1 的请求 https://www.test.com/api/test 会转成 http://10.12.2.1:8080/test
如果想获取响应阶段的状态码、服务端IP、响应头、响应cookie, 可以通过以下两种方式设置规则:
1)、resScript
2)、插件的resRulesServer
通过这两种方式设置的响应规则,除了可以设置上述请求信息,还可以设置如下响应信息
pattern3 protocol://`{test2.json}`
test2.json
{
"url": "${url}",
"search": "${url.search}",
"query": "${url.query}",
"queryValue": "${url.query.name}",
"host": "${url.host}",
"hostname": "${url.hostname}",
"path": "${url.path}",
"pathname": "${url.pathname}",
"reqId": "${reqId}",
"now": ${now},
"method": "${method}",
"xff": "${reqHeaders.x-forwarded-for}",
"other": "${reqHeaders.other}",
"cookie": "${reqCookie}",
"cookieValue": "${reqCookie.cookieName}",
"clientIp": "${clientIp}",
"statusCode": "${statusCode}",
"serverIp": "${serverIp}",
"resHeaderValue": "${resHeaders.x-res-header-name}",
"resCookieValue": "${resCookie.res_cookie_name}"
}
支持replace(pattern, replacement) 功能, 如:
protocol://`${search.replace(/course=([^&]+)/ig,name=$1)}`
protocol://`${search.replace(a,b)}`
`query` 和 `queryString}` 的用途,
# 不需要追加参数
www.test.com/index.html redirect://`https://ke.qq.com/test${query}`
# 需要追加参数
www.test.com/index.html redirect://`https://ke.qq.com/test${queryString}&test=1`
# 追加参数
www.test.com redirect://`https://ke.qq.com${url.path}`
# 修改为 301
www.test.com redirect://`https://ke.qq.com${url.path}` replaceStatus://301