如何在 gRPC 响应中打印所有 protobuf 字段,即使是空的

Posted

技术标签:

【中文标题】如何在 gRPC 响应中打印所有 protobuf 字段,即使是空的【英文标题】:How to print all protobuf fields in gRPC response, even when empty 【发布时间】:2021-06-04 02:49:50 【问题描述】:

我正在编写一个带有 protobuf 定义的 gRPC 服务,如下所示:

message MyRequest 


message MyResponse 
  string username = 1;
  repeated string schools = 3;


service MyService 
  rpc Service(MyRequest) returns (MyResponse) 

服务返回当前用户的学校列表。有时用户没有学校,我希望 schools 字段中的响应为空列表,但响应中缺少该字段。

我需要做什么才能让schools 字段始终出现在响应中,即使它是一个空列表?

【问题讨论】:

【参考方案1】:

在协议缓冲区中,重复字段只是一个具有多个在线发送值的字段。使用这种编码,“空”和“不存在”之间没有区别。

如果您需要区分空和“不存在”,您需要将重复字段包装在其自己的消息中并检查该消息是否存在。

message MyRequest 


message MyResponse 
  string username = 1;
  Schools schools = 2;


message Schools 
  repeated string names = 1;


service MyService 
  rpc Service(MyRequest) returns (MyResponse) 

myResponse.hasSchools() == false 表示“不存在”。

【讨论】:

以上是关于如何在 gRPC 响应中打印所有 protobuf 字段,即使是空的的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 gRPC / protobuf 版本?

教你使用ProtoBuf,通过gRPC服务在Android上进行网络请求

grpc和protobuf结合的示例

如何为 gRPC 生成的 Java 代码实现 com.google.protobuf.BlockingRpcChannel?

尝试使用 protobuf-net 通过 gRPC-Web 进行 Azure AD 身份验证

protobuf及grpc的client请求