通过 Reqable 处理 MessagePack 请求与响应:实战指南与代码优化技巧

一、为什么需要处理 MessagePack

  1. 调试痛点:MessagePack 是二进制格式,直接在抓包工具中显示为乱码,难以阅读和分析
  2. 开发需求:后端服务使用 MessagePack 作为通信格式,但前端开发更习惯 JSON 格式
  3. 测试场景:需要模拟 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

四、使用方法

  1. 安装 Reqable 和 Python3(包含 pip)

    • Reqable
    • Python
  2. 安装msgpack

    pip install msgpack
  3. 配置脚本环境、创建脚本:在 Reqable 中新建脚本拦截器,粘贴上述代码

  4. 配置规则:设置脚本应用于特定域名或所有请求,并启用脚本 或者 项目文件夹设置脚本

    按文件夹设置脚本

  5. 开始调试:
    发送 JSON 格式请求,自动转换为 MessagePack 发出
    接收 MessagePack 响应,自动转换为 JSON 显示

五、效果展示

启用脚本前

启用脚本后