mirror of
https://github.com/go-micro/go-micro.git
synced 2025-05-19 21:23:04 +02:00
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package stream
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
"go-micro.dev/v4"
|
|
"go-micro.dev/v4/client"
|
|
)
|
|
|
|
// Bidirectional streams client requests and prints the server stream responses
|
|
// it receives. Exits on error.
|
|
func Bidirectional(ctx *cli.Context) error {
|
|
args := ctx.Args().Slice()
|
|
if len(args) < 2 {
|
|
return cli.ShowSubcommandHelp(ctx)
|
|
}
|
|
|
|
service := args[0]
|
|
endpoint := args[1]
|
|
requests := args[2:]
|
|
|
|
srv := micro.NewService()
|
|
srv.Init()
|
|
c := srv.Client()
|
|
|
|
var r interface{}
|
|
request := c.NewRequest(service, endpoint, r, client.WithContentType("application/json"))
|
|
var rsp map[string]interface{}
|
|
stream, err := c.Stream(ctx.Context, request)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, req := range requests {
|
|
d := json.NewDecoder(strings.NewReader(req))
|
|
d.UseNumber()
|
|
|
|
var creq map[string]interface{}
|
|
if err := d.Decode(&creq); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := stream.Send(creq); err != nil {
|
|
return err
|
|
}
|
|
|
|
err := stream.Recv(&rsp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
b, err := json.Marshal(rsp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(string(b))
|
|
}
|
|
if stream.Error() != nil {
|
|
return stream.Error()
|
|
}
|
|
if err := stream.Close(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|