[英]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使用的有线格式状态code
和message
。 在您的情况下,如果返回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.