Skip to content
Snippets Groups Projects
Select Git revision
  • release
  • XX-4441
  • tls-websockets
  • master
  • origin-fork
5 results

grpc-web-go-client

  • Clone with SSH
  • Clone with HTTPS
  • gRPC Web Go client

    GoDoc GitHub Actions

    THE IMPLEMENTATION IS LACKING

    gRPC Web client written in Go.

    Usage

    The server is here.

    Send an unary request.

    client := grpcweb.NewClient("localhost:50051")
    
    in, out := new(api.SimpleRequest), new(api.SimpleResponse)
    in.Name = "ktr"
    
    // You can get the endpoint from grpcweb.ToEndpoint function with descriptors.
    // However, I write directly in this example.
    req := grpcweb.NewRequest("/api.Example/Unary", in, out)
    
    res, err := client.Unary(context.Background(), req)
    if err != nil {
      log.Fatal(err)
    }
    
    // hello, ktr
    fmt.Println(res.Content.(*api.SimpleResponse).GetMessage())

    Send a server-side streaming request.

    req := grpcweb.NewRequest("/api.Example/ServerStreaming", in, out)
    
    stream, err := client.ServerStreaming(context.Background(), req)
    if err != nil {
      log.Fatal(err)
    }
    
    for {
      res, err := stream.Receive()
      if err == io.EOF {
        break
      }
      if err != nil {
        log.Fatal(err)
      }
      fmt.Println(res.Content.(*api.SimpleResponse).GetMessage())
    }

    Send an client-side streaming request.

    stream, err := client.ClientStreaming(context.Background())
    if err != nil {
      log.Fatal(err)
    }
    
    in, out := new(api.SimpleRequest), new(api.SimpleResponse)
    in.Name = "ktr"
    req := grpcweb.NewRequest("/api.Example/ClientStreaming", in, out)
    
    for i := 0; i < 10; i++ {
      err := stream.Send(req)
      if err == io.EOF {
        break
      }
      if err != nil {
        log.Fatal(err)
      }
    }
    
    res, err := stream.CloseAndReceive()
    if err != nil {
      log.Fatal(err)
    }
    
    // ktr, you greet 10 times.
    fmt.Println(res.Content.(*api.SimpleResponse).GetMessage())

    Send a bidirectional streaming request.

    in, out := new(api.SimpleRequest), new(api.SimpleResponse)
    req := grpcweb.NewRequest("/api.Example/BidiStreaming", in, out)
    
    stream := client.BidiStreaming(context.Background(), req)
    
    go func() {
      for {
        res, err := stream.Receive()
        if err == grpcweb.ErrConnectionClosed {
          return
        }
        if err != nil {
          log.Fatal(err)
        }
        fmt.Println(res.Content.(*api.SimpleResponse).GetMessage())
      }
    }()
    
    for i := 0; i < 2; i++ {
      in.Name = fmt.Sprintf("ktr%d", i+1)
      req := grpcweb.NewRequest("/api.Example/BidiStreaming", in, out)
    
      err := stream.Send(req)
      if err == io.EOF {
        break
      }
      if err != nil {
        log.Fatal(err)
      }
    }
    
    // wait a moment to get responses.
    time.Sleep(10 * time.Second)
    
    if err := stream.Close(); err != nil {
      log.Fatal(err)
    }