🏓

【Go】gRPC-connectでEmpty型を使ってみた

2023/10/25に公開

概要

gRPCでは、リクエストやレスポンスで特に使用する値が不要な場合、Empty型が用意されています。
今回はgo言語のgRPC-connectで、このEmpty型を使ってみたので実装内容を紹介します。

Empty型について

Protobuf RPC Service method without parametersの記事にある通り、gRPCではではEmptyを表現するgoogle.protobuf.Emptyが用意されています。今回はこれを使用してみます。

実装サンプル

まずはprotoファイルです。リクエストとレスポンスでそれぞれEmpty型を設定するrpcを用意します。

syntax = "proto3";

import "google/protobuf/empty.proto";

package sample;

service SampleyService {
    rpc SampleRequetEmptyRpc(google.protobuf.Empty) returns  (SampleResponse) {} // リクエストの型内容は記載を割愛
    rpc SampleResponseEmptyRpc(SampleRequest) returns (google.protobuf.Empty) {} // レスポンスの型内容は記載を割愛
}

リクエストが空の場合のserverの実装です。

import (
	"context"
	sample "sample/src/gen/proto"

	"github.com/bufbuild/connect-go"
	"google.golang.org/protobuf/types/known/emptypb"
)

func (s *SampleyServer) SampleRequetEmptyRpc(
	ctx context.Context,
	req *connect.Request[emptypb.Empty],
) (*connect.Response[sample.SampleResponse], error) {
	// 処理内容は記載を割愛
	return connect.NewResponse(&sample.SampleResponse{}), nil
}

レスポンスが空の場合のserverの実装です。

import (
	"context"
	sample "sample/src/gen/proto"

	"github.com/bufbuild/connect-go"
	"google.golang.org/protobuf/types/known/emptypb"
)

func (s *SampleyServer) SampleResponseEmptyRpc(
	ctx context.Context,
	req *connect.Request[sample.SampleRequest],
) (*connect.Response[emptypb.Empty], error) {
	// 処理内容は記載を割愛
	return connect.NewResponse(&emptypb.Empty{}), nil
}

Discussion