Fiddler助力微信开发调试

任夔
• 阅读 1643

Fiddler是一个非常强大的代理工具,可以让你的前端开发调试更加方便。下面介绍在微信开发调试方面的应用。

微信网页开发中,由于有js接口安全域名和授权域名等的限制,导致部分功能需要部署到线上才能测试。通过代理可以实现本地调试网站的所有功能。

配置代理规则

全站转发可以这样设置:Tools -> HOSTS
Fiddler助力微信开发调试

图片中表示your.domain.com的请求全部转发到127.0.0.1:8000。第二个参数的限制是:不能加协议、路径或参数。

如果你的网站域名和接口域名是同一个,那就不能使用全站转发了,需要html、css、js、websocket请求转发到本地,接口调用请求则直接发送到远程服务器。

可以使用自定义规则实现
Fiddler助力微信开发调试

上面图片中的正则表达式和目标地址如下:

regex:^http://your.domain.com(?!/api|/swagger|/webjars|/configuration/ui)(.*)


http://localhost:8000$1

本条规则表示:将your.domain.com下的http请求转发到localhost:8000,其中/api/swagger/webjarsconfiguration/ui开头的路径不转发。

目标地址表达式中的$1代表原始请求URL域名后面的字符串,包括pathsearch

设置代理服务器

打开微信开发者工具,设置 -> 代理设置 -> 选择手动设置代理
Fiddler默认运行在127.0.0.1:8888

在真机上测试

在真机上测试本地微信网页项目的步骤如下:

  1. 手机和电脑连接同一个局域网。
  2. 设置Fiddler允许远程连接,Tools -> Options -> Connections -> 勾选Allow remote computers to connect

Fiddler助力微信开发调试

  1. 查看电脑在局域网中的IP地址,命令行输入ipconfig(windows)。

Fiddler助力微信开发调试

  1. 手机网络配置代理服务器。

Fiddler助力微信开发调试

到这里,本篇文章的主要内容就结束了,如果你想了解更多关于Fiddler和代理工具的使用,可以参考我同事的文章代理工具Fiddler -调试与替换接口状态
代理工具做微信项目的调试配置
如果你想了解使用nodejs如何实现上述以及更多自定义的功能,敬请往下阅读。

nodejs实现代理服务器

下文中,client表示客户端(浏览器),proxy表示代理服务器,server表示目标服务器

HTTP

实现HTTP代理服务器是非常简单的,因为HTTP为明文传输,所以proxy只需要解析client的HTTP报文,再向server发送相同的请求,server响应时,proxy将HTTP响应状态,响应首部字段和响应主体返回给client即可。

这里可以使用nodejs的http模块实现

const http = require('http');
const { URL } = require('url');

let server = http.createServer((req, res) => {
  let {
    pathname,
    search,
    hostname,
    port
  } = new URL(req.url);

  console.log('http ', req.url);

  // 后端api调用请求直接发送给远程服务器,除此之外的HTTP请求发送给本地运行的端口
  if (!pathname.startsWith('/api')) {
    hostname = 'localhost';
    port = 8000; // 项目运行的端口
  }

  req.pipe(http.request({
    hostname,
    port,
    path: `${pathname}${search}`,
    method: req.method,
    headers: req.headers
  }, (response) => {
    res.writeHead(response.statusCode, response.statusMessage, response.headers);
    response.pipe(res);
  }));
});

server.listen(8888);

HTTPS

只有HTTP代理服务器是不够的,因为不管是微信开发工具,还是浏览器,都有可能发送HTTPS请求。比如微信开发者工具的登录和域名校验就是使用的HTTPS与微信服务器通信的,如果不代理这部分流量是无法正常运行微信开发者工具的。

HTTPS因为报文加密的原因,proxy不能解析报文后伪装client发送请求。最常见的解决方案是web隧道,proxy建立和client、server的TCP连接,之后盲转发两端的数据。

建立web隧道的方式之一是使用HTTP的CONNECT方法,实际上客户端(浏览器)设置了代理服务器后,client发出的HTTPS请求是不同的,它首先会使用CONNECT方法发送HTTP请求,请求proxy建立连接,这是proxy能代理HTTPS的关键。

client请求proxy与server建立TCP连接的HTTP报文如下:

CONNECT your.domain:443 HTTP/1.1
Host: your.domain:443
Connection: keep-alive
User-Agent: M....

proxy在与server建立TCP连接后,按照约定,需要200 Connection Established响应,响应首部字段可自定义:

