索引
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
包含任意序列化訊息,以及一個有關序列化訊息類型的網址。
JSON
Any
值的 JSON 表示法使用反序列化嵌入訊息的一般表示法,以及包含包含類型網址的額外欄位 @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 表示法,系統就會嵌入該表示法,新增 value
欄位,除了 @type
欄位之外,還包含自訂 JSON。範例 (針對訊息 google.protobuf.Duration
):
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
欄位名稱 | 類型 | 說明 |
---|---|---|
type_url |
string |
內容/資源名稱,其內容會描述序列化訊息的類型。 如果網址使用
|
value |
bytes |
必須是上述指定類型的有效序列化資料。 |
Api
API 是一種通訊協定緩衝區服務的輕量描述元。
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
這個 API 的完整名稱,包括套件名稱和 API 的簡易名稱。 |
methods |
|
這個 API 的方法,按未指定順序排列。 |
options |
|
附加至 API 的任何中繼資料。 |
version |
string |
這個 API 的版本字串。指定時,必須採用 版本管理架構使用語意化版本管理,主要版本編號表示破壞性變更,次要版本則是新增且非破壞性變更。這兩個版本編號都會向使用者提供不同版本的期望信號,請根據產品方案謹慎選擇。 主要版本也會反映在 API 的套件名稱中,且名稱必須以 |
source_context |
|
此訊息代表的通訊協定緩衝區服務來源內容。 |
mixins |
|
包含的 API。詳情請參閱《Mixin 》。 |
syntax |
|
服務的來源語法。 |
BoolValue
bool
的包裝訊息。
BoolValue
的 JSON 表示法是 JSON true
和 false
。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
bool |
布林值。 |
BytesValue
bytes
的包裝訊息。
BytesValue
的 JSON 表示法為 JSON 字串。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
bytes |
位元組值。 |
DoubleValue
double
的包裝訊息。
DoubleValue
的 JSON 表示法為 JSON 號碼。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
double |
雙精度值。 |
時間長度
「時間長度」代表經過簽署的固定時間長度,代表以奈秒解析度為秒數和秒數的分數。不受任何日曆與概念影響,例如「日」或「月」。與時間戳記相關範圍約為 +-10,000 年。
範例 1:虛擬程式碼中兩個時間戳記的運算時間長度。
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 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 表示法是以 String
結尾的 String
,表示秒,前面加上秒,其中秒以分秒表示。
欄位名稱 | 類型 | 說明 |
---|---|---|
seconds |
int64 |
時長的已簽署秒數。必須介於 -315,576,000,000 到 +315,576,000,000 (含) 之間。 |
nanos |
int32 |
以分鐘為單位的解析度,以一定比例呈現已取得的秒數。時間長度不到 1 秒的值為 seconds 的 0 欄位,以及正或負的 nanos 欄位。時間長度在一秒以上的值時,nanos 欄位的非零值必須與 seconds 欄位具有相同的符號。必須介於 -999,999,999 到 +999,999,999 之間 (含首尾值)。 |
空白
一般的空白訊息,可重複使用,避免在 API 中定義重複的空白訊息。常見的例子是將其做為 API 方法的要求或回應類型。例如:
service Foo {
rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
}
Empty
的 JSON 表示法是空的 JSON 物件 {}
。
列舉
列舉類型定義。
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
列舉類型名稱。 |
enumvalue |
|
列舉值定義。 |
options |
|
通訊協定緩衝區選項。 |
source_context |
|
來源內容。 |
syntax |
|
來源語法。 |
EnumValue
列舉值定義。
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
列舉值名稱。 |
number |
int32 |
列舉值: |
options |
|
通訊協定緩衝區選項。 |
欄位
單一訊息類型欄位。
欄位名稱 | 類型 | 說明 |
---|---|---|
kind |
|
欄位類型。 |
cardinality |
|
欄位基數。 |
number |
int32 |
欄位編號。 |
name |
string |
欄位名稱。 |
type_url |
string |
訊息或列舉類型的欄位類型網址,沒有配置。範例:"type.googleapis.com/google.protobuf.Timestamp" 。 |
oneof_index |
int32 |
Type.oneofs 中欄位類型的索引,適用於訊息或列舉類型。第一個類型的索引 1;0 表示類型不在清單中。 |
packed |
bool |
是否使用替代接線線表示法。 |
options |
|
通訊協定緩衝區選項。 |
json_name |
string |
欄位 JSON 名稱。 |
default_value |
string |
這個欄位預設值的字串值。僅限 Proto2 語法。 |
基數
欄位是否為選填、必要或重複欄位。
列舉值 | 說明 |
---|---|
CARDINALITY_UNKNOWN |
不明基數的欄位。 |
CARDINALITY_OPTIONAL |
選填欄位。 |
CARDINALITY_REQUIRED |
必填欄位。僅限 Proto2 語法。 |
CARDINALITY_REPEATED |
重複欄位。 |
種類
基本欄位類型。
列舉值 | 說明 |
---|---|
TYPE_UNKNOWN |
欄位類型不明。 |
TYPE_DOUBLE |
欄位類型為雙倍。 |
TYPE_FLOAT |
欄位類型 float。 |
TYPE_INT64 |
欄位類型 int64。 |
TYPE_UINT64 |
欄位類型:uint64。 |
TYPE_INT32 |
欄位類型 int32。 |
TYPE_FIXED64 |
欄位類型固定:64。 |
TYPE_FIXED32 |
欄位類型固定 32: |
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
訊息中找到的欄位。
欄位遮罩可用來指定應由 get 作業 (「投影」) 傳回或由更新作業修改的欄位欄位。欄位遮罩也包含自訂的 JSON 編碼 (請見下文說明)。
投影中的面膜
當 FieldMask
指定「投影」時,API 會篩選回應訊息 (或子訊息),僅包含遮罩中指定的這些欄位。以這則「預先遮蓋」回應訊息為例:
f {
a : 22
b {
d : 1
x : 2
}
y : 13
}
z: 8
在套用上例中的遮罩後,API 回應將不會包含 x、y 或 z 欄位的特定值 (系統會將其值設為預設值,且在 proto text 輸出中予以忽略):
f {
a : 22
b {
d : 1
}
}
欄位重複,不得在欄位遮罩的最後位置顯示。
如果 get 作業中沒有 FieldMask 物件,則作業會套用到所有欄位 (就像所有欄位的 FieldMask 都一樣)。
請注意,欄位遮罩不一定適用於頂層回應訊息。在 REST get 作業中,欄位遮罩會直接套用至回應,但在 REST 清單作業的情況下,遮罩也會套用至傳回資源清單中的每則訊息。如果是 REST 自訂方法,可使用其他定義。在 API 中,宣告的適用範圍和宣告都會清楚列出。在任何情況下,API 的行為都需要對傳回的資源/資源產生影響。
更新作業中的欄位遮罩
更新作業中的欄位遮罩會指定要將指定資源更新的欄位。此 API 只需要變更遮罩中指定的欄位值,其他欄位則保持不變。如果將資源傳入說明來描述更新的值,API 會忽略所有不在遮罩中的欄位值。
如要將欄位的值重設為預設值,該欄位必須存在於遮罩中,並設為指定資源中的預設值。因此,如要重設資源的所有欄位,請提供資源的預設例項,並設定遮罩中的所有欄位,或是按照下列說明提供遮罩。
如果更新時沒有任何欄位遮罩,作業會套用至所有欄位 (就像所有欄位的欄位遮罩一樣)。請注意,在結構定義演變時,這可能表示用戶端不知道,因此未填入要求的欄位會重設為預設值。如果這是不必要的行為,特定服務可能會要求用戶端一律指定欄位遮罩,否則會造成錯誤。
與 get 作業一樣,要求訊息中描述更新值的資源位置取決於作業種類。在任何情況下,欄位遮罩的效果都需要 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"
}
欄位名稱 | 類型 | 說明 |
---|---|---|
paths |
string |
欄位遮罩路徑組合。 |
FloatValue
float
的包裝訊息。
FloatValue
的 JSON 表示法為 JSON 號碼。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
float |
浮點值。 |
Int32Value
int32
的包裝訊息。
Int32Value
的 JSON 表示法為 JSON 號碼。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
int32 |
int32 的值。 |
Int64Value
int64
的包裝訊息。
Int64Value
的 JSON 表示法為 JSON 字串。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
int64 |
int64 值。 |
ListValue
ListValue
是重複值欄位的包裝函式。
ListValue
的 JSON 表示法為 JSON 陣列。
欄位名稱 | 類型 | 說明 |
---|---|---|
values |
|
動態輸入值的重複欄位。 |
方法
方法代表 API 的方法,
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
這個方法的簡單名稱。 |
request_type_url |
string |
輸入訊息類型的網址。 |
request_streaming |
bool |
如果為 true,系統會串流要求。 |
response_type_url |
string |
輸出訊息類型的網址。 |
response_streaming |
bool |
如為 true,則系統會串流回應。 |
options |
|
附加至該方法的任何中繼資料。 |
syntax |
|
這個方法的來源語法。 |
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";
}
...
}
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
包含的 API 完整名稱。 |
root |
string |
如果非空白指定了指定繼承 HTTP 路徑的路徑。 |
NullValue
NullValue
是單例列舉,代表 Value
類型聯集的空值。
NullValue
的 JSON 表示法是 JSON null
。
列舉值 | 說明 |
---|---|
NULL_VALUE |
空值。 |
選項
通訊協定緩衝區選項,可附加到訊息、欄位、列舉等中。
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
選項的名稱。例如 "java_package" 。 |
value |
|
選項的值。例如 "com.google.protobuf" 。 |
SourceContext
SourceContext
代表 protobuf 元素的來源相關資訊,例如其定義的檔案。
欄位名稱 | 類型 | 說明 |
---|---|---|
file_name |
string |
包含相關 protobuf 元素的 .proto 檔案路徑有效名稱。例如 "google/protobuf/source.proto" 。 |
StringValue
string
的包裝訊息。
StringValue
的 JSON 表示法為 JSON 字串。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
string |
字串值。 |
結構
Struct
代表結構化資料值,由可對應至動態輸入值的欄位組成。在部分語言中,Struct
可能支援原生表示法。舉例來說,在 JS 等指令碼語言中,結構表示為物件。該表示法的詳細資訊以及該語言的 proto 支援。
Struct
的 JSON 表示法為 JSON 物件。
欄位名稱 | 類型 | 說明 |
---|---|---|
fields |
map<string, |
動態輸入值的對應。 |
語法
通訊協定緩衝區元素的定義語法。
列舉值 | 說明 |
---|---|
SYNTAX_PROTO2 |
語法 proto2 。 |
SYNTAX_PROTO3 |
語法 proto3 。 |
時間戳記
時間戳記代表與任何時區或日曆無關的時間點,以 UTC 紀元時間 (奈秒) 的秒數或秒的分數表示。「編碼」日曆是「Google 日曆」的「Google 日曆」它進行編碼時,假設所有分鐘數都為 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)
欄位名稱 | 類型 | 說明 |
---|---|---|
seconds |
int64 |
代表自 Unix 紀元 1970-01-01T00:00:00Z 以分 UTC 時間的秒數。這個值必須介於 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59Z (含) 之間。 |
nanos |
int32 |
以奈秒解析度為一秒的非負分數。具有分數的負第二個負數值仍須具有非負數的正負號 nanos 值。必須介於 0 到 999,999,999 之間 (含首尾值)。 |
類型
通訊協定緩衝區訊息類型。
欄位名稱 | 類型 | 說明 |
---|---|---|
name |
string |
完整訊息名稱。 |
fields |
|
欄位清單。 |
oneofs |
string |
此類型 oneof 定義中顯示的類型清單。 |
options |
|
通訊協定緩衝區選項。 |
source_context |
|
來源內容。 |
syntax |
|
來源語法。 |
UInt32Value
uint32
的包裝訊息。
UInt32Value
的 JSON 表示法為 JSON 號碼。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
uint32 |
uint32 值。 |
UInt64Value
uint64
的包裝訊息。
UInt64Value
的 JSON 表示法為 JSON 字串。
欄位名稱 | 類型 | 說明 |
---|---|---|
value |
uint64 |
uint64 值。 |
值
Value
表示動態輸入值,可以是空值、數字、字串、布林值、遞迴結構值或值清單。值的製作者應設定其中任何一個變數,如果沒有任何變化版本,就會發生錯誤。
Value
的 JSON 表示法為 JSON 值。
欄位名稱 | 類型 | 說明 |
---|---|---|
欄位的值,只能填入下列其中一個值: | ||
null_value |
|
代表空值。 |
number_value |
double |
代表雙精度值。請注意,嘗試對 NaN 或 Infinity 序列化序列化會導致錯誤。(我們無法像一般欄位一樣,將這些字串序列化為字串「NaN」或「Infinity」值,因為它們會剖析為 string_value,而不是數字_value)。 |
string_value |
string |
代表字串值。 |
bool_value |
bool |
表示布林值。 |
struct_value |
|
代表結構化值。 |
list_value |
|
代表重複的 Value 。 |