You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Postman脚本中将请求体从JSON转换为Protobuf?

问题解答

原脚本的错误点

  • 语法错误原因:Postman的Pre-request Script运行在非模块环境中,不支持ES6的import语法,而且Postman并没有内置google-protobuf库,直接引用会报错。
  • 逻辑错误:你用new Protobuf.Message()的方式完全不对——Protobuf是强类型的,必须先定义对应的消息结构(和Golang里用protoc生成的结构体逻辑一致),不能直接创建通用的Message实例并随意设置字段。

Postman的Protobuf支持方案

方案1:用Postman原生Protobuf功能(最简便)

Postman现在已经原生支持Protobuf请求体,不需要写脚本,步骤如下:

  1. 把请求的Body类型切换为protobuf;
  2. 在请求的Protobuf设置里,导入你的.proto定义文件(可在Postman全局设置的「Protobuf」选项里添加,或单个请求里直接上传);
  3. 选择对应的消息类型,然后在编辑器里输入JSON格式的内容(比如你提供的{"command_code": "test_check"}),Postman会自动序列化为Protobuf二进制数据发送。

方案2:手动编写脚本处理(自定义场景)

如果需要自定义序列化逻辑,不能直接用google-protobuf包,得先把proto编译成JS代码嵌入Postman脚本:

  1. 用protoc工具把你的.proto文件编译为JavaScript代码:
    protoc --js_out=import_style=commonjs,binary:. your_message.proto
    
  2. 把生成的JS代码复制到Postman的Pre-request Script中,注意把代码里的模块导出(比如module.exports = ...)改成全局变量(比如window.TestRequest = ...,对应你的消息类型);
  3. 编写序列化逻辑:
    // 假设你的消息类型是TestRequest,编译后已挂载到全局
    const req = new TestRequest();
    req.setCommandCode("test_check");
    const serialized = req.serializeBinary();
    // 将二进制数据设置为请求体
    pm.request.body.raw = serialized;
    

方案3:复用Golang生成的二进制数据

你之前直接打印二进制得到乱码,是因为Golang直接输出[]byte会显示字符形式,需要先转成十六进制或Base64字符串:

  • 在Golang中转换:
    import "encoding/hex"
    // ...
    protodata, err := proto.Marshal(&protoStruct)
    if err != nil {
        // 错误处理
    }
    // 转成十六进制字符串
    fmt.Println(hex.EncodeToString(protodata))
    
  • 在Postman脚本中将十六进制转回二进制并设置为请求体:
    const hexStr = "0A086669656C6431120676616C756531";
    // 十六进制转Uint8Array
    const bytes = new Uint8Array(hexStr.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
    pm.request.body.raw = bytes;
    // 记得把请求Body类型设为binary
    

内容的提问来源于stack exchange,提问作者echo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:30:16