HTTP/1.1 200 Connection Established
Connection: close

所以http服务器就可以代理https请求。实际上,按照上面的原理http服务器能够代理很多其他协议的流量。

https代理服务器需要使用http和net模块,对上面的http代理的代码扩展即可

server.on('connect', (req, clientSocket) => {
  let {
    port,
    hostname
  } = new URL(`http://${req.url}`);

  console.log('https', req.url);

  let serverSocket = net.connect(port || 80, hostname, () => {
    clientSocket.write(
      `HTTP/1.1 200 Connection Established
Connection: close

`
    );

    clientSocket.pipe(serverSocket);
    serverSocket.pipe(clientSocket);
  });
});

从实现方式可以看出来,这种代理服务器是无法正常获取和更改通信双方的数据的。如果要实现能监听和更改通信数据的HTTPS代理服务器,可以使用自签名证书实现,这里不做探究。

websocket

本地开发的项目往往有热更新功能,而热更新的通信依靠websocket,所以websocket代理也是必不可少的。websocket的连接也是用HTTP建立起来的。
如果根据我们之前了解的websocket知识,client会向服务器发送协议升级请求(请求报文中包含特殊的请求首部字段),服务器响应101 Switching Protocols,之后的数据则转为websocket协议发送。根据以上流程,同样只需要对http服务器代码扩充即可,我们很容易写出如下代码:

server.on('upgrade', (req, clientSocket) => {
  let {
    pathname,
    search,
    hostname,
    port
  } = new URL(req.url);

  console.log('websocket', req.url);

  let request = http.request({
    pathname: 'localhost',
    port: 8000, // 项目运行的端口
    method: req.method,
    headers: req.headers
  });

  req.pipe(request);

  request.on('upgrade', (response, serverSocket) => {
    let resStr = 'HTTP/1.1 101 Switching Protocols\r\n';

    for (let [key, value] of Object.entries(response.headers)) {
      resStr += `${key}: ${value}\r\n`;
    }

    resStr += '\r\n';

    clientSocket.write(resStr);
    clientSocket.pipe(serverSocket);
    serverSocket.pipe(clientSocket);
  });
});

server.listen(8888)

上面的写法实际上是反向代理服务器的写法。即,浏览器直接建立到ws://localhost:8888的请求,该代理服务器是能够将请求转发到8000端口的,但当浏览器设置了代理服务器后,发送websocket请求和没设置前是不同的,它同样会先向proxy请求建立连接,所以代理websocket请求和代理https请求代码是一样的,我们在connect事件中做好区分即可。

server.on('connect', (req, clientSocket) => {
  let {
    port,
    hostname
  } = new URL(`http://${req.url}`);

  console.log('https', req.url);

  // websocket请求发送到本地8000端口
  if (req.url === 'your.domain.com:80') {
    port = 8000; // 项目运行的端口
    hostname = 'localhost';
  }

  let serverSocket = net.connect(port || 80, hostname, () => {
    clientSocket.write(
      `HTTP/1.1 200 Connection Established
Connection: close

`
    );

    console.log(req.url, 'connect');

    clientSocket.pipe(serverSocket);
    serverSocket.pipe(clientSocket);
  });
});

经过以上三步,一个带有完整功能的代理服务器就写好了,想要实现自定义功能,无非是在请求报文识别和server响应报文篡改上做文章,尽情发挥你的创造力吧。

原文链接

【作者简介】:叶茂,芦苇科技web前端开发工程师,代表作品:口红挑战网红小游戏、服务端渲染官网、微信小程序粒子系统。擅长网站建设、公众号开发、微信小程序开发、小游戏、公众号开发,专注于前端领域框架、交互设计、图像绘制、数据分析等研究。 一起并肩作战: yemao@talkmoney.cn 访问 www.talkmoney.cn 了解更多

