问题描述
我正在设计一个用 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.protobuf
的 StringValue 字段:
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 存储库的助手。