本文說明如何批次處理 API 呼叫,以減少用戶端必須建立的 HTTP 連線數量。
本文專門說明如何透過傳送 HTTP 要求來提交批次要求。如果您是使用 Google 用戶端程式庫提交批次要求,請參閱用戶端程式庫的說明文件。
總覽
用戶端建立的每個 HTTP 連線都會造成一定程度的負擔。Google 廣告體驗報表 API 支援批次作業,可以讓用戶端在單一 HTTP 要求中加入數個 API 呼叫。
以下是您可能想要使用批次作業的狀況範例:
- 您剛開始使用 API,有許多資料需要上傳。
- 使用者在您的應用程式離線 (中斷與網際網路的連線) 時變更了資料,所以應用程式必須傳送許多更新和刪除資料,讓本機資料能夠與伺服器同步處理。
在任一案例中,都不需要個別傳送每一個呼叫,只需將這些呼叫分組後組成單一 HTTP 要求。所有內部要求都必須前往相同的 Google API。
單一批次要求最多能包含 1,000 個呼叫。如果您需要進行更多呼叫,請使用多個批次要求。
注意:Google 廣告體驗報表 API 的批次系統所使用的語法與 OData 批次處理系統相同,但語意不同。
批次詳細資料
批次要求是由多個 API 呼叫合併成一個 HTTP 要求,系統會將這個要求傳送至 API 探索文件中指定的 batchPath
。預設路徑為 /batch/api_name/api_version
。本節詳細說明批次語法,並在後半段提供範例。
注意:組成批次的「n」n個要求在用量限制中會算成「n」n個要求,而不是一個要求。批次要求會先分解成一組要求再進行處理。
批次要求的格式
批次要求是單一標準 HTTP 要求,內含多個使用 multipart/mixed
內容類型的 Google 廣告體驗報告 API 呼叫。在主要 HTTP 要求中,每個分部都含有一個巢狀的 HTTP 要求。
每個部分都以專屬的 Content-Type: application/http
HTTP 標頭開頭。也可以視需要加上 Content-ID
標頭。不過,部分標頭只是用來標示部分的開頭,與巢狀要求不同。伺服器將批次要求解壓縮為個別要求後,就會忽略部分標頭。
每個部分的內文都是完整的 HTTP 要求,各有專屬的動詞、網址、標頭和內文。HTTP 要求只能包含 URL 的路徑部分;批次要求禁止納入完整的 URL。
外部批次要求的 HTTP 標頭 (Content-
標頭除外,例如 Content-Type
) 會套用至批次中的每個要求。如果您在外部要求和個別呼叫中均指定所提供的 HTTP 標頭,則個別呼叫標頭的值會覆寫外部批次要求標頭的值。個別呼叫的標頭只會套用於該呼叫。
例如,如果您提供 Authorization 標頭用於特定呼叫,則該標頭只會套用於該呼叫。如果您提供 Authorization 標頭用於外部要求,則除非個別呼叫以自己的 Authorization 標頭覆寫所提供的標頭,否則所提供的 Authorization 標頭會套用於所有個別呼叫。
當伺服器收到批次要求時,即會將外部要求的查詢參數和標頭 (在適用情況下) 套用至每一個分部,然後將每個分部視為不同的 HTTP 要求。
回應批次要求
伺服器的回應是單一標準 HTTP 回應,內容類型為 multipart/mixed
;每個部分都是對批次要求中其中一項要求的回應,順序與要求相同。
就像要求中的分部一樣,每個回應分部都含有完整的 HTTP 回應,包括狀態碼、標頭和內文;與要求中的部分一樣,每個回應部分前面都會加上 Content-Type
標頭,標示該部分的開頭。
如果要求中某個部分有 Content-ID
標頭,則回應中對應的部分也會有相符的 Content-ID
標頭,且原始值會加上 response-
字串前置字元,如下例所示。
注意:伺服器可能會以任何順序執行呼叫。不要期望呼叫會按您的指定順序執行。如果您想要確保兩個呼叫依指定順序執行,就不能以單一要求傳送它們,而要先傳送第一個呼叫,然後等到第一個呼叫的回應後才能傳送第二個呼叫。
範例
以下範例顯示批次作業與 Google 廣告體驗報告 API 的搭配用法。
批次要求範例
POST /batch/v1?key=key HTTP/1.1 Content-Type: multipart/mixed; boundary=batch_aer --batch_aer Content-Type: application/http Content-ID: id1 GET /v1/sites/http%3A%2F%2F/site1%2F HTTP/1.1 --batch_aer Content-Type: application/http Content-ID: id2 GET /v1/sites/http%3A%2F%2F/site2%2F HTTP/1.1 --batch_aer--
批次回應範例
這是前一節中範例要求的回應。
HTTP/1.1 200 OK Content-Type: multipart/mixed; boundary=batch_aer --batch_aer Content-Type: application/http Content-ID: response-id1 HTTP/1.1 200 OK Content-Type: application/json { "reviewedSite": "site1", "mobileSummary": { "lastChangeTime": "2019-02-05T09:46:26.521747Z", "betterAdsStatus": "PASSING", "reportUrl": "https://www.google.com/webmasters/tools/ad-experience-mobile?siteUrl=http://site1/", "filterStatus": "OFF" }, "desktopSummary": { "lastChangeTime": "2019-02-07T23:07:29.017206Z", "betterAdsStatus": "FAILING", "enforcementTime": "2018-02-15T15:00:00Z", "reportUrl": "https://www.google.com/webmasters/tools/ad-experience-desktop?siteUrl=http://site1/", "filterStatus": "ON" } } --batch_aer Content-Type: application/http Content-ID: response-id2 HTTP/1.1 200 OK Content-Type: application/json { "reviewedSite": "site2", "mobileSummary": { "lastChangeTime": "2018-03-06T16:06:33.375851Z", "betterAdsStatus": "PASSING", "reportUrl": "https://www.google.com/webmasters/tools/ad-experience-mobile?siteUrl=http://site2/", "filterStatus": "OFF" }, "desktopSummary": { "lastChangeTime": "2018-03-06T16:06:33.375851Z", "betterAdsStatus": "PASSING", "reportUrl": "https://www.google.com/webmasters/tools/ad-experience-desktop?siteUrl=http://site2/", "filterStatus": "OFF" } } --batch_aer--