クイックスタート
このガイドでは、DartでgRPCを始めるための簡単な実例を紹介します。
クイックスタート
前提条件
Dart バージョン2.12以降 DartまたはFlutter SDK経由
インストール手順については、DartのインストールまたはFlutterのインストールを参照してください。
インストール手順については、プロトコルバッファコンパイラのインストールを参照してください。
プロトコルコンパイラのDartプラグイン
次のコマンドを使用して、Dart(
protoc-gen-dart
)のプロトコルコンパイラプラグインをインストールします。$ dart pub global activate protoc_plugin
protoc
コンパイラがプラグインを見つけられるように、PATH
を更新します。$ export PATH="$PATH:$HOME/.pub-cache/bin"
注記
Dart gRPCは、Flutterとサーバープラットフォームをサポートしています。サンプルコードを取得する
サンプルコードは、grpc-dartリポジトリの一部です。
リポジトリをzipファイルとしてダウンロードして解凍するか、リポジトリをクローンします。
$ git clone https://github.com/grpc/grpc-dart
クイックスタートのサンプルディレクトリに移動します。
$ cd grpc-dart/example/helloworld
サンプルを実行する
example/helloworld
ディレクトリから
パッケージの依存関係をダウンロードします。
$ dart pub get
サーバーを実行します。
$ dart bin/server.dart
別のターミナルから、クライアントを実行します。
$ dart bin/client.dart Greeter client received: Hello, world!
おめでとうございます! gRPCを使用したクライアントサーバーアプリケーションを実行しました。
アプリを更新する
このセクションでは、追加のサーバーメソッドを使用するようにアプリを更新します。 gRPCサービスは、プロトコルバッファを使用して定義されます。 .proto
ファイルでサービスを定義する方法の詳細については、基本チュートリアルを参照してください。今のところ、知っておく必要があるのは、サーバーとクライアントスタブの両方に、クライアントから`HelloRequest`パラメータを受け取り、サーバーから`HelloReply`を返す`SayHello()` RPCメソッドがあり、メソッドは次のように定義されていることです。
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
gRPCサービスを更新する
protos/helloworld.proto
を開き、同じリクエストとレスポンスタイプを持つ新しい`SayHelloAgain()`メソッドを追加します。
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
ファイルを保存することを忘れないでください!
gRPCコードを再生成する
新しいサービスメソッドを使用する前に、更新されたprotoファイルを再コンパイルする必要があります。 `example/helloworld`ディレクトリから、次のコマンドを実行します。
$ protoc --dart_out=grpc:lib/src/generated -Iprotos protos/helloworld.proto
再生成されたリクエストとレスポンスのクラス、およびクライアントとサーバーのクラスは、`lib/src/generated`ディレクトリにあります。
次に、それぞれサーバーとクライアントコードで新しいRPCを実装して呼び出します。
サーバーを更新する
`bin/server.dart`を開き、`GreeterService`クラスに次の`sayHelloAgain()`メソッドを追加します。
class GreeterService extends GreeterServiceBase {
@override
Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
return HelloReply()..message = 'Hello, ${request.name}!';
}
@override
Future<HelloReply> sayHelloAgain(ServiceCall call, HelloRequest request) async {
return HelloReply()..message = 'Hello again, ${request.name}!';
}
}
クライアントを更新する
次のように、`bin/client.dart`に`sayHelloAgain()`の呼び出しを追加します。
Future<void> main(List<String> args) async {
final channel = ClientChannel(
'localhost',
port: 50051,
options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
);
final stub = GreeterClient(channel);
final name = args.isNotEmpty ? args[0] : 'world';
try {
var response = await stub.sayHello(HelloRequest()..name = name);
print('Greeter client received: ${response.message}');
response = await stub.sayHelloAgain(HelloRequest()..name = name);
print('Greeter client received: ${response.message}');
} catch (e) {
print('Caught error: $e');
}
await channel.shutdown();
}
更新されたアプリを実行する
以前と同様に、クライアントとサーバーを実行します。 `example/helloworld`ディレクトリから次のコマンドを実行します。
サーバーを実行します。
$ dart bin/server.dart
別のターミナルから、クライアントを実行します。今回は、コマンドライン引数として名前を追加します。
$ dart bin/client.dart Alice
次の出力が表示されます。
Greeter client received: Hello, Alice! Greeter client received: Hello again, Alice!
貢献
Dart gRPCで問題が発生した場合、または機能リクエストがある場合は、問題を作成 grpc-dartリポジトリを介して。