mirror of
https://github.com/iLoveElysia/openbilibili.git
synced 2026-06-08 05:58:29 -05:00
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"flag"
|
|||
|
|
"fmt"
|
|||
|
|
"io/ioutil"
|
|||
|
|
"os"
|
|||
|
|
|
|||
|
|
"github.com/gogo/protobuf/jsonpb"
|
|||
|
|
"google.golang.org/grpc"
|
|||
|
|
"google.golang.org/grpc/credentials"
|
|||
|
|
"google.golang.org/grpc/encoding"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// Reply for test
|
|||
|
|
type Reply struct {
|
|||
|
|
res []byte
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var data string
|
|||
|
|
var file string
|
|||
|
|
var method string
|
|||
|
|
var addr string
|
|||
|
|
var tlsCert string
|
|||
|
|
var tlsServerName string
|
|||
|
|
|
|||
|
|
//Reference https://jbrandhorst.com/post/grpc-json/
|
|||
|
|
func init() {
|
|||
|
|
encoding.RegisterCodec(JSON{
|
|||
|
|
Marshaler: jsonpb.Marshaler{
|
|||
|
|
EmitDefaults: true,
|
|||
|
|
OrigName: true,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
flag.StringVar(&data, "data", `{"name":"longxia","age":19}`, `{"name":"longxia","age":19}`)
|
|||
|
|
flag.StringVar(&file, "file", ``, `./data.json`)
|
|||
|
|
flag.StringVar(&method, "method", "/testproto.Greeter/SayHello", `/testproto.Greeter/SayHello`)
|
|||
|
|
flag.StringVar(&addr, "addr", "127.0.0.1:8080", `127.0.0.1:8080`)
|
|||
|
|
flag.StringVar(&tlsCert, "cert", "", `./cert.pem`)
|
|||
|
|
flag.StringVar(&tlsServerName, "server_name", "", `hello_server`)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 该example因为使用的是json传输格式所以只能用于调试或测试,用于线上会导致性能下降
|
|||
|
|
// 使用方法:
|
|||
|
|
// ./grpcDebug -data='{"name":"xia","age":19}' -addr=127.0.0.1:8080 -method=/testproto.Greeter/SayHello
|
|||
|
|
// ./grpcDebug -file=data.json -addr=127.0.0.1:8080 -method=/testproto.Greeter/SayHello
|
|||
|
|
func main() {
|
|||
|
|
flag.Parse()
|
|||
|
|
opts := []grpc.DialOption{
|
|||
|
|
grpc.WithInsecure(),
|
|||
|
|
grpc.WithDefaultCallOptions(grpc.CallContentSubtype(JSON{}.Name())),
|
|||
|
|
}
|
|||
|
|
if tlsCert != "" {
|
|||
|
|
creds, err := credentials.NewClientTLSFromFile(tlsCert, tlsServerName)
|
|||
|
|
if err != nil {
|
|||
|
|
panic(err)
|
|||
|
|
}
|
|||
|
|
opts = append(opts, grpc.WithTransportCredentials(creds))
|
|||
|
|
}
|
|||
|
|
if file != "" {
|
|||
|
|
content, err := ioutil.ReadFile(file)
|
|||
|
|
if err != nil {
|
|||
|
|
fmt.Println("ioutil.ReadFile %s failed!err:=%v", file, err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
if len(content) > 0 {
|
|||
|
|
data = string(content)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
conn, err := grpc.Dial(addr, opts...)
|
|||
|
|
if err != nil {
|
|||
|
|
panic(err)
|
|||
|
|
}
|
|||
|
|
var reply Reply
|
|||
|
|
err = grpc.Invoke(context.Background(), method, []byte(data), &reply, conn)
|
|||
|
|
if err != nil {
|
|||
|
|
panic(err)
|
|||
|
|
}
|
|||
|
|
fmt.Println(string(reply.res))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// JSON is impl of encoding.Codec
|
|||
|
|
type JSON struct {
|
|||
|
|
jsonpb.Marshaler
|
|||
|
|
jsonpb.Unmarshaler
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Name is name of JSON
|
|||
|
|
func (j JSON) Name() string {
|
|||
|
|
return "json"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Marshal is json marshal
|
|||
|
|
func (j JSON) Marshal(v interface{}) (out []byte, err error) {
|
|||
|
|
return v.([]byte), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Unmarshal is json unmarshal
|
|||
|
|
func (j JSON) Unmarshal(data []byte, v interface{}) (err error) {
|
|||
|
|
v.(*Reply).res = data
|
|||
|
|
return nil
|
|||
|
|
}
|