点赞
收藏
评论区
推荐文章
刘望舒 刘望舒
4年前
Android AOSP基础(五)Android Studio调试系统源码的三种方式
AOSP基础Android框架层本文首发于微信公众号「刘望舒」前言作为应用开发,我们将AOSP源码下载下来后,去查看源码已经足够用,如果想更进一步,可以学习调试源码,这样有助于了解系统源码和原理。调试系统源码的方式有很多种,今天分享出来的是比较适合应用开发的三种,分别是AOSP源码项目调试、导入部分源码调试、新建Android项目调试。需要注意的是,这三
Wesley13 Wesley13
3年前
RCA
1.背景知识微信授权,php,订阅号,微信授权代理2.问题现象外包开发个php项目,最终上线,不想让外包人员拿到服务器权限,所以总监让我介入帮忙部署。外包和业务告诉我代码在外包服务器上测试通过了要求我上线部署到自己服务器。开始我说上线部署也就3天搞定,我本来打着富裕时间去的,我也有其他开发工作要做。结果噩梦的开始,这外包也是偷懒的人,文档,sql
雷厉风行 雷厉风行
2年前
Mac程序员开发必备-Charles for Mac 完美激活使用-抓包代理调试工具、类 Fiddler
CharlesforMac是一款完美激活使用的抓包代理调试工具,被誉为类Fiddler的大师级工具,是Mac程序员开发必备的一款集成环境。它可以用于HTTP和HTTPS网络通信抓包和分析,极大地简化了程序员的开发调试工作。
Jacquelyn38 Jacquelyn38
4年前
手写一个仿微信登录的nodejs程序
前言首先,我们看一下微信开放文档中的一张图:上面的一幅图中清楚地介绍了微信登录整个过程,下面对图上所示进行总结:一、二维码的获得1.用户打开登录网页后,登录网页后台根据微信OAuth2.0协议向微信开发平台请求授权登录,并传递事先在微信开发平台中审核通过的AppID和AppSecrect等参数;2.微信开发平台对AppID等参数进行验证,并向
liam liam
2年前
Postman 调试微信支付接口教程,一看就会
前期准备在使用Postman调试微信支付接口之前,你需要做好以下准备:安装客户端应用,或使用网页版;成为;已申请。当你已经具备这三个条件,就可以进入微信支付接口调试之旅了脚本导入方式一:通过fork方式为了帮助商户开发者快速上手,微信官方将调试微信支付接口
Stella981 Stella981
3年前
Node.js 和 Apache 共用 80 端口
在CentOS上使用Apache的Proxymode使Node.js和Apache共用80端口最近用Node.js开发一个微信公共平台接口,由于微信公众平台接口配置目前仅支持默认的80端口,而我的C
Stella981 Stella981
3年前
Egret白鹭开发微信小游戏分享功能
今天给大家分享一下微信分享转发功能,话不多说,直接干方法一:1.在egret中打开Platfrom.ts文件,添加代码如下(当然,你也可以直接复制粘贴)/平台数据接口。由于每款游戏通常需要发布到多个平台上,所以提取出一个统一的接口用于开发者获取平台数据信息推荐开发者通过这种方
Stella981 Stella981
3年前
LayaAir:用3D项目演示老项目如何适配微信小游戏
在QQ上线玩一玩后,引擎部同事彻夜鏖战,刚刚终于上线了1.7.15beta版。推出了QQ玩一玩与微信小游戏的一键发布功能。小编送上一篇刚出炉的技术干货,希望能给开发者带来帮助。之前有介绍过微信小游戏的创建与调试全流程,从1.7.15beta开始,这个流程更加完善,尤其是TS与JS的开发者,也可以做到一键发布微信小游戏了。本篇尽可
Wesley13 Wesley13
3年前
C#开发——网站应用微信登录开发
1\.在微信开放平台注册开发者账号,并有一个审核已通过的网站应用,并获得相对应的AppID和AppSecret,申请通过登陆后,方可开始接入流程。2.微信OAuth2.0授权登录目前支持authorization\_code模式,适用于拥有server端的应用授权。该模式整体流程为:1.第三方发起微信授权登录请求,微信用户允许授权第三方应
绣鸾 绣鸾
2年前
HTTPS调试分析软件Charles「mac」
Charles是一款功能强大的网络调试代理工具,主要用于对网络流量进行监控、截取和分析。它可以帮助开发人员、测试人员和系统管理员更好地理解和调试网络通信,并提供了许多有用的功能来优化和故障排除网络应用程序。以下是Charles软件的特点和功能:代理功能:C
京东小程序平台助力快送实现跨端 | 京东云技术团队
前言:京东小程序开放平台是由京东自主研发的开发者开放平台,类似于微信和支付宝的小程序开放平台,提供了丰富的开放能力和完整的小程序开发生命周期所需的功能。开发者可以轻松地使用开发者工具IDE进行开发、调试、预览和代码转换,并在控制台进行线上小程序发布、审核、
任夔
任夔
Lv1
熬过低谷,花期不远。
文章
2
粉丝
0
获赞
0