Add generic JSON-over-GRPC wrapper to examples/rest-grpc-multiplex #1082
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Resolves #1068 and #1069.
Add a function to
examples/rest-grpc-multiplex
that provides a generic wrapper to expose a HTTP/JSON frontend for any gRPC call. For the provided example code, this provides a HTTP endpoint with the following behavior:Motivation
Make it easy to provide an API that is compatible with both gRPC and JSON, that uses a single backing implementation, with minimal additional boilerplate required for each new endpoint. This can be very helpful for users to create backwards/forwards-compatible APIs.
Solution
For context - the following is a specific implementation of a JSON wrapper around the
GrpcServiceImpl::say_hello
function that is compatible with the axum::Handler trait:The json_wrap_grpc function included in this PR is a genericization of the above code, making it possible to wrap any GRPC handler into an axum::Handler with a single function call.
It was quite a hassle to make the generic version compile (I was butting heads with rust-lang/rust#36582 and/or rust-lang/rust#41078), so I am hoping that this can be helpful to others who might want to do something similar.