前言
Whistle是一个非常强大的拦截请求,代理工具。安装谷歌插件SwitchyOmega就可以愉快的切换代理模式了。
一.Whistle常见功能
-
设置host进行代理 :
www.ifeng.com 127.0.0.1:8080
。可以将请求代理到本地的8080端口,这样在平时开发就可以去掉请求路径url的端口号。
调试别的端口的host域同样也可以www.ifeng.com host://www.qq.com:8080
-
替换文件:
www.ifeng.com file://E:\xx\test
。我们可以这样替换本地的json数据进行mock数据。
whistle自带了一个很好用的功能,在左侧的value目录下我们可以直接写json数据。^www.ifeng.com/secretsales/show/ tpl://{secretsales.json}
ctrl点击tpl,我们可以将json数据写进value中,这里其实有个小bug,我们写的json数据有时会是一个字符串的格式(string)。这是我们可以借助FeHelper,将字符串格式的数据转换成json格式的数据,就可以很方面利用whistle进行mock数据。
-
请求转发
例如将百度的所有请求转发到凤凰上。
www.baidu.com www.ifeng.com
-
注入js文件(html/css同理)
我们想要将一个js文件注入到凤凰网上www.ifeng.com js://E:\xx\test\test.js
-
手机代理
我们可以通过扫描whistle上的二维码进行证书下载,就可以手机代理网站,开发中可以用来测试移动端页面的样式与方法。
二.Whistle的匹配模式
-
域名匹配
不仅支持匹配某个域名,也可以限定端口号、协议(http、https、ws、wss、tunnel)# 匹配域名www.test.com下的所有请求,包括http、https、ws、wss,tunnel www.test.com/url # 匹配域名www.test.com下的所有http请求 http://www.test.com/url # 匹配域名www.test.com下的所有https请求 https://www.test.com/url # 上述匹配也可以限定域名的端口号 www.test.com:8888/url # 8888端口 www.test.com/url # http为80端口,其它443端口
-
路径匹配(与域名匹配的区别是指定了更加细致的路径)
# 限定请求协议,只能匹配http请求 http://www.test.com/xxx operatorURI http://www.test.com:8080/xxx operatorURI # 匹配指定路径下的所有请求 www.test.com/xxx operatorURI www.test.com:8080/xxx operatorURI
-
正则匹配
#匹配所有请求 /./ operatorURI # 最多支持10个子匹配 $0...9,其中$0表示整个请求url,其它跟正则的子匹配一样 /[^?#]\/([^\/]+)\.html/ protocol://...$1...
-
精确匹配(路径匹配不仅匹配指定路径,还会匹配该路径下的子路径。精确匹配只能匹配指定的路径,只要在路径前面加$即可变成精确匹配)
$www.test.com/xxx operatorURI 没有加请求协议就可以匹配四种请求协议 http://www.test.com/xxx https://www.test.com/xxx ws://www.test.com/xxx wss://www.test.com/xxx
-
通配符匹配
匹配模式必须以 ^ 开头(如果需要限制结束位置可以用 $),* 为通配符,支持通过$0…9获取通配符匹配的字符串,其中$0表示整个请求url。# 以 ^ 开头 ^www.example.com/test/*** referer://http://www.test.com/$1 # 限定结束位置 ^www.example.com/test/***test$ referer://http://www.test.com/$1
这是两种通配符匹配,我们需要访问多个接口的时候通常使用通配符匹配。这两种的区别可以看一个例子。我们访问接口
https://www.example.com/test/abc?123test
。第一个的配置可以为$1 = abc?123&test
,而第二个的配置只能为$1 = abc?123
,所有只有第一种模式可以匹配。我们不仅可以对请求的路径使用*进行通配符匹配,还可以对协议,域名进行通配符匹配。
# 匹配二级域名以 .com 结尾的所有url,如: test.com, abc.com,但不包含 *.xxx.com *.com file:///User/xxx/test # 如果要配置所有子域名生效,可以使用 ** **.com file:///User/xxx/test # 限定协议,只对http生效 http://*.com file:///User/xxx/test # 路径 *.com/abc/efg file:///User/xxx/test
对于我们的通配路径也可以进行匹配
# 对所有域名对应的路径 protocol://a.b.c/xxx[/yyy]都生效 */ 127.0.0.1 http://*/ 127.0.0.1 https://*/xxx 127.0.0.1 ws://*/xxx 127.0.0.1 wss://*/xxx 127.0.0.1
三.操作值
-
如果字符串不包含空格,可以直接写到配置里面:
请求地址 opProtocol://(strValue)
-
如果字符串里面包含空格,则可以把操作值先放到whistle界面的Values或本地文件:
# 在Values里面创建一个key为 test.txt 的 key-value 对 pattern opProtocol://{test.txt} # 或者放到本地文件 /User/docs/test.txt pattern opProtocol:///User/docs/test.txt # windows pattern opProtocol://E:\docs\test.txt
-
操作值为JSON对象
{ "key1": value1, "key2": value2, "keyN": valueN }
行格式
{ "key1": value1, "key2": value2, "keyN": valueN }
-
whistle v1.12.12开始支持在Rules内联多行的Value
www.test.com/index.html file://{test.html} ```test.html Hello world. Hello world1. Hello world2.
四.匹配规则
- 相同协议规则的默认优先级从上到下,即前面的规则优先级匹配高于后面
- 除rule及proxy对应规则除外,可以同时匹配不同协议的规则
- 一些属于不同协议,但功能有冲突的规则,如 rule、host、proxy,按常用优先级为 rule > host > proxy
具体可见官网http://wproxy.org/whistle/principle.html
五.协议参数
我们可以对规则做很多额外的限制与操作。功能很多,需要时查官网对应的参数即可,这里就不多赘述。