Hi,

Since I am newish to gRPC, I would greatly appreciate your help and advice.

*Adding some context*

I would like to consume a 3rd party gRPC server, in my case it is a 
high-end router, actually there are many of those running different 
versions of gRPC servers, but I'll use a simple example (details below) to 
demonstrate my issue/question.

In such a scenario, I am ok avoiding gRPC stubs and dealing only with 
(de)serialising messages. Better to declare an endpoint and a body than 
producing and using code for it.

I would like to a HTTP/2 client to consume the gRPC response.

*What the docs say about protobuf*

Based on (just an example, every lang has a method to convert a Protobuf 
encode message to JSON) 
https://googleapis.dev/python/protobuf/latest/google/protobuf/json_format.html

I would like to decode protobuf encoded messages to json

*What the docs say about gRPC*

Based on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md

it is doable to use a HTTP2 client if you specify the Content-Type (to be 
application/grpc+proto) and a 5 byte header in each request:

Length-Prefixed-Message (use 0x00 for Compressed-Flag)

Message-Length

*Running a gRPC server as an example*

I tried to find a playground/public gRPC server, but no luck, so I am using 
the introductory (hello world) example in the official page of gRPC 
https://grpc.io/docs/languages/go/quickstart/

$ go run greeter_server/main.go  # from one terminal

*Running a gRPC client (grpcurl) as a method to verify*
$ wget https:
//github.com/fullstorydev/grpcurl/releases/download/v1.6.1/grpcurl_1.6.1_linux_x86_64.tar.gz
$ cp grpcurl_1.6.1_linux_x86_64/grpcurl /usr/local/sbin/
$ cd grpc-go/examples/helloworld
$ grpcurl -import-path ./helloworld -proto helloworld.proto list
$ grpcurl -import-path ./helloworld -proto helloworld.proto describe 
helloworld.Greeter
$ grpcurl -plaintext -import-path ./helloworld -proto helloworld.proto   
127.0.0.1:50051 helloworld.Greeter/SayHello 
{
  "message": "Hello "
}

*Making the gRPC calll (using a HTTP/2 client)*


iex(8)> len = 0

iex(9)> body = IO.iodata_to_binary([<<0::unsigned-integer-size(8)-big>>, <<
len::unsigned-integer-size(32)-big>>])
<<0, 0, 0, 0, 0>>
iex(10)> {:ok, conn, request_ref} = Mint.HTTP2.request(conn, "POST", 
"helloworld.Greeter/SayHello", _headers = [{"content-type", 
"application/grpc+proto"}], body)


where <<0::unsigned-integer-size(8)-big>> is the *Compressed-Flag*, 
<<len::unsigned-integer-size(32)-big>> is the *Message-Length*

But I don't receive a valid HTTP response.

*Question*

Would you be so kind to point me to an example how-to achieve this?

Are you able to use a HTTP/2 client to make a gRPC call?

(without decoding the body for now)

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/983b704a-7867-49ac-95c1-bd8103721d0fo%40googlegroups.com.

Reply via email to