本文說明如何建構 API 要求,以及處理 Compute Engine API 的 API 回應。涵蓋下列工作:
- 如何建構要求內文。
- 如何決定要求所需的資源 URI。
- 如何處理 API 回應。
- 判斷 API 要求是否成功。
本文未說明如何向 API 進行驗證。如要瞭解如何向 API 進行驗證,請參閱「向 Compute Engine 進行驗證」。
事前準備
建立 API 要求
Compute Engine API 預期 API 要求內文採用 JSON 格式。
如要發出 API 要求,您可以透過 curl 或 httplib2 等工具直接發出 HTTP 要求,也可以使用可用的用戶端程式庫。
直接發出 HTTP 要求時,您可以指定伺服器必須回應的版本。建議您指定 API 版本,因為這樣可提高應用程式的穩定性,並控管採用新服務功能的時間。
對於需要要求主體的 API 要求 (例如 POST、PUT 或 PATCH 要求),要求主體會包含您要在這項要求中設定的資源屬性。
API 要求範例
下列 curl 指令會向 instances.insert 方法發出 POST 要求,並使用 API 版本 2026-09-01。這項要求會建立執行個體,並使用網址中定義的專案和區域參數,以及要求內文中定義的執行個體屬性。要求主體會以 -d 標記表示。
如要指定 API 版本,可以使用 $apiVersion 查詢參數或 X-Goog-Api-Version 標頭。詳情請參閱 AIP-184。
查詢參數中的版本
如要在查詢參數中指定 API 版本,請加入 %24apiVersion 查詢參數,並選取 API 版本。
curl -X POST -H "Authorization: Bearer [OAUTH_TOKEN]" \
-H "Content-Type: application/json" \
"https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances?%24apiVersion=2026-09-01" -d \
'{
"disks":[
{
"boot":"true",
"initializeParams":{
"sourceImage":"https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-10-buster-v20210122"
}
}
],
"machineType":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2",
"name":"VM_NAME",
"networkInterfaces":[
{
"accessConfigs":[
{
"name":"external-nat",
"type":"ONE_TO_ONE_NAT"
}
],
"network":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default"
}
]
}'標頭中的版本
如要在標頭中指定 API 版本,請加入 X-Goog-Api-Version 標頭,並選取 API 版本。
curl -X POST -H "Authorization: Bearer [OAUTH_TOKEN]" \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Version: 2026-09-01" \
"https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances" -d \
'{
"disks":[
{
"boot":"true",
"initializeParams":{
"sourceImage":"https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-10-buster-v20210122"
}
}
],
"machineType":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2",
"name":"VM_NAME",
"networkInterfaces":[
{
"accessConfigs":[
{
"name":"external-nat",
"type":"ONE_TO_ONE_NAT"
}
],
"network":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default"
}
]
}'映像檔 URI 的專案 ID (debian-cloud) 與您的專案 ID 不同,因為映像檔屬於不同專案 (視映像檔類型而定)。舉例來說,Compute Engine 提供的所有公開 Debian 映像檔都代管在 debian-cloud 專案中。
如要參照其他資源,請使用完整資源 URI。
舉例來說,network 屬性會使用 default 網路的完整 URI。
使用用戶端程式庫發出 API 要求
用戶端程式庫可簡化 API 要求建構程序。這些函式庫支援 API 的穩定版和搶先體驗版。部分語言支援預先發布的用戶端版本,並以 -preview.1 或 -rc.1 等後置字元表示。
Python
Java
建立資源 URI
在 Compute Engine API 中,對其他 Google Cloud 資源的參照會以完整 URI 的形式提供:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/SPECIFIC_RESOURCE
指定映像檔、機型、網路或任何其他資源時,使用 API 時必須提供資源的 URI。Google Cloud CLI 和控制台等用戶端工具會隱藏這項複雜性,並為您建立這些資源 URI,但直接與 API 互動時,您必須自行建立這些資源 URI。 Google Cloud
不同類型的資源有稍微不同的資源 URI。舉例來說,可用區資源的 URI 中有 zone 規格:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2
區域資源會將 zone 規格替換為 region 規格:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
同樣地,全域資源具有 global 規格:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/VM_NAME
Compute Engine API 也接受部分 URI,因為服務可以推斷專案 ID 等資訊。因此,下列先前 URI 的部分版本也適用:
zones/ZONE/machineTypes/e2-standard-2
regions/REGION/addresses/ADDRESS_NAME
project/PROJECT_ID/global/images/VM_NAME
在部分 URI 中,可用區和區域 URI 都省略了專案 ID,但圖片 URI 並未省略。這是因為 Compute Engine 提供的公開映像檔代管在其他專案中,例如所有 Debian 映像檔代管在 debian-cloud,所有 Ubuntu 映像檔代管在 ubuntu-os-cloud。如要使用這些圖片,請先提供適當的專案 ID。如果省略映像檔的專案 ID,Compute Engine 會嘗試在專案中尋找映像檔,但由於映像檔不存在,要求會失敗。
不過,如果您使用專案所屬的自訂圖片 (與您建立這項資源的專案相同),提供圖片 URI 時可以省略專案規格。
判斷必要屬性
Compute Engine API 參考文件 (適用於 IBV API,以及 CBV API 第 1 版和 Beta 版) 說明瞭可為特定資源設定的所有可能屬性。參考文件會區分可變動和不可變動的屬性 (以屬性說明中的 [Output Only] 標示),但如要判斷資源的必要屬性,您需要查看特定工作的說明文件。
舉例來說,如果您要建立執行個體,請參閱「從映像檔建立執行個體」說明文件,瞭解要求所需的 API 屬性。如要在 API 中建立靜態外部 IP 位址,請參閱「靜態外部 IP 位址」說明文件。
驗證 API 要求
如要驗證 API 要求,請按照下列步驟操作:
在 Compute Engine API 參考資料中,找出程式碼呼叫的方法。例如
v1/compute.instances.insert或2026-09-01/compute.instances.insert。按一下內容選單中的「立即試用!」「嘗試這個方法」視窗隨即開啟。
在「要求參數」下方,您不需要提供 project 或 zone,因為驗證不需要提交要求。
如果是 IBV 方法,請在「X-Goog-Api-Version」X-Goog-Api-Version下方選取 API 版本。
在「Request body」下方,貼上要求。
要求中格式錯誤的元素會以藍色底線標示。按一下各個底線部分,即可進一步瞭解要解決的問題。
處理 API 回應
如果您提出會變更資料的要求,Compute Engine 會傳回 Operation 物件,您可以輪詢該物件,取得要求作業的狀態。Operation 資源如下所示:
{
"kind": "compute#operation",
"id": "7127550864823803662",
"name": "operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b",
"zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE",
"operationType": "insert",
"targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM",
"targetId": "4132355614508179214",
"status": "PENDING",
"user": "user@example.com",
"progress": 0,
"insertTime": "2016-03-24T14:53:37.788-07:00",
"selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b"
}如果原始要求是變動 (變更) 可用區資源 (例如建立磁碟快照或停止執行個體),Compute Engine 會傳回 zoneOperations 物件。同樣地,區域和全域資源會分別傳回 regionOperations 或 globalOperations 物件。如要取得作業狀態,請對特定 Operation 資源執行使用 get 或 wait 方法的要求,並提供作業的 name。
Operation 資源的狀態回報為 DONE 後,要求才算完成。視要求性質而定,這項作業可能需要一段時間。然後,在 Operation 資源的狀態傳回 DONE 後,您可以檢查作業是否成功,以及是否有任何錯誤。
舉例來說,下列回應表示先前的作業已完成 (由 DONE 狀態指定):
endTime: '2016-03-24T14:54:07.119-07:00' id: '7127550864823803662' insertTime: '2016-03-24T14:53:37.788-07:00' kind: compute#operation name: operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b operationType: insert progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b startTime: '2016-03-24T14:53:38.397-07:00' status: DONE targetId: '4132355614508179214' targetLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM user: user@example.com zone: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE
如要確認,請對資源發出 get 要求,檢查資源是否存在並正在執行。例如:
GET /compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM
{
"cpuPlatform": "Intel Haswell",
"creationTimestamp": "2016-03-24T14:53:37.170-07:00",
"disks": [
..[snip]..
],
"selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM",
"status": "RUNNING",
"tags": {
"fingerprint": "42WmSpB8rSM="
},
"zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE"
}輪詢作業
您可以編寫一些程式碼,定期輪詢作業,並使用 get 或 wait 要求,在作業狀態為 DONE 時傳回。
使用 get 要求時,無論作業狀態為何,系統都會立即傳回作業。您需要定期輪詢作業,才能瞭解作業何時完成。
如果您發出 wait 要求,作業為 DONE 時,或要求即將達到 2 分鐘的期限時,要求就會傳回。您可以選擇使用 wait 或 get 輪詢作業,但 wait 方法比 get 方法有以下優點:
- 您可以設定用戶端,降低輪詢作業狀態的頻率,減少 Compute Engine API 的 QPS 用量。
- 作業完成後,伺服器會立即通知用戶端,因此作業完成與用戶端收到通知之間的平均延遲時間大幅縮短。
- 這個方法會提供有界等待。這個方法最多會等待預設 HTTP 超時時間 (2 分鐘),然後傳回作業的目前狀態,可能是
DONE或仍在進行中。
wait 方法是盡可能提供最佳結果的 API。如果伺服器超載,要求可能會在抵達預設期限前傳回,或等待零秒後傳回。此外,方法也不保證只會在作業為 DONE 時傳回。舉例來說,如果要求即將達到 2 分鐘的期限,即使作業尚未完成,這個方法也會傳回。如要檢查作業,建議您使用 wait 或 get 方法 (在重試迴圈中,間隔一段時間),定期輪詢作業狀態。重試間隔上限不得超過作業保留時間下限。
輪詢範例
下列範例使用 get 方法。您可以將 get 方法替換為 wait 方法: