【问题标题】:gRPC: How to get multiple return values in Java client with Go servergRPC:如何使用 Go 服务器在 Java 客户端中获取多个返回值
【发布时间】:2017-05-22 12:08:34
【问题描述】:

我有一个protocol buffer 文件:

syntax = "proto3";
package v1api;
option java_multiple_files = true;
option java_package = "myApp.v1";
option java_outer_classname = "V1";

service API {
    rpc Login(LoginRequest) returns (LoginResponse)
}

message LoginRequest {
    int pin = 1
}

message LoginResponse {
    string token = 1
}

我的服务器是用 Go(一种可以返回多个值的语言)编写的,我的客户端是一个 Android 应用程序。

当我使用这个 protoBuf 为服务器生成 Go 代码时,它是这样的:

...
func (c *aPIClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) {
    out := new(LoginResponse)
    err := grpc.Invoke(ctx, "/v1api.API/Login", in, out, c.cc, opts...)
    if err != nil {
        return nil, err
    }
    return out, nil
}
...

注意有两个返回值,(*LoginResponse, error)

现在,当我使用这个 protoBuf 为我的 Android 端生成 Java 代码时,我得到了类似的东西:

public myApp.v1.LoginResponse login(myApp.v1.LoginRequest request) {
    return blockingUnaryCall(getChannel(), METHOD_LOGIN, getCallOptions(), request);
}

请注意,这里只有 一个 像 Java 允许的返回值,myApp.v1.LoginResponse

我的问题是,如果服务器返回错误(例如:return nil, err),我将如何在我的 Android 端获得第二个返回值。

【问题讨论】:

  • 例外?

标签: java go protocol-buffers grpc grpc-java


【解决方案1】:

在 Go 中,Login 方法返回的错误将转换为 gRPC 使用的线格式状态 codemessage。在您的情况下,如果您返回 status.Status,代码和消息将被发送并在 Java 端显示为 StatusRuntimeException。如果返回非Status 错误,gRPC 会将其转换为UNKNOWN 代码,但保留消息。

这就是为什么 Go 有两个返回值,而 Java 只有一个。 Java 可以通过在其位置抛出异常来“返回”辅助值。

【讨论】:

    【解决方案2】:

    由于Java不支持多个返回值,当一个protoBuf生成到java代码中时,错误是通过抛出异常来传达的。在 try-catch 块中进行 gRPC 调用,并捕获调用可能抛出的任何 StatusRuntimeException

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2017-02-11
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多