【问题标题】:How to return a simple boolean value in ProtoBuffer?如何在 ProtoBuf 中返回一个简单的布尔值?
【发布时间】:2019-05-24 14:29:23
【问题描述】:

在我的proto 文件中,我定义了一个服务接口:

syntax = "proto3";

package mynamespace;

import "google/protobuf/empty.proto";

service MyService {
    rpc isTokenValid (TokenRequest) returns (TokenResponse) {
    }
}

message TokenRequest {
    string token = 1;
}

message TokenResponse {
    bool valid = 1;
}

上面的效果很好,但是,我认为 TokenResponse 很难看。 bool valid = 1 是多余的,理想情况下应该如下所示

rpc isTokenValid (TokenRequest) returns (BooleanResponse) {
}

但我不知道如何编写这样的proto 文件,任何专家可以分享一些最佳实践吗?

提前致谢!

更新:

如何直接返回一个数组?例如,这是我的代码:

service MyService {
    rpc arrayResponse (TokenRequest) returns (ArrayResponse) {}
}

message ArrayResponse {
    repeated Data data = 1;
}

message Data {
    string field1 = 1;
    string field2 = 2;
}

我觉得这很丑,如何用正确的google方式重构?

谢谢!

【问题讨论】:

    标签: protocol-buffers proto protobuf.js


    【解决方案1】:

    为什么不直接使用 Google 的 wrappers.proto 中指定的预定义 BoolValue 进行回复?

    类似:

    syntax = "proto3";
    
    package mynamespace;
    
    import "google/protobuf/wrappers.proto";
    
    service MyService {
        rpc isTokenValid (TokenRequest) returns (google.protobuf.BoolValue) {
        }
    }
    
    message TokenRequest {
        string token = 1;
    }
    

    【讨论】:

    • 非常感谢!你知道如何直接返回数组响应吗?你能检查我更新的问题吗?
    • 我认为您提出的方式(带有重复字段的 ArrayResponse)是正确的。您是否希望它能够返回任意类型的数组?如果是这样,您可以使用 google.protobuf.Any 作为数据类型。
    • 谢谢!我想返回一个类型化数组而不将其包装在额外的数据字段中。只有Any能做到吗?
    • 警告:这是一条危险的兼容性之路。你永远不知道未来会有什么请求。您不能再在回复中添加更多字段。每个请求和每个响应都应该是“您的”消息对象,以便灵活且面向未来。这也是 gRPC 只允许 1 个请求和 1 个响应的原因。
    • @DeanHiller 同意。实际上,适当的服务定义将利用服务创建者编写的请求和响应消息。然后,在您需要可为空的原始值的情况下,这些创作的消息可以使用 google 包装类作为字段值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多