如何在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请求体,不需要写脚本,步骤如下:
- 把请求的Body类型切换为
protobuf; - 在请求的Protobuf设置里,导入你的
.proto定义文件(可在Postman全局设置的「Protobuf」选项里添加,或单个请求里直接上传); - 选择对应的消息类型,然后在编辑器里输入JSON格式的内容(比如你提供的
{"command_code": "test_check"}),Postman会自动序列化为Protobuf二进制数据发送。
方案2:手动编写脚本处理(自定义场景)
如果需要自定义序列化逻辑,不能直接用google-protobuf包,得先把proto编译成JS代码嵌入Postman脚本:
- 用
protoc工具把你的.proto文件编译为JavaScript代码:protoc --js_out=import_style=commonjs,binary:. your_message.proto - 把生成的JS代码复制到Postman的Pre-request Script中,注意把代码里的模块导出(比如
module.exports = ...)改成全局变量(比如window.TestRequest = ...,对应你的消息类型); - 编写序列化逻辑:
// 假设你的消息类型是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
相关产品推荐
相关产品推荐

