grpc-gatewayでネストされたリクエストパラメタを指定する

gRPCで、ValueObject的にサービスのリクエストメッセージを定義することはよくあるのかなーと思います。

ただ、grpc-gatewayを使う際に、型がネストするので、パラメタの指定がわかりにくかった。。

まとめられてるページもなさそうだったので、ここでまとめてみます。

クエリパラメタ

.区切りでプリミティブな型まで指定します。

こんな感じのリクエストメッセージがあるとすると、

service User {
  rpc FetchByName (UserFetchByNameRequest) returns (UserFetchByNameResponse) {
    option (google.api.http) = {
      get: "/users"
    };
  };
}

message UserFetchByNameRequest {
  User.Name name = 1;
}

message User {
  ...

  message Name {
    string value = 1;
  }
}

?name.value="hikouki"でクエリパラメタを指定できます。

curl -i -XGET http://localhost:8080/users?name.value="hikouki"

パスパラメタ

クエリパラメタと同じく、.区切りでプリミティブな型まで指定します。

こんな感じのリクエストメッセージがあるとすると、

service User {
  rpc Fetch (UserFetchRequest) returns (UserFetchResponse) {
    option (google.api.http) = {
      get: "/users/{id.value}"
    };
  };
}

message UserFetchRequest {
  User.ID id = 1;
}

message User {
  ...

  message ID {
    string value = 1;
  }
}

/users/1でパスパラメタを指定できます。

curl -i -XGET http://localhost:8080/users/1

リクエストボディ

オブジェクトでネストして指定します。

こんな感じのリクエストメッセージがあるとすると、

service User {
  rpc Create (UserCreateRequest) returns (UserCreateResponse) {
    option (google.api.http) = {
      post: "/users"
      body: "*"
    };
  };
}

message UserCreateRequest {
  User.Name name = 1;
}

message User {
  ...

  message Name {
    string value = 1;
  }
}

JSONで、'{"name": {"value": "hikouki"}}'をリクエストボディに指定します。

curl -i -XPOST http://localhost:8080/users -d '{"name": {"value": "hikouki"}}'