gRPC服务方法声明能否直接使用string、int32等简单类型作为输入?
gRPC proto文件中能否直接使用简单类型作为服务方法参数?
不行,gRPC(基于protobuf3)要求服务方法的输入和输出必须是message类型,不能直接用string、int32这类基础数据类型,这就是你遇到error: Expected message type错误的原因。
不过有两种替代方案可以不用自己手动写复杂的包裹类:
1. 使用Protobuf官方内置的包装类型
Protobuf提供了一系列预定义的包装message,专门用来封装基础类型,比如google.protobuf.StringValue、google.protobuf.Int32Value等。你只需要导入对应的proto文件就能直接用。
修改你的代码示例如下:
syntax = "proto3"; package MyPackage.SimpleServices; option csharp_namespace = "MyGrpcServices"; // 导入官方包装类型的proto文件 import "google/protobuf/wrappers.proto"; service MySimpleService { // 使用StringValue作为输入参数 rpc GetData(google.protobuf.StringValue) returns (ServiceData); } message ServiceData { string fieldOne = 1; int32 fieldTwo = 2; string fieldThree = 3; }
这些包装类型不仅能满足传递单个基础类型的需求,还支持识别“null”值(proto3的基础类型默认有默认值,无法区分未设置和设置了默认值的情况,包装类型可以解决这个问题)。
2. 自定义极简的包裹message
如果不想依赖官方的包装类型,也可以自己定义一个只包含单个基础类型的message,比如:
syntax = "proto3"; package MyPackage.SimpleServices; option csharp_namespace = "MyGrpcServices"; service MySimpleService { rpc GetData(StringRequest) returns (ServiceData); } // 自定义包裹单个string的message message StringRequest { string value = 1; } message ServiceData { string fieldOne = 1; int32 fieldTwo = 2; string fieldThree = 3; }
这两种方式都能解决你遇到的问题,根据自己的需求选择即可。
内容的提问来源于stack exchange,提问作者Pirkratek
相关产品推荐
相关产品推荐

