AIP-203 域行为文档
| 编号 | 203 |
|---|---|
| 原文链接 | AIP-203: Field behavior documentation |
| 状态 | 批准 |
| 创建日期 | 2018-07-17 |
| 更新日期 | 2018-07-17 |
在定义protocol buffer中的域时,按惯例要向用户解释域行为的某些方面(例如域是必需的还是可选的)。此外,让其他工具理解域行为也很有用(例如优化客户端库签名)。
指南
API使用 google.api.field_behavior 注解来描述已知的域行为,例如域是必需或不可变的。
// 待识别语音数据。
RecognitionAudio audio = 2 [(google.api.field_behavior) = REQUIRED];
- API 必须 在请求使用的消息或子消息的每个域上添加
google.api.field_behavior注解。 - 注解 必须 包含准确描述域行为的所有 google.api.FieldBehavior 值。
- 不得 使用
FIELD_BEHAVIOR_UNSPECIFIED。
- 不得 使用
- API 必须 至少使用
REQUIRED、OPTIONAL或OUTPUT_ONLY之一。
警告 尽管
field_behavior不会影响协议级别的行为,但许多客户端(例如CLI和SDK)依赖它们生成代码。在添加新域时,请仔细审查并考虑哪些值是相关联的。
为了向后兼容,没有注解的域被认为是 OPTIONAL 。尽管如此, 不得 省略此注解。
注意 本文档中给出的词汇仅用于 描述 ,本身不产生任何校验。目的是为客户端统一记录域行为。
嵌套消息的域行为
嵌套消息上的 google.api.field_behavior 注解与上级消息注解无关。
例如,嵌套消息可以具有 REQUIRED 域行为,而上级域可以是 OPTIONAL :
message Title {string text = 1 [(google.api.field_behavior) = REQUIRED];
}message Slide {Title title = 1 [(google.api.field_behavior) = OPTIONAL];
}
在上述情况下,如果设定了 title ,则 text 域是必需的。
词汇表
标识符
IDENTIFIER 表示资源消息中的域用于标识资源, 必须 添加到 name 域, 不得 添加到任何其他域(参考表示资源名字的域)。
IDENTIFIER 值表示在创建方法的上下文中,域不作为输入域(即 OUTPUT_ONLY ),同时也表示在接受资源作为主要输入的修改方法(如标准更新)中,域作为 IMMUTABLE 不可变输入。
此注解 不得 用于消息对其他资源的引用。
不可变的
IMMUTABLE 表示域在资源创建后不可改变。这可以应用于输入或输出、必需或可选的域。
如果服务在更新请求(或类似请求)中收到不可变域,如果域包含在更新掩码中,并且新值与现值一致,服务 应当 忽略域值。但如果请求尝试修改值,服务 应当 返回 INVALID_ARGUMENT 错误。
不可变域的潜在用例(这不是一个详细列表)包括:
- 应用程序生命周期内,不可修改的资源属性(例如磁盘类型)。
注意 “某些条件下不可变”的域 不得 使用不可变注解。
只输入域
INPUT_ONLY 表示域只在请求中出现,不会包含在输出中。
此外, 应当 只将资源消息或其包含消息中的域注解为只输入域。请注意,请求消息(通常以 Request 结尾、仅作为远程过程调用参数)中的域 不应 注解为只输入域,它们原本就是。
只输入域的潜在用例(这不是一个详细列表)包括:
- AIP-214中描述的
ttl域。
警告 只输入域很少见,应谨慎使用。
可选域
使用 OPTIONAL 表示域不是必需的。
如果域是请求消息(作为远程过程调用参数的消息,通常以 Request 结尾)或其子消息中的域, 可以 注解为可选的。
只输出域
OUTPUT_ONLY 表示域在应答中提供,而在请求中包含域不会产生任何效果(服务器 必须 清除输入中此域的任何值,并且 不得 由于输入中存在此域的值抛出错误)。同样的,服务 必须 忽略更新域掩码中的只输出域(参考AIP-161)。
此外, 应当 只将资源消息或其树形结构更下方消息中的域注解为只输出域。请注意,应答消息中的域(通常以 Response 结尾的消息,仅作为远程过程调用的返回值) 不应 注解为只输出域,它们本来就是。
只输出域 可以 设置为空值,如果合适。
只输出域的潜在用例(这不是一个详细列表)包括:
- 创建或更新时间戳。
- 基于原始用户输入的派生或结构化信息。
- 由服务分配的无法修改的资源属性。
必需
REQUIRED 表示域 必须 存在于请求或资源之中(设置为非空值)。
域 应当 只在以下情况被注解为必需域:
- 它是用户作为输入提供的某个资源上的域。只有当“真值”被 存储 后,资源才生效。
- 在创建资源时,*必须* 在创建请求中提供域值。
- 在更新资源时,如果域不在掩码中,用户可以省略域,表示不会修改域(否则 必须 提供)。
- 它是请求消息上的域(作为远程过程调用参数的消息,通常以
Request结尾)。此时 必须 在请求中提供值,否则服务 必须 返回错误(通常是INVALID_ARGUMENT)。
我们定义上述术语“真值”如下:
- 对于原始类型,值不为
0、0.0、空字符串/字节和false。 - 对于重复域映射,至少有一个条目。
- 对于消息,至少包含一个“真值”域。
在表示下列域时,域 不应 注解为必需域:
- 始终存在于应答中的域。
- 在某些条件下必需的域。
- 从未作为用户输入的消息(包括资源消息)上的域。
注意 在大多数情况下,空值(如布尔值
false、整数0或枚举的未指定值)无法与未设定值进行区分,因此将必需域设置为空值会产生错误。由此推论,必需的布尔域必须设置为true。
无序列表
在资源的重复域上使用 UNORDERED_LIST 表示服务不保证列表中条目的顺序。
如果服务不保证列表中元素的顺序与用户发送的顺序一致,包括服务将代替用户对列表进行排序的情况,域 应当 注解为无序列表。
包含无序列表的资源 可以 按稳定顺序返回列表,也 可以 按随机的、不稳定的顺序返回列表。
向后兼容性
添加或更改 google.api.field_behavior 值可以表示API中的语义变更,现有客户端可能认为这是不兼容的。以下是 google.api.field_behavior 的不向后兼容变更的示例:
- 将
REQUIRED添加到之前被认为是OPTIONAL(隐式或其他方式)的域 - 将注解为
REQUIRED的新域添加到现有请求消息中 - 将
OUTPUT_ONLY添加到之前作为输入的域 - 将
INPUT_ONLY添加到之前作为输出的域 - 将
IMMUTABLE添加到之前被认为是可变的域 - 从之前作为输入的域中删除
OUTPUT_ONLY - 从现有域中删除
IDENTIFIER
一些更改是向后兼容的,如下所示:
- 将
OPTIONAL添加到现有域 - 将
IDENTIFIER添加到现有的name域 - 将现有域从
REQUIRED改为OPTIONAL - 将现有域从
OUTPUT_ONLY或IMMUTABLE改为IDENTIFIER - 从现有域中删除
REQUIRED - 从之前在应答中排除的域中删除
INPUT_ONLY - 从之前被认为是不可变的域中删除
IMMUTABLE
理由
标识符域行为
资源名字是每个合规资源的主要标识符,从未由用户在创建时完整构造。这些域通常被指定为 OUTPUT_ONLY 域行为。然而,在资源本身是主要请求内容的情况下,它们也经常作为主要标识符被消费。因此不能作为 OUTPUT_ONLY 。此外,在变更请求(如标准更新)中,资源名字作为主要标识符,不能就地更改。这些域通常被指定为 IMMUTABLE 域行为。这些冲突,以及上下文相关的域行为,意味着需要一个新值来单独表达资源名域的行为。
要求注解集合
请求消息中使用的域必须要么是输入要么是输出。
在输出的情况下, OUTPUT_ONLY 注解就足够了。
在输入的情况下,域要么是必需的,要么是可选的,因此应该至少具有 REQUIRED 或 OPTIONAL 注解。仅提供 INPUT_ONLY 不能表达域的必要性,因此仍然需要指定 REQUIRED 或 OPTIONAL 。
要求域行为
通过为每个域包含域行为注解,资源表现出的整体行为更清晰。清晰的域行为增强了程序化客户端和用户理解。
要求注解还迫使API生产者在最初编写API时就明确考虑其行为。
首次发布后修改域行为可能导致客户端出现不向后兼容变更。例如,将可选域改为必需域会导致远程过程调用或声明式客户端中的资源的方法签名发生不向后兼容变更。关于详细的兼容性指南,请参考向后兼容性部分。
历史
在2023年5月,field_behavior成为强制性指南。此前注解经常被省略。注解值被用于生成高质量客户端。此外,在主要版本内添加或修改某些field_behavior值可能是不向后兼容的。关于更详细的兼容性指南,请参考向后兼容性部分。
在编写API时要求field_behavior的好处超过了不这样做时,客户端和API用户的成本。
修订记录
- 2023-09-14 明确嵌套消息的行为和上级消息的行为是独立的。
- 2023-08-25 添加关于
IDENTIFIER的指南。 - 2023-07-20 在新章节中买描述兼容性指南。
- 2023-05-24 明确
IMMUTABLE并不意味着输入或必需。 - 2023-05-10 添加要求注解的指南。
- 2020-12-15 添加
UNORDERED_LIST指南。 - 2020-05-27 明确在更新中接收不可变域时的行为。
- 2019-12-05 添加关于域掩码中只输出域的指南。
- 2019-06-18 使用机器可读的注解,而非注释。
相关文章:
AIP-203 域行为文档
编号203原文链接AIP-203: Field behavior documentation状态批准创建日期2018-07-17更新日期2018-07-17 在定义protocol buffer中的域时,按惯例要向用户解释域行为的某些方面(例如域是必需的还是可选的)。此外,让其他工具理解域行…...
在 Cloud Run 上使用 Gemini API 构建聊天应用
李升伟 编译 (🎨 封面由 Gemini 中的 Imagen 3 生成!) 欢迎来到我的谷歌AI工具构建系列博客!本文将带您创建一个由Gemini驱动并托管在Cloud Run上的简易聊天应用。如果您正在探索大语言模型或希望将AI集成到网页应用中,那么您来…...
周总结aa
上周学习了Java中有关字符串的内容,与其有关的类和方法 学习了static表示静态的相关方法和类的使用。 学习了继承(extends) 多态(有继承关系,有父类引用指向子类对象) 有关包的知识,final关键字的使用,及有…...
31天Python入门——第17天:初识面向对象
你好,我是安然无虞。 文章目录 面向对象编程1. 什么是面向对象2. 类(class)3. 类的实例关于self 4. 对象的初始化5. __str__6. 类之间的关系继承关系组合关系 7. 补充练习 面向对象编程 1. 什么是面向对象 面向对象编程是一种编程思想,它将现实世界的概念和关系映…...
计算机视觉准备八股中
一边记录一边看,这段实习跑路之前运行完3DGAN,弄完润了,现在开始记忆八股 1.CLIP模型的主要创新点: 图像和文本两种不同模态数据之间的深度融合、对比学习、自监督学习 2.等效步长是每一步操作步长的乘积 3.卷积层计算输入输出…...
【C语言】文件操作(2)
一、文件的随机读写 在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢&a…...
CCCC天梯赛L1-094 剪切粘贴
题目链接: 字符串函数: 1、截取字符串: //起始位置为3,结束位置为5string s "aabcdefg";//下标从0开始 [从开始位置,结束位置]string sub s.substr(3,3);//输出cde, 有返回值string//并且原字符串不改变, s"aab…...
C语言:多线程
多线程概述 定义 多线程是指在一个程序中可以同时运行多个不同的执行路径(线程),这些线程可以并发或并行执行。并发是指多个线程在宏观上同时执行,但在微观上可能是交替执行的;并行则是指多个线程真正地同时执行&…...
livekit ICE连接失败的一些总结
在使用livekit做的项目过程中碰到了一些ICE连接失败的问题, 一个时在同网段的局域网下 ,livekti服务和客户端不能联通,后来发现是服务端是多网卡,通过网络抓包才知道服务端在stun binding的时候使用了错误的网卡,在co…...
Python神经网络1000个案例算法汇总
【2025最新版】Python神经网络优化1000个案例算法汇总(长期更新版) 本文聚焦神经网络、优化算法,神经网络改进,优化算法改进,优化算法优化神经网络权重、超参数等,现在只需订阅即可拥有,简直是人工智能初学者的天堂。…...
某地81栋危房自动化监测试点项目
1. 项目简介 房屋进入老龄化阶段后,结构安全风险越来越大。近10年来,每年都会产生房屋倒塌人员伤亡的重大安全事故。调研分析显示,老旧房屋结构安全风险管理的有效路径为,通过“人防技防”的组合模式,对房屋安全风险进…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
python文件的基本操作和文件读写
目录 文件的基本操作 文件读写 文件的基本操作 Python 中对文件的基本操作主要包括打开文件、读取文件、写入文件和关闭文件等操作。下面是一个简单的示例: 打开文件: file open(example.txt, r) # 使用 open() 函数打开一个名为 example.txt 的文…...
山东大学软件学院项目创新实训开发日志(4)之中医知识问答数据存储、功能结构、用户界面初步设计
目录 数据库设计: 功能设计: 用户界面: 数据库设计: --对话表 (1个对话包含多条消息) CREATE TABLE conversations ( conv_id VARCHAR(36) PRIMARY KEY, -- 对话ID user_id VARCHAR(36) NOT NULL, -- 所属用户 title VARCHAR(100), -- 对话…...
20.思科交换机二层链路聚合的详细配置命令解析
思科交换机二层链路聚合的详细配置命令解析 一、PAgP协议的配置SW1的配置SW2的配置二、LACP标准协议三、配置聚合组的带宽和速率四、确保所有接口的双工模式和速率一致五、故障排除和监控在Cisco设备上配置链路聚合(也称为端口通道或EtherChannel)可以增强网络连接的带宽和可…...
【FreeRtos】随手记录想法和DeepSeek的交流
纯记录个人RTOS学习过程和DeepSeek的交流,或记录一些学习过程中奇怪的想法(也会喂给deepseek哈哈) 2025/3/31 1. prvCreateTask在干啥? Question prvTaskCreate这个函数做了什么:分配内存,首先会判断栈…...
【多线程】单例模式和阻塞队列
目录 一.单例模式 1. 饿汉模式 2. 懒汉模式 二.阻塞队列 1. 阻塞队列的概念 2. BlockingQueue接口 3.生产者-消费者模型 4.模拟生产者-消费者模型 一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心思想是确保…...
Qt5.14.2+Cmake使用mingw64位编译opencv4.5成功图文教程
一、下载安装相关编译环境软件 1.1 Python3.8:安装路径:C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32 安装包:python3.8.exe 1.2 QT5.14.2:安装路径:C:\Qt\Qt5.14.2 1.3 opencv4.5:解压路径D:\o…...
Transformer习题
(1) 自注意力机制的特点: 并行计算:可同时处理序列中所有位置的关联,避免RNN的时序依赖问题。长距离依赖建模:直接捕捉序列中任意两个元素的关系,不受距离限制。动态权重分配:通过查询(Query&a…...
Mamba4D阅读
CVPR 2025 创新 基于transformer的4D主干由于其二次复杂度而通常存在较大的计算成本,特别是对于长视频序列。 开发了帧内空间Mamba模块,建立时空相关性。 GPU占用和速度很有优势。 代码还没发。 Pipeline 输入点云序列,根据超参数构建点管…...
uWebSockets开发入门
一、常用C++ WebSocket开源库 一些常用的 C++ WebSocket 开源库,它们支持 WebSocket 协议的实现,适用于客户端或服务器端开发。 1. Boost.Beast (推荐) 特点:基于 Boost.Asio 的高性能库,支持 HTTP/WebSocket,属于 Boost 官方库的一部分,稳定且跨平台。 适用场景:需要高…...
x265不同preset级别控制的编码参数与编码性能影响
目录 x265中preset 实验preset效果 写在最后 x265中preset 定义:preset是x265中用于平衡编码速度与压缩效率的核心参数。通过预定义的多组编码参数组合,用户无需手动调整复杂选项即可快速选择合适的编码模式。preset控制的参数(具体参数含义解析可参考专栏中相关博客)pr…...
Qt图形化界面为何总被“冷落“?
在Qt开发者的IDE中,Qt Designer总像一个被遗忘的角落——即便它有着直观的拖拽式界面设计功能。通过分析GitHub上超过5000个Qt项目发现,仅有17%的项目使用.ui文件构建界面。这个数据背后,隐藏着开发者群体对GUI构建方式的集体选择。我们不禁要…...
手工排查后门木马的常用姿势
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 1. 检查异常文件 (1)查找最近修改的文件 # 查…...
算法导论(动态规划)——简单多状态
算法思路(17.16) 状态表示: 在处理线性动态规划问题时,我们可以通过“经验 题目要求”来定义状态表示。通常有两种选择: 以某个位置为结尾的情况;以某个位置为起点的情况。 本题中,我们选择更常…...
Linux 部署 rocketmq centos7
mq部署方案 1、rocketmq 顺序消费记录 一个master ,一个 brocker ,多个group ,多个topic,采用集群消费模式。 注意 一个group 对应一个 topic。 生产者 和 消费者 可以有多个,但是 主题和分组 都是一对一的。这样保证…...
LeetCode 438. 找到字符串中所有字母的异位词
438. 找到字符串中所有字母的异位词 题目描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 输入输出示例及数据范围 思路 这道题的思路其实很简单,就是一个滑动窗口的裸题&a…...
C++STL---<functional>
C标准库中的 <functional> 库是一个强大的工具集,它提供了用于处理函数对象、函数绑定、函数包装等功能的设施,极大地增强了代码的灵活性和可复用性。 1. 函数对象(Functors) 函数对象,也被称作仿函数…...
java详细笔记总结持续完善
一.Java开发环境的搭建 1. 单位换算 1TB 1024GB 1GB 1024MB 1MB 1024KB 1KB 1024Byte (字节) 1Byte 8 bit(位) 注意:一个字节占8位 2. DOS命令 DOS : Disk Operation System 磁盘操作系统 即用于操作本地磁盘的系统 命令操作符号盘符切换命令盘符名:查看当前文…...
图解AUTOSAR_SWS_CANInterface
AUTOSAR CAN接口详解文档 基于AUTOSAR标准的CAN通信接口模块架构与工作原理 目录 1. AUTOSAR CAN接口概述2. CAN接口架构 2.1 模块定位与组成2.2 内部组件结构2.3 接口关系3. CAN消息传输流程 3.1 消息发送流程3.2 消息接收流程4. CAN控制器模式管理 4.1 状态定义4.2 状态转换4…...
