whistle是什么
是非常实用且无敌的好东西【接口联调以及容灾测试、本地开发mock代理、抓包调试】
工作中经常遇到联调前需要mock数据进行开发的时候,又或者移动端出现问题,需要抓包看数据分析情况的时候 【代理+抓包+mock的小能手】
一、安装步骤
- 安装whister
npm i whistle -g 全局安装
w2 start 启动服务
w2 stop 停止服务(使用率:0.1%)
2. 安装代理扩展程序***SwitchyOmega插件*********
注:若遇到程序包无效现象
需要先将crx文件添加压缩包后缀(.rar), 再解压这个压缩包==》 得到一个文件夹;
随后将文件夹拖到道chrome浏览器中解决:
具体步骤如下:(blog.csdn.net/qq_41691212…
- 配置代理
首先需要在插件菜单里选择选项
再新建情景模式
whister设置如下配置:
切到刚才配置好的地址上
- 启动whistle
通过上面三步的操作后,该做的工作都已经搞定了,现在开始启动服务w2 start,启动成功后会看到这样的画面
- 安装证书并始终信任
【待完善】window安装证书时有问题?? 如何解决
二、whistle抓移动端上的包
配置前提:需要电脑和手机处于同一个局域网中
电脑端:whistle打开并且找到当前whistle运行的ip地址与档口
手机端:
- 连上网络后,手动配置代理【pc端的whistle运行ip和端口】,以ios举例:
- 下载证书
手机浏览器输入:rootca.pro, 允许下载文件
- 安装信任证书
打开设置--首次下载通过设置/已描述文件进入【没有就多下载几次试试】
选中下载的描述文件输入密码安装并信任
安装成功后
增加本机的手机信任证书:ios路径:设置/通用/关于本机/证书信任设置
三、常用相关配置和基本操作
配置代理示例:
###*** 代理成功的话network面板中请求颜色会是蓝色***###
# 1. 本地联调[域名ip映射]
http://acsp.sit.sf-express.com xxxxxx
# 2. 模拟响应 500(请求不会到后台服务)
http://xxx.sit.com/app/func1 statusCode://502
# 3. 修改响应状态码(请求会到后台服务)
test4.wproxy.org/path/to replaceStatus://400
## 302 重定向
test5.wproxy.org/path redirect://https://ke.qq.com/
## 301 重定向
test6.wproxy.org/path redirect://https://ke.qq.com/ replaceStatus://301
# 4. 拦截响应体[映射到对应文件上]
# test6.wproxy.org/path file://Users/mock/getinitialzationData.json
# test6.wproxy.org/path resBody://Users/mock/getinitialzationData.json
# 5. 拦截响应体[映射到对应value上]
test6.wproxy.org/path resBody://{getInitializationData.json}
四、whistle在本地开发中的应用
场景一:绕过登录鉴权
本地localhost开发存在的缺陷:juejin.cn/post/684490… 【文章写得很好,很清楚得分析本地开发使用代理的不足地方,还有一个流程图介绍本地代理调试的复杂步骤】
具体的本地开发使用过程:juejin.cn/post/684490… 【很详细介绍了现代前端项目结合谷歌插件SwitchyOmega结合whislte 开发的过程】
实际项目中whislte配置如何继承同步给其他同事:juejin.cn/post/684490… 【创建.whislte.js文件,通过w2 create加载到控制台】
总结:页面调试时的一部分功能,需要前端页面的特定域名支持,比如用户的登陆功能,后端接口会校验客户端域名的合法性,只处理特定的域名的请求;又比如特定域名下cookie的读取等等。这些功能在localhost的host下可能会受到限制。
导致这些不足的背后实质上是两个原因:
-
本地开发和线上环境的域名不一致,这就导致了业务代码参杂了环境相关的不纯洁的代码。
-
转发配置与webpack过于耦合,这就致使一旦环境需要变动就不得不进行项目重启。
因此解决的方案也是基于这两点:
-
本地开发时,浏览器中访问的是线上域名,即用线上的域名来开发和调试本地代码,做到本地代码和线上代码完全一致而不需要在代码层面做环境区分。
-
将接口代理功能从webpack中抽离,使用其他工具接管这部分功能,webpack不再需要因修改转发配置而重启。
总结:静态资源代理到本地,接口不代理,直接调用后端服务
四、【代理问题】本地开发环境配置是如何解决跨域
结论:服务代理
- 跨域问题及其解决办法
zhuanlan.zhihu.com/p/611046057…
产生跨域问题的前提是浏览器环境,代理服务器不受浏览器的限制,所以可以和远程服务器正常通信。 同时代理服务器和html网页在相同的域名、端口下,所以不存在跨域,代理服务器自然可以吧数据传给页面。
服务器之间的访问是不存在跨域问题的;postman也是
www.zhihu.com/question/62… 【为什么postman请求无跨域问题】
- 为什么项目中配置代理后就可以访问测试环境了
juejin.cn/post/711237… 【解释得一般,但把代理过程图画清楚了,评论有出彩】
客户端发送请求到代理服务器 =》 代理服务器 =》 代理服务器转发给目标服务器 =》 目标服务器处理请求并向代理服务器做出响应 =》 代理服务器接收响应 =》 代理服务器再把请求发送给客户端(代理服务器允许跨域请求。因为代理服务器是一个类中间件,具备一个换装功能。可以将不符合同源策略的域名伪装成符合同源策列的域名)=》 客户端检测不出跨域,处理响应。
blog.csdn.net/weixin_6096… 【这里解释得很好,解释了几种跨域的解决方案,并给出了实例,目测像是视频培训课的笔记】
非同源策略(跨域)请求方案:
- proxy跨域代理:原理就是利用“服务器和服务器之间不存在跨域”来实现的
步骤:
(1)在本地启动一个服务:一方面可以实现页面的预览,另一方面也可以代理转发数据请求
(2)我们以后再发数据请求,发送给本地启动的这个服务,而这个服务会去真正的服务器上获取到相关的数据,再返回给客户端!!
-
本地开发的时候,我们基于proxy跨域代理来完成「webpack-dev-server、Node...」
-
部署到服务器的时候,我们一般是基于nginx的反向代理来处理
-
CORS跨域资源共享:默认因为浏览器的安全策略,是不允许ajax跨域访问的,但是如果服务器设置了 Access-Control-Allow-Origin 响应头信息,设置允许这个源发送请求,那么浏览器也就不在去限制了!!
实施步骤:
(1)由服务器设置允许源
Access-Control-Allow-Origin 设置允许的源「白名单机制」
Access-Control-Allow-Credentials 是否允许携带资源凭证「例如:cookie」
服务器端设置了允许,则客户端也要配合设置允许
axios.defaults.withCredentials = true;
xhr.withCredentials=true;
Access-Control-Allow-Headers 设置允许的请求头
Access-Control-Allow-Methods 设置允许的请求方式
(2)在CORS跨域共享中,客户端首先会尝试发送一个OPTIONS试探请求,验证是否连接成功,连接成功后,再发送真正的请求!!
代理相关疑问:
疑问一:前端服务不应该也是部署到一个端口下的吗?---实际可通过域名直接访问到前端项目
是部署在源服务器的端口下,访问域名,域名 可以映射【直接映射 或者通过某种方式】对应 到 对应端口下,所以就看不到端口
疑问二:为什么访问页面的时候只有域名,没有端口?是ng转发的?
- 是的,需要配置转发,例如通过oss桶部署的前端项目,实际上访问桶资源【下面原文编辑中以后图,可自己放开】