2017-05-22 5 views
0

私はprotocol bufferファイルがあります:私は私のサーバーが移動中に書かれているgRPC:囲碁サーバとJavaクライアントで複数の戻り値を取得する方法

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 
} 

(複数の値を返すことができます言語)、そして私のクライアントをAndroidアプリケーションです。

私は、サーバーのために行くのコードを生成するには、このいるProtobufを使用する場合、それはのようなものです:戻り値、(*LoginResponse, error)があること

... 
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 
} 
... 

は注意してください。

私は私のAndroidのサイドのJavaコードを生成するには、このいるProtobufを使用するときに今、私のようなものを得る:ここでは、Javaのことができ、myApp.v1.LoginResponseのようなだけの戻り値がある、ということ

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

はお知らせ。

私の質問は、サーバーによって返されたエラーの場合(return nil, errなど)、Android側で2番目の戻り値を取得する方法です。

+0

例外として、 – RickyA

答えて

1

Goでは、Loginメソッドによって返されたエラーは、gRPCによって使用されるcodeおよびmessageのワイヤフォーマットステータスに変換されます。あなたのケースでは、status.Statusを返すと、コードとメッセージが送信され、Java側にStatusRuntimeExceptionとして表示されます。 Statusエラー以外を返すと、gRPCはそれをUNKNOWNコードに変換しますが、メッセージは保持します。

これは、Goの戻り値が2つ、Javaの戻り値が2つあるためです。 Javaはその場所に例外を投げることによって第2の値を「返す」ことができます。

0

Javaは複数の戻り値をサポートしていないため、protoBufがJavaコードに生成されると、例外がスローされてエラーが通知されます。 try-catchブロックでgRPCコールを行い、コールがスローする可能性のあるStatusRuntimeExceptionをキャッチします。

関連する問題