使用BloomRPC/Postman测试gRPC接口时details字段格式报错
问题原因与解决方案
核心问题
google.protobuf.Any类型在JSON序列化时必须遵循特定格式,不能直接传字符串、数字这类原始值——因为Any需要携带@type类型标识字段,告诉服务端该用哪种Protobuf类型解析这个值。你直接传普通值,服务端无法识别,所以触发object expected错误。
正确的JSON请求格式
把details里的每个值都包装成符合Any类型要求的结构即可,示例如下:
{ "name": "great name", "details": { "some_details": { "@type": "type.googleapis.com/google.protobuf.StringValue", "value": "detail value" }, "some_int": { "@type": "type.googleapis.com/google.protobuf.Int32Value", "value": 123 } } }
关键说明
@type是必填字段,格式为type.googleapis.com/[Protobuf类型全名],用来指定值对应的Protobuf类型- 常用基础类型的Any包装对应关系:
- 字符串 →
google.protobuf.StringValue - 32位整数 →
google.protobuf.Int32Value - 64位整数 →
google.protobuf.Int64Value - 布尔值 →
google.protobuf.BoolValue - 浮点数 →
google.protobuf.FloatValue
- 字符串 →
- 如果是自定义的Protobuf消息类型,
@type要替换成你自己的类型URL,比如type.googleapis.com/your.package.YourCustomMessage
为什么客户端代码调用正常?
因为Protobuf官方SDK(比如Java、Golang的客户端)会自动帮你把原始值封装成Any类型的完整结构,包括添加@type字段,所以不需要手动处理。但直接用JSON工具调用时,必须手动遵循这个格式。
内容的提问来源于stack exchange,提问作者new line
相关产品推荐
相关产品推荐

