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