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

在Web 开发和 API 调试中,经常需要处理各种数据格式的请求和响应,而其中有个特殊的格式就是 application/msgpack
MessagePack 作为一种高效的二进制序列化格式,因其体积小、解析快的特点,在高性能 API 通信中越来越受欢迎。
可是,当我们在着手调试时中看到是二进制格式的数据,往往难以阅读和分析。
本文将介绍如何通过 Reqable 工具,实现 MessagePack 与 JSON 格式之间的自动转换,提升调试效率。

一、为什么需要处理 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)

  2. 安装 msgpack

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

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

    按文件夹设置脚本
    SS_20260410_111445

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

五、效果展示

启用脚本前

SS_20260410_104747

启用脚本后

SS_20260410_111329

posted @ 2026-04-10 10:34  M.Zhaofu  阅读(3)  评论(0)    收藏  举报