繁体   English   中英

gRPC:如何使用Go服务器在Java客户端中获取多个返回值

[英]gRPC: How to get multiple return values in Java client with Go server

我有一个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端获取第二个返回值。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM