【问题标题】:Go - How can I make sure there aren't empty fields being sent in this code via gRPC?Go - 我如何确保没有通过 gRPC 在此代码中发送的空字段?
【发布时间】:2021-05-06 15:12:22
【问题描述】:

我正在编写一些代码来使用 gRPC 将日志发送到服务器。我遇到的问题是日志是不同的,并不是所有的都有每个字段,但是 .我想知道如何只设置它们在 logpb.Log 中的字段,而不是在 proto 文件中创建几种不同类型的日志? 这都是一种方法,但 StackOverflow 上的格式不包含它。 代码:

func (*Client) SendWithgRPC(entry *log.Entry) error {

conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
    log.Fatalf("Could not connect: %v", err)
}

defer conn.Close()

c := logpb.NewLogServiceClient(conn)

stream, err := c.SendLogs(context.Background())
if err != nil {
    log.Fatalf("Error while calling SendLogs: %v", err)
}

logFields := entry.Data

category := ""
debug_id := ""
request_id := ""
tipi := ""
uri := ""
var user_id int32 = 0
ip := ""

if logFields["category"] != nil {
    category = logFields["category"].(string)
}

if logFields["debug_id"] != nil {
    debug_id = logFields["debug_id"].(string)
}

if logFields["request_id"] != nil {
    request_id = logFields["request_id"].(string)
}

if logFields["type"] != nil {
    tipi = logFields["type"].(string)
}

if logFields["uri"] != nil {
    uri = logFields["uri"].(string)
}

if logFields["user_id"] != nil {
    user_id = int32(logFields["user_id"].(int))
}

if logFields["ip"] != nil {
    ip = logFields["ip"].(string)
}

logEntry := &logpb.Log{
    Time:      entry.Time.String(),
    Level:     entry.Level.String(),
    Msg:       entry.Message,
    Category:  category,
    DebugId:   debug_id,
    Ip:        ip,
    RequestId: request_id,
    Type:      tipi,
    Uri:       uri,
    Id:        user_id,
}

logs := []*logpb.Log{logEntry}
logarray := []*logpb.SendLogsRequest{
    &logpb.SendLogsRequest{
        Logs: logs,
    },
}

fmt.Print(logarray)

for _, req := range logarray {
    stream.Send(req)
}

_, err = stream.CloseAndRecv()
if err != nil {
    fmt.Printf("Error with response: %v", err)
}
return nil
}

【问题讨论】:

    标签: go filtering grpc


    【解决方案1】:

    你可以使用类似https://github.com/go-playground/validator
    它使用标签提供验证。除了基本验证之外,这个库还有很多其他内容。请检查一下。
    示例示例https://github.com/go-playground/validator/blob/master/_examples/simple/main.go

    尽可能简单:

    package main
    
    import (
        "fmt"
        "github.com/go-playground/validator/v10"
    )
    
    type Name struct {
        First string `validate:"required"`
        Last  string
    }
    
    func main() {
        validName := Name{First: "John"} // Last name is empty and is not required
        invalidName := Name{Last: "Doe"} // first name is empty but is required
    
        validate := validator.New()
    
        err := validate.Struct(invalidName)
        if err != nil {
            fmt.Println("invalid name struct caused error")
        }
    
        err = validate.Struct(validName)
        if err != nil {
            fmt.Println("valid name struct caused error")
        }
    
        fmt.Println("GoodBye")
    }
    

    上面的输出:

    invalid name struct caused error
    GoodBye
    

    go-playground 上的工作代码:https://play.golang.org/p/S4Yj1yr16t2

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2014-04-23
      • 1970-01-01
      • 2021-10-06
      • 2011-06-13
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多