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"}}'