gRPC 方法是否可以返回包含字符串或空字段的消息?

问题描述

我正在设计一个用 Go 编写的 gRPC 服务。

在 gRPC 服务前面的是 Envoy,它将传入的 HTTP 请求转换为 gRPC,并将 gRPC 响应转换为 JSON。

此应用程序的要求是具有返回以下 JSON 对象的端点:

{
    my_id: "AAA"
}

我可以像这样在 Go 中非常简单地模拟这个响应:

// A MyResponse object.
message MyResponse {
  // contents is a list of contents.
  string my_id = 1;
}

但我的要求是有时 my_id 可能为空。在这种情况下,我想取回以下 JSON:

{
    my_id: null
}

是否可以修改 MyResponse 以使 my_id 可以是返回的 JSON 对象中的字符串或空值?如果是这样,如何?如果没有,这在gRPC的设计上是不是一个相当大的差距?

解决方法

我建议您使用包 google.protobufStringValue 字段:

StringValue 字符串的包装消息。

StringValue 的 JSON 表示是 JSON 字符串。

所以在你的 proto 文件中,你应该导入:

import "google/protobuf/wrappers.proto";

然后作为例子:

  google.protobuf.StringValue name = 2;

要处理这些值,您可以检查 wrappers.StringValue github.com/golang/protobuf/ptypes/wrappers 包的类型和 google.golang.org/protobuf/types/known/wrapperspb 存储库的助手。