gRPC:如何使用 Go 服务器在 Java 客户端中获取多个 return 值
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(一种可以 return 多个值的语言)编写的,我的客户端是一个 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
}
...
请注意,有 两个 return 个值,(*LoginResponse, error)
。
现在,当我使用此 protoBuf 为我的 Android 端生成 Java 代码时,我得到如下内容:
public myApp.v1.LoginResponse login(myApp.v1.LoginRequest request) {
return blockingUnaryCall(getChannel(), METHOD_LOGIN, getCallOptions(), request);
}
注意,这里只有 一个 return 值,如 Java 允许,myApp.v1.LoginResponse
.
我的问题是,如果服务器出现错误 return(例如:return nil, err
),我将如何在 [=] 中获取第二个 return 值37=]边。
由于 Java 不支持多个 return 值,当 protoBuf 生成为 java 代码时,通过抛出异常来传达错误。在 try-catch
块中进行 gRPC 调用并捕获调用可能抛出的任何 StatusRuntimeException
。
在 Go 中,由您的 Login
方法编辑的错误 return 将转换为 gRPC 使用的线格式状态 code
和 message
。在你的情况下,如果你 return 一个 status.Status, the Code and message will be sent and show up on the Java side as a StatusRuntimeException。如果你 return 一个非 Status
错误,gRPC 会将其转换为 UNKNOWN
代码,但保留消息。
这就是 Go 有两个 return 值,而 Java 只有一个值的原因。 Java 可以 "return" 通过在其位置抛出异常来获得次要值。
我有一个 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(一种可以 return 多个值的语言)编写的,我的客户端是一个 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
}
...
请注意,有 两个 return 个值,(*LoginResponse, error)
。
现在,当我使用此 protoBuf 为我的 Android 端生成 Java 代码时,我得到如下内容:
public myApp.v1.LoginResponse login(myApp.v1.LoginRequest request) {
return blockingUnaryCall(getChannel(), METHOD_LOGIN, getCallOptions(), request);
}
注意,这里只有 一个 return 值,如 Java 允许,myApp.v1.LoginResponse
.
我的问题是,如果服务器出现错误 return(例如:return nil, err
),我将如何在 [=] 中获取第二个 return 值37=]边。
由于 Java 不支持多个 return 值,当 protoBuf 生成为 java 代码时,通过抛出异常来传达错误。在 try-catch
块中进行 gRPC 调用并捕获调用可能抛出的任何 StatusRuntimeException
。
在 Go 中,由您的 Login
方法编辑的错误 return 将转换为 gRPC 使用的线格式状态 code
和 message
。在你的情况下,如果你 return 一个 status.Status, the Code and message will be sent and show up on the Java side as a StatusRuntimeException。如果你 return 一个非 Status
错误,gRPC 会将其转换为 UNKNOWN
代码,但保留消息。
这就是 Go 有两个 return 值,而 Java 只有一个值的原因。 Java 可以 "return" 通过在其位置抛出异常来获得次要值。