如何使 Protobuf 3 字段成为必填字段?

2023-12-26

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

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 如果c or b被省略。我怎样才能做到这一点?在 Protobufs 3 中,他们摆脱了required关键词。那么我如何检查是否传入了非字符串参数并做出相应的反应?


必填字段已被删除proto3. 这是github问题 https://github.com/protocolbuffers/protobuf/issues/2497您可以在其中阅读详细解释为什么这样做。以下是摘录:

我们在 proto3 中删除了必填字段,因为必填字段通常被认为是有害的并且违反了 protobuf 的兼容性语义。使用 protobuf 的整个想法是,它允许您从协议定义中添加/删除字段,同时仍然与较新/较旧的二进制文件完全向前/向后兼容。不过,必填字段打破了这一点。您永远无法安全地将必填字段添加到 .proto 定义中,也无法安全地删除现有的必填字段,因为这两种操作都会破坏线路兼容性

在我看来,这是一个值得怀疑的决定,显然我并不孤单,谁这么想。最终决定应该留给开发商。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Protobuf 3 字段成为必填字段? 的相关文章

  • Ajax 将文件上传到内容类型为 Multipart 的 GoLang 服务器

    我正在尝试使用多部分表单将音频文件上传到 Golang 服务器 然而 Go 返回错误 multipart NextPart bufio buffer full 我相信这表明我的 Javascript 请求中存在不属于多部分格式的内容 这是我
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • Google Cloud Kubernetes 上任务队列的替代方案

    我发现任务队列主要用于App Engine标准环境 我正在将现有服务从 App Engine 迁移到 Kubernetes 任务队列的一个好的替代方案是什么 推送队列是当前正在使用的队列 我在线阅读文档并浏览了此链接 何时使用 PubSub
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 展平嵌套结构会导致切片的切片

    所以我有一个像这样的结构 type Bus struct Number string Name string DirectStations Station Station is another struct ReverseStations
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 鸭子在 Go 中打字

    我想写一个Join函数接受任意对象String 方法 package main import fmt strings type myint int func i myint String string return fmt Sprintf
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • 如何在Android中使用SharedPreference保存在线数据

    我想展示3fragments in my Activity并从中加载数据json in any fragments 我需要将网站数据显示到Recyclerview with OkHTTP v3图书馆 我想离线显示此数据 我的意思是 如果用户
  • 使用自签名证书的 Spray https 服务器的配置问题?

    我在 Mac 10 9 4 上使用 Spray 1 3 Akka 2 3 和 Scala 2 11 来设置 HTTP 服务器 我正在关注 Ch Manning 的 Akka in Action 中的 2 个示例 此处提供示例代码 https
  • 使用 AVX 指令禁用 exp() 优化?

    我正在使用 AVX 内在函数在 VC 中编写前馈网络 我通过 C 中的 PInvoke 调用此代码 当调用计算大循环 包括函数 exp 的函数时 对于 160M 的循环大小 我的性能约为 1000 毫秒 我一打电话any使用 AVX 内在函
  • 省略指向结构的指针的前向声明是否有效? [复制]

    这个问题在这里已经有答案了 我最近遇到这条评论 https stackoverflow com questions 62837798 two structs that refer to each other 62838943 comment
  • 使用 docker 提供多个张量流模型

    看过了this https github com tensorflow serving issues 1077github问题和this https stackoverflow com questions 45749024 how can
  • 解释 ExtJS 4 事件处理

    我最近开始学习 ExtJS 并且很难理解如何处理事件 我没有任何以前版本的 ExtJS 的经验 通过阅读各种手册 指南和文档页面 我已经弄清楚了如何使用它 但我不清楚它是如何工作的 我找到了几个针对旧版本 ExtJS 的教程 但我不确定它们
  • Pygame 快速像素读取

    好吧 希望有人能帮助我 因为我在这里不知所措 我正在用 python 开发一款游戏 它使用相机作为主控制器 要玩游戏 您只需移动一个简单的灯光即可控制游戏 到目前为止 我已经成功地将相机图像获取到表面 并将其显示在屏幕上 但当涉及到寻找光时
  • 如何知道文本文件中流读取器的位置(行号)?

    一个例子 这可能不是现实生活 但为了阐明我的观点 public void StreamInfo StreamReader p string info string Format The supplied streamreaer read 0
  • 如何根据 WPF DataGrid 中的更改更新 ObservableCollection 项的属性?

    我有一个 WPF DataGrid 其数据源是 ObservableCollection 它的松散设置如下 public class ItemDataCollection ObservableCollection
  • 无法创建调试桥:无法启动adb服务器:无法检测adb版本

    我目前在打开项目时遇到这个问题 事件日志中显示的错误 无法检测 adb 版本 退出值 0xc0000409 adb 输出 adb exe F 11 11 09 55 06 17768 944 fdevent poll cpp 64 无法创建
  • 在 Ubuntu 上启动 Apache2 失败

    我使用 Ubuntu 和 MYSQL 安装指南进行 OSQA 遵循起来非常简单 直到我到达最后一步 即启动 Apache2 服务器 我仔细检查了一下是否错过了前面的任何步骤 而我确实错过了一个 这是 sudo ln s etc apache
  • 构成最大总和的数字

    我刚刚编写了我的程序 它从数组中找到最大和 但我陷入困境 有什么方法可以找到哪些数字对最大总和做出了贡献 给出最大总和规则 相邻元素不应贡献 合计 我对数组中最大总和的解决方案 public class MaximumELementInAR
  • Java - 设置类路径

    我的示例应用程序告诉我 No qtjambi deployment xml found in classpath loading libraries via java library path 我希望我的应用程序使用qtjambi depl
  • 从 PowerShell 运行 cmd /c,文件路径中包含空格

    我正在尝试在 PowerShell 中运行以下命令 PS C Users Administrator gt cmd c C Program Files x86 Microsoft Visual Studio 2017 BuildTools
  • 为什么我会看到“Nodetool 状态连接被拒绝”?

    我已经通过运行 Ubuntu 16 的 EC2 实例上的服务安装了 Cassandra 但我一生都无法理解为什么我无法使 nodetool 状态正常工作 我听说我应该更改 cassanda env sh 以包含主机名 我已经在这里完成了 a
  • 在 MATLAB 中使用 Levenberg-Marquardt (lsqcurvefit) 获取协方差矩阵

    我正在使用 Matlab 中的 lsqcurvefit 函数对一些实验数据进行建模 数据采用特定的形状 因此算法只是调整该形状的系数来改变其幅度等 该模型运行良好并且拟合良好 我已经计算了卡方 Levenberg Marquardt 算法的
  • 为什么要使用开始活动?

    我一直在浏览 API 文档 并注意到从 API 级别 16 开始Context http developer android com reference android content Context html类包含以下方法 public
  • 使用房间时“无法合并 dex”

    我正在尝试向我的项目添加一个 房间 当我尝试构建项目时 出现错误 错误 任务 app transformDexArchiveWithExternalLibsDexMergerForDebug 执行失败 java lang RuntimeEx
  • 将 IDataErrorInfo 与嵌套对象结合使用

    我正在使用 MVVM 我想使用 IDataErrorInfo 来验证我的视图 我当前的实现包括嵌套对象和不同的 ViewModel 例如业务实体 客户 包含业务实体 地址 我在我的视图中直接访问地址 例如 Customer Address
  • 如何使 Protobuf 3 字段成为必填字段?

    我正在使用 GRPC proto buffers 在 GoLang 中编写我的第一个 API 端点 我对 Go 还很陌生 以下是我为测试用例编写的文件 package my package import context testing gi