gpt4 book ai didi

go - 如何强制 Protobuf 3 字段?

转载 作者:行者123 更新时间:2023-12-03 14:49:56 27 4
gpt4 key购买 nike

我正在使用 GRPC/proto-buffers 在 GoLang 中编写我的第一个 API 端点。我对 GoLang 比较陌生。
以下是我为测试用例编写的文件

package my_package

import (
"context"
"testing"

"github.com/stretchr/testify/require"

"google.golang.org/protobuf/types/known/structpb"
"github.com/MyTeam/myproject/cmd/eventstream/setup"
v1handler "github.com/MyTeam/myproject/internal/handlers/myproject/v1"
v1interface "github.com/MyTeam/myproject/proto/.gen/go/myteam/myproject/v1"
)

func TestEndpoint(t *testing.T) {
conf := &setup.Config{}

// Initialize our API handlers
myhandler := v1handler.New(&v1handler.Config{})

t.Run("Success", func(t *testing.T) {
res, err := myhandler.Endpoint(context.Background(), &v1interface.EndpointRequest{
A: "S",
B: &structpb.Struct{
Fields: map[string]*structpb.Value{
"T": &structpb.Value{
Kind: &structpb.Value_StringValue{
StringValue: "U",
},
},
"V": &structpb.Value{
Kind: &structpb.Value_StringValue{
StringValue: "W",
},
},
},
},
C: &timestamppb.Timestamp{Seconds: 1590179525, Nanos: 0},
})
require.Nil(t, err)

// Assert we got what we want.
require.Equal(t, "Ok", res.Text)
})


}

这就是 EndpointRequest对象在 v1.go 中定义上面包含的文件:
// An v1 interface Endpoint Request object.
message EndpointRequest {

// a is something.
string a = 1 [(validate.rules).string.min_len = 1];

// b can be a complex object.
google.protobuf.Struct b = 2;

// c is a timestamp.
google.protobuf.Timestamp c = 3;

}

上面的测试用例似乎工作正常。

我设置了有效地提出论点的验证规则 a强制,因为它要求 a是至少一个的字符串。所以如果你省略 a ,端点返回 400。

但现在我想确保端点返回 400 if cb被省略。我怎样才能做到这一点?在 Protobufs 3 中,他们摆脱了 required关键词。那么如何检查是否传入了非字符串参数并做出相应的 react 呢?

最佳答案

简短的版本:你不能。
required被删除主要是因为它使更改向后不兼容。尝试使用验证选项重新实现它并不是那么激烈(更改更容易),但会遇到一些缺点,如您所见。

相反,将验证排除在原型(prototype)定义之外,并将其移至应用程序本身。任何时候你收到一条消息,你都应该检查它的内容(当 required 是一个东西时也是如此)。选项或 required 提供的简单验证很少见。足够了。

关于go - 如何强制 Protobuf 3 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com