一、为什么需要处理 MessagePack
- 调试痛点:MessagePack 是二进制格式,直接在抓包工具中显示为乱码,难以阅读和分析
- 开发需求:后端服务使用 MessagePack 作为通信格式,但前端开发更习惯 JSON 格式
- 测试场景:需要模拟 MessagePack 格式的请求,但手动构造二进制数据十分困难
二、核心解决方案概述
通过 Reqable 的脚本拦截器功能,我们可以实现:
- 请求阶段:将 JSON 格式的请求体转换为 MessagePack 二进制
- 响应阶段:将 MessagePack 二进制响应自动转换为可读的 JSON 格式
- 无缝转换:开发人员无需手动处理二进制数据,像调试 JSON 一样调试 MessagePack
三、脚本代码详解
import msgpack |
import json |
from reqable import * |
def onRequest(context, request): |
""" |
拦截请求,将 JSON POST 请求的 body 转为 MessagePack 格式 |
""" |
# 判断是否为 JSON 类型的 POST 请求 |
isJson = request.contentType == 'application/json' |
isPost = request.method == 'POST' |
if isJson and isPost: |
try: |
# 获取原始 JSON 字符串 |
bodyRaw = request.body.payload |
# 解析为 Python 字典 |
dataDict = json.loads(bodyRaw) |
# 将字典打包为 MessagePack 二进制 |
msgpackBin = msgpack.packb(dataDict) |
# 修改请求头和 body |
request.headers['content-type'] = 'application/msgpack' |
request.body.binary(msgpackBin) |
except Exception as e: |
# 记录异常,不中断流程 |
print(f"在`重写请求`时,发生错误:{e}") |
return request |
def onResponse(context, response): |
""" |
拦截响应,将 MessagePack 格式的响应 body 转为文本 |
""" |
# 判断是否为 MessagePack 类型的响应 |
contentType = response.contentType.lower() |
isMsgpack = contentType == 'application/msgpack' or contentType == 'application/x-msgpack' |
if isMsgpack: |
try: |
# 获取响应数据(返回是多态的,需要做类型判断) |
bodyPayload = response.body.payload |
# 处理不同类型的 payload(可能是字符串或二进制) |
if isinstance(bodyPayload, str): |
bodyBin = bodyPayload.encode('latin-1') |
elif isinstance(bodyPayload, bytes): |
bodyBin = bodyPayload |
else: |
raise TypeError("不支持的数据类型") |
# 解包为 Python 对象 |
unpackedData = msgpack.unpackb(bodyBin, raw=False) |
# 将解包后的对象转为字符串并替换 body |
response.body.text(unpackedData) |
except Exception as e: |
# 记录异常,不中断流程 |
print(f"在`重写响应`时,发生错误:{e}") |
return response |
四、使用方法
安装 Reqable 和 Python3(包含 pip)
- Reqable
- Python
安装
msgpack库pip install msgpack配置脚本环境、创建脚本:在 Reqable 中新建脚本拦截器,粘贴上述代码
配置规则:设置脚本应用于特定域名或所有请求,并启用脚本 或者 项目文件夹设置脚本
按文件夹设置脚本开始调试:
发送 JSON 格式请求,自动转换为 MessagePack 发出
接收 MessagePack 响应,自动转换为 JSON 显示