Protocol Buffers 众所周知的类型
索引
Any
(消息)Api
(消息)BoolValue
(消息)BytesValue
(消息)DoubleValue
(消息)Duration
(消息)Empty
(消息)Enum
(消息)EnumValue
(消息)Field
(消息)Field.Cardinality
(枚举)Field.Kind
(枚举)FieldMask
(消息)FloatValue
(消息)Int32Value
(消息)Int64Value
(消息)ListValue
(消息)Method
(消息)Mixin
(消息)NullValue
(枚举)Option
(消息)SourceContext
(消息)StringValue
(消息)Struct
(消息)Syntax
(枚举)Timestamp
(消息)Type
(消息)UInt32Value
(消息)UInt64Value
(消息)Value
(消息)
Any
Any
包含一个任意序列化的消息以及一个描述序列化的消息类型的 URL。
JSON
Any
值的 JSON 表示使用反序列化的嵌入式消息的常规表示,并带有包含类型 URL 的附加字段 @type
。示例
package google.profile;
message Person {
string first_name = 1;
string last_name = 2;
}
{
"@type": "type.googleapis.com/google.profile.Person",
"firstName": <string>,
"lastName": <string>
}
如果嵌入式消息类型是众所周知的并且具有自定义 JSON 表示,则该表示将被嵌入,除了 @type
字段之外,还添加一个保存自定义 JSON 的字段 value
。示例(对于消息 google.protobuf.Duration
)
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
字段名称 | Type | 说明 |
---|---|---|
type_url | string | 一个 URL/资源名称,其内容描述序列化的消息的类型。 对于使用架构
|
值 | 字节 | 必须是上述指定类型的有效序列化数据。 |
Api
Api 是协议缓冲区服务的轻量级描述符。
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 此 api 的完全限定名称,包括包名称,后跟 api 的简单名称。 |
方法 | Method | 此 api 的方法,顺序不指定。 |
选项 | Option | 附加到 API 的任何元数据。 |
版本 | string | 此 api 的版本字符串。如果指定,则必须采用 版本控制架构使用 语义版本控制,其中主版本号表示重大更改,而次要版本表示累加的非重大更改。两个版本号都向用户发出信号,说明他们对不同版本的期望,并且应根据产品计划仔细选择。 主版本也反映在 API 的包名称中,该名称必须以 |
source_context |
| 此消息表示的协议缓冲区服务的源上下文。 |
混合 |
| 包含的 API。请参阅 Mixin 。 |
语法 | 语法 | 服务的源语法。 |
BoolValue
bool
的包装消息。
BoolValue
的 JSON 表示形式是 JSON true
和 false
。
字段名称 | Type | 说明 |
---|---|---|
值 | 布尔值 | 布尔值。 |
BytesValue
bytes
的包装消息。
BytesValue
的 JSON 表示形式是 JSON 字符串。
字段名称 | Type | 说明 |
---|---|---|
值 | 字节 | 字节值。 |
DoubleValue
double
的包装消息。
DoubleValue
的 JSON 表示形式为 JSON 数字。
字段名称 | Type | 说明 |
---|---|---|
值 | double | double 值。 |
Duration
Duration 表示一个有符号、固定长度的时间跨度,表示为秒数和纳秒分辨率的秒分数。它独立于任何日历和“天”或“月”等概念。它与 Timestamp 相关,因为两个 Timestamp 值之间的差值是一个 Duration,并且可以将其添加到 Timestamp 中或从 Timestamp 中减去。范围大约为 +-10,000 年。
示例 1:使用伪代码从两个 Timestamp 计算 Duration。
Timestamp start = ...;
Timestamp end = ...;
Duration duration = ...;
duration.seconds = end.seconds - start.seconds;
duration.nanos = end.nanos - start.nanos;
if (duration.seconds < 0 && duration.nanos > 0) {
duration.seconds += 1;
duration.nanos -= 1000000000;
} else if (duration.seconds > 0 && duration.nanos < 0) {
duration.seconds -= 1;
duration.nanos += 1000000000;
}
示例 2:使用伪代码从 Timestamp + Duration 计算 Timestamp。
Timestamp start = ...;
Duration duration = ...;
Timestamp end = ...;
end.seconds = start.seconds + duration.seconds;
end.nanos = start.nanos + duration.nanos;
if (end.nanos < 0) {
end.seconds -= 1;
end.nanos += 1000000000;
} else if (end.nanos >= 1000000000) {
end.seconds += 1;
end.nanos -= 1000000000;
}
Duration
的 JSON 表示形式是一个以 s
结尾的 String
,表示秒,并以秒数为前缀,纳秒表示为小数秒。
字段名称 | Type | 说明 |
---|---|---|
seconds | int64 | 时间跨度的有符号秒。必须介于 -315,576,000,000 到 +315,576,000,000(含)之间。 |
nanos | int32 | 时间跨度的纳秒分辨率的有符号秒分数。小于一秒的持续时间用 0 seconds 字段和正或负 nanos 字段表示。对于持续时间为一秒或更长时间,nanos 字段的非零值必须与 seconds 字段同号。必须介于 -999,999,999 到 +999,999,999(含)之间。 |
Empty
一个通用的空消息,您可以重复使用它来避免在 API 中定义重复的空消息。一个典型的示例是将其用作 API 方法的请求或响应类型。例如
service Foo {
rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
}
Empty
的 JSON 表示形式为空 JSON 对象 {}
。
Enum
枚举类型定义
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 枚举类型名称。 |
enumvalue | EnumValue | 枚举值定义。 |
选项 | Option | 协议缓冲区选项。 |
source_context | SourceContext | 源上下文。 |
语法 | 语法 | 源语法。 |
EnumValue
枚举值定义。
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 枚举值名称。 |
number | int32 | 枚举值编号。 |
选项 | Option | 协议缓冲区选项。 |
Field
消息类型的单个字段。
字段名称 | Type | 说明 |
---|---|---|
kind | 类型 | 字段类型。 |
cardinality | 基数 | 字段基数。 |
number | int32 | 字段编号。 |
名称 | string | 字段名称。 |
type_url | string | 消息或枚举类型的字段类型 URL,不带方案。示例:"type.googleapis.com/google.protobuf.Timestamp" 。 |
oneof_index | int32 | 消息或枚举类型的 Type.oneofs 中字段类型的索引。第一个类型的索引为 1;零表示该类型不在列表中。 |
packed | 布尔值 | 是否使用备用打包线表示形式。 |
选项 | Option | 协议缓冲区选项。 |
json_name | string | 字段 JSON 名称。 |
default_value | string | 此字段的默认值的字符串值。仅限 Proto2 语法。 |
基数
字段是可选的、必需的还是重复的。
枚举值 | 说明 |
---|---|
CARDINALITY_UNKNOWN | 对于基数未知的字段。 |
CARDINALITY_OPTIONAL | 对于可选字段。 |
CARDINALITY_REQUIRED | 对于必需字段。仅限 Proto2 语法。 |
CARDINALITY_REPEATED | 对于重复字段。 |
类型
基本字段类型。
枚举值 | 说明 |
---|---|
TYPE_UNKNOWN | 字段类型未知。 |
TYPE_DOUBLE | 字段类型为双精度浮点数。 |
TYPE_FLOAT | 字段类型为单精度浮点数。 |
TYPE_INT64 | 字段类型为 int64。 |
TYPE_UINT64 | 字段类型为 uint64。 |
TYPE_INT32 | 字段类型为 int32。 |
TYPE_FIXED64 | 字段类型为 fixed64。 |
TYPE_FIXED32 | 字段类型为 fixed32。 |
TYPE_BOOL | 字段类型为布尔值。 |
TYPE_STRING | 字段类型为字符串。 |
TYPE_GROUP | 字段类型为组。仅限 Proto2 语法,且已弃用。 |
TYPE_MESSAGE | 字段类型为消息。 |
TYPE_BYTES | 字段类型为字节。 |
TYPE_UINT32 | 字段类型为 uint32。 |
TYPE_ENUM | 字段类型为枚举。 |
TYPE_SFIXED32 | 字段类型为 sfixed32。 |
TYPE_SFIXED64 | 字段类型为 sfixed64。 |
TYPE_SINT32 | 字段类型为 sint32。 |
TYPE_SINT64 | 字段类型为 sint64。 |
FieldMask
FieldMask
表示一组符号字段路径,例如
paths: "f.a"
paths: "f.b.d"
此处 f
表示某个根消息中的字段,a
和 b
表示 f
中找到的消息中的字段,d
表示 f.b
中找到的消息中的字段。
字段掩码用于指定应由获取操作(投影)返回或由更新操作修改的字段子集。字段掩码还具有自定义 JSON 编码(请参见下文)。
投影中的字段掩码
当 FieldMask
指定投影时,API 将过滤响应消息(或子消息)以仅包含掩码中指定的那些字段。例如,考虑此“预掩码”响应消息
f {
a : 22
b {
d : 1
x : 2
}
y : 13
}
z: 8
应用前一个示例中的掩码后,API 响应将不包含字段 x、y 或 z 的特定值(它们的值将设置为默认值,并在 proto 文本输出中省略)
f {
a : 22
b {
d : 1
}
}
仅允许在字段掩码的最后位置使用重复字段。
如果获取操作中不存在 FieldMask
对象,则该操作将应用于所有字段(就像已指定所有字段的 FieldMask 一样)。
请注意,字段掩码不一定适用于顶级响应消息。对于 REST 获取操作,字段掩码直接应用于响应,但对于 REST 列表操作,掩码改为应用于返回的资源列表中的每个单独消息。对于 REST 自定义方法,可以使用其他定义。掩码的应用位置将与 API 中的声明一起明确记录。在任何情况下,对返回的资源/资源的影响都是 API 的必需行为。
更新操作中的字段掩码
更新操作中的字段掩码指定目标资源的哪些字段将被更新。API 仅需要更改掩码中指定字段的值,而不对其他字段进行更改。如果传入资源来描述更新后的值,API 将忽略掩码未涵盖的所有字段的值。
为了将字段的值重置为默认值,该字段必须在掩码中,并设置为提供的资源中的默认值。因此,为了重置资源的所有字段,提供资源的默认实例并在掩码中设置所有字段,或者如下所述不提供掩码。
如果在更新时不存在字段掩码,则该操作将应用于所有字段(就像指定了所有字段的字段掩码一样)。请注意,在架构演进的情况下,这可能意味着客户端不知道且因此未填入请求中的字段将重置为其默认值。如果这是不需要的行为,则特定服务可能要求客户端始终指定字段掩码,如果没有指定则会产生错误。
与获取操作一样,请求消息中描述更新后值的资源的位置取决于操作类型。在任何情况下,API 都需要遵守字段掩码的效果。
HTTP REST 的注意事项
使用字段掩码的更新操作的 HTTP 类型必须设置为 PATCH 而不是 PUT,以满足 HTTP 语义(PUT 只能用于完全更新)。
字段掩码的 JSON 编码
在 JSON 中,字段掩码被编码为一个字符串,其中路径用逗号分隔。每个路径中的字段名称都转换为/从小驼峰命名约定。
例如,考虑以下消息声明
message Profile {
User user = 1;
Photo photo = 2;
}
message User {
string display_name = 1;
string address = 2;
}
在 proto 中,Profile
的字段掩码可能如下所示
mask {
paths: "user.display_name"
paths: "photo"
}
在 JSON 中,相同的掩码表示如下
{
mask: "user.displayName,photo"
}
字段名称 | Type | 说明 |
---|---|---|
paths | string | 字段掩码路径集。 |
FloatValue
float
的包装消息。
FloatValue
的 JSON 表示形式是 JSON 数字。
字段名称 | Type | 说明 |
---|---|---|
值 | float | 浮点值。 |
Int32Value
int32
的包装消息。
Int32Value
的 JSON 表示形式是 JSON 数字。
字段名称 | Type | 说明 |
---|---|---|
值 | int32 | int32 值。 |
Int64Value
int64
的包装消息。
Int64Value
的 JSON 表示形式是 JSON 字符串。
字段名称 | Type | 说明 |
---|---|---|
值 | int64 | int64 值。 |
ListValue
ListValue
是一个包装器,用于包装一个重复字段的值。
ListValue
的 JSON 表示形式是 JSON 数组。
字段名称 | Type | 说明 |
---|---|---|
值 | Value | 动态类型值的重复字段。 |
Method
Method 表示一个 API 方法。
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 此方法的简单名称。 |
request_type_url | string | 输入消息类型的 URL。 |
request_streaming | 布尔值 | 如果为 true,则请求将被流式传输。 |
response_type_url | string | 输出消息类型的 URL。 |
response_streaming | 布尔值 | 如果为 true,则响应将被流式传输。 |
选项 | Option | 附加到方法上的任何元数据。 |
语法 | 语法 | 此方法的源语法。 |
Mixin
声明一个要包含在此 API 中的 API。包含的 API 必须重新声明包含的 API 中的所有方法,但文档和选项将继承如下
如果在删除注释和空格后,重新声明的方法的文档字符串为空,则它将从原始方法中继承。
属于服务配置(http、可见性)的每个注释(未在重新声明的方法中设置)都将被继承。
如果继承了 http 注释,则路径模式将按如下方式修改。任何版本前缀都将替换为包括 API 的版本加上指定的
root
路径(如果指定)。
简单混合示例
package google.acl.v1;
service AccessControl {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v1/{resource=**}:getAcl";
}
}
package google.storage.v2;
service Storage {
// rpc GetAcl(GetAclRequest) returns (Acl);
// Get a data record.
rpc GetData(GetDataRequest) returns (Data) {
option (google.api.http).get = "/v2/{resource=**}";
}
}
混合配置示例
apis:
- name: google.storage.v2.Storage
mixins:
- name: google.acl.v1.AccessControl
混合结构暗示AccessControl
中的所有方法也在Storage
中使用相同名称和请求/响应类型声明。文档生成器或注释处理器将在继承文档和注释后看到有效的Storage.GetAcl
方法,如下所示
service Storage {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v2/{resource=**}:getAcl";
}
...
}
请注意路径模式中的版本如何从v1
变为v2
。
如果指定了混合中的root
字段,则它应该是继承的 HTTP 路径放置在其下的相对路径。示例
apis:
- name: google.storage.v2.Storage
mixins:
- name: google.acl.v1.AccessControl
root: acls
这意味着以下继承的 HTTP 注释
service Storage {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
}
...
}
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 包含的 API 的完全限定名称。 |
root | string | 如果非空,则指定继承的 HTTP 路径的根路径。 |
NullValue
NullValue
是一个单例枚举,用于表示Value
类型联合的空值。
NullValue
的 JSON 表示形式是 JSON null
。
枚举值 | 说明 |
---|---|
NULL_VALUE | 空值。 |
Option
协议缓冲区选项,可以附加到消息、字段、枚举等。
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 选项的名称。例如,"java_package" 。 |
值 | Any | 选项的值。例如,"com.google.protobuf" 。 |
SourceContext
SourceContext
表示 protobuf 元素的来源信息,如其定义所在的源文件。
字段名称 | Type | 说明 |
---|---|---|
file_name | string | 包含关联的 protobuf 元素的 .proto 文件的路径限定名称。例如:"google/protobuf/source.proto" 。 |
StringValue
string
的包装消息。
StringValue
的 JSON 表示形式是 JSON 字符串。
字段名称 | Type | 说明 |
---|---|---|
值 | string | 字符串值。 |
Struct
Struct
表示一个结构化数据值,它由映射到动态类型值的字段组成。在某些语言中,Struct
可能受原生表示形式支持。例如,在 JS 等脚本语言中,struct 表示为一个对象。该表示形式的详细信息与该语言的 proto 支持一起描述。
Struct
的 JSON 表示形式是 JSON 对象。
字段名称 | Type | 说明 |
---|---|---|
fields | map<string, Value> | 动态类型值的映射。 |
语法
定义协议缓冲区元素的语法。
枚举值 | 说明 |
---|---|
SYNTAX_PROTO2 | 语法 proto2 。 |
SYNTAX_PROTO3 | 语法 proto3 。 |
Timestamp
时间戳表示独立于任何时区或日历的时间点,表示为 UTC 纪元时间中的秒和纳秒分辨率的秒小数。它使用前儒略历编码,该历法将格里历向后延伸至公元 1 年。它在编码时假定所有分钟都是 60 秒,即闰秒被“抹平”,因此不需要闰秒表进行解释。范围从 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59.999999999Z。通过限制在该范围内,我们确保可以与 RFC 3339 日期字符串进行转换。请参阅 https://www.ietf.org/rfc/rfc3339.txt。
示例 1:从 POSIX time()
计算时间戳。
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
示例 2:从 POSIX gettimeofday()
计算时间戳。
struct timeval tv;
gettimeofday(&tv, NULL);
Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
示例 3:从 Win32 GetSystemTimeAsFileTime()
计算时间戳。
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
Timestamp timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
示例 4:从 Java System.currentTimeMillis()
计算时间戳。
long millis = System.currentTimeMillis();
Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
.setNanos((int) ((millis % 1000) * 1000000)).build();
示例 5:从 Python 中的当前时间计算时间戳。
now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10**9)
timestamp = Timestamp(seconds=seconds, nanos=nanos)
字段名称 | Type | 说明 |
---|---|---|
seconds | int64 | 表示自 Unix 纪元 1970-01-01T00:00:00Z 以来 UTC 时间的秒数。必须从 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59Z(含)。 |
nanos | int32 | 以纳秒分辨率表示的非负秒小数。带小数的负秒值仍必须具有非负纳秒值,这些值按时间顺序向前计数。必须从 0 到 999,999,999(含)。 |
Type
协议缓冲区消息类型。
字段名称 | Type | 说明 |
---|---|---|
名称 | string | 完全限定的消息名称。 |
fields | Field | 字段列表。 |
oneofs | string | 此类型中oneof 定义中出现的类型列表。 |
选项 | Option | 协议缓冲区选项。 |
source_context | SourceContext | 源上下文。 |
语法 | 语法 | 源语法。 |
UInt32Value
uint32
的包装消息。
UInt32Value
的 JSON 表示形式是 JSON 数字。
字段名称 | Type | 说明 |
---|---|---|
值 | uint32 | uint32 值。 |
UInt64Value
uint64
的包装消息。
UInt64Value
的 JSON 表示形式是 JSON 字符串。
字段名称 | Type | 说明 |
---|---|---|
值 | uint64 | uint64 值。 |
Value
Value
表示一个动态类型的值,它可以是 null、数字、字符串、布尔值、递归结构值或值列表。值生成器应设置其中一个变量,不存在任何变量表示错误。
Value
的 JSON 表示形式是 JSON 值。
字段名称 | Type | 说明 |
---|---|---|
联合字段,以下字段中只有一个 | ||
null_value | NullValue | 表示一个 null 值。 |
number_value | double | 表示一个双精度值。请注意,尝试序列化 NaN 或 Infinity 会导致错误。(我们不能将它们序列化为字符串“NaN”或“Infinity”值,就像我们对常规字段所做的那样,因为它们将解析为 string_value,而不是 number_value)。 |
string_value | string | 表示一个字符串值。 |
bool_value | 布尔值 | 表示一个布尔值。 |
struct_value | Struct | 表示一个结构化值。 |
list_value | ListValue | 表示一个重复的Value 。 |