提升效能

本文說明提升應用程式效能的幾個技巧。在某些情況下,我們會使用其他已實作的 API 範例來說明這些技巧背後的概念。不過,同樣的概念也適用於 Display & Video 360 API。

使用部分資源

另一種提高 API 呼叫效能的方式,就是只要求您想要的部分資料。這麼做可避免讓您的應用程式傳輸、剖析及儲存不需要的欄位,進而更有效地使用網路、CPU 以及記憶體等資源。

部分回應

根據預設,伺服器會在處理要求後傳回完整的資源表示法。為改善成效,您可以要求伺服器只傳送您真正需要的欄位,並改為取得「部分回應」

如要提出僅傳回部分回應的要求,請使用 fields 要求參數來指定您想要傳回的欄位。您可以將此參數搭配任何會傳回回應資料的要求使用。

範例

以下範例說明如何將 fields 參數搭配 Display & Video 360 API 使用。

簡易要求:這個 HTTP GET 要求會省略 fields 參數,並傳回完整的資源。

GET https://displayvideo.googleapis.com/v4/advertisers?partnerId=1

完整資源回應:完整資源資料包括下列欄位 (為節省篇幅,此處省略許多其他欄位)。

200 OK

{
 "advertisers": [
  {
   "name": "advertisers/1",
   "advertiserId": "1",
   "partnerId": "1",
   "displayName": "Example Advertiser 1",
   "entityStatus": "ENTITY_STATUS_ACTIVE",
   "updateTime": "2019-01-01T00:00:00.000000Z",
   "generalConfig": {
    "domainUrl": "http://example.com",
    "timeZone": "America/New_York",
    "currencyCode": "USD",
    "address": {
    }
   },
   "adServerConfig": {
    "thirdPartyOnlyConfig": {
    }
   },
   "creativeConfig": {
   },
   "dataAccessConfig": {
    "sdfConfig": {
     "sdfConfig": {
      "version": "VERSION_3_1"
     }
    }
   },
   "integrationDetails": {
   }
  },
  {
   "name": "advertisers/2",
   "advertiserId": "2",
   "partnerId": "1",
   "displayName": "Example Advertiser 2",
   "entityStatus": "ENTITY_STATUS_ACTIVE",
   "updateTime": "2019-01-01T00:00:00.000000Z",
   "generalConfig": {
    "domainUrl": "http://example.com",
    "timeZone": "America/New_York",
    "currencyCode": "USD",
    "address": {
    }
   },
   "adServerConfig": {
    "thirdPartyOnlyConfig": {
    }
   },
   "creativeConfig": {
   },
   "dataAccessConfig": {
    "sdfConfig": {
     "sdfConfig": {
      "version": "VERSION_3_1"
     }
    }
   },
   "integrationDetails": {
   }
  },
  ...
 ],
 "nextPageToken": "..."
}

要求部分回應:以下是對相同資源發出的要求,其中使用了 fields 參數,以大幅減少傳回的資料量。

GET https://displayvideo.googleapis.com/v4/advertisers?partnerId=1&fields=advertisers(advertiserId,partnerId,displayName)

部分回應:在上方的要求回應中,伺服器傳回的回應只包含經過簡化的廣告客戶陣列,只包含個別廣告客戶的廣告客戶 ID、顯示名稱和合作夥伴 ID 屬性 (如有)。

200 OK

{
 "advertisers": [
  {
   "advertiserId": "1",
   "partnerId": "1",
   "displayName": "Example Advertiser 1"
  },
  {
   "advertiserId": "2",
   "partnerId": "1",
   "displayName": "Example Advertiser 2"
  },
  ...
 ]
}

請注意,回應是一個 JSON 物件,且此物件只包含選定的欄位及包住這些欄位的父項物件。

以下將詳述如何設定 fields 參數的格式,接著再進一步說明回應中實際傳回的內容。

欄位參數語法摘要

fields 要求參數值的格式約略以 XPath 語法為基礎。以下提供支援之語法的摘要,其他範例如下一節所示。

  • 使用以逗號分隔的清單來選取多個欄位。

  • 使用 a/ba 欄位的巢狀結構內選取 b 欄位;使用 a/b/cb 的巢狀結構內選取 c 欄位。

  • 透過在括號「( )」中放入運算式,使用子選取器要求一組在陣列或物件中的特定子欄位。

    例如:fields=advertisers(advertiserId,generalConfig/domainUrl) 只會傳回廣告客戶陣列中各個元素的廣告客戶 ID 和網域網址。您也可以指定單一子欄位,其中 fields=advertisers(advertiserId) 等於 fields=advertisers/advertiserId

使用 fields 參數的其他範例

以下範例包含 fields 參數值會如何影響回應的說明。

找出您要傳回的欄位,或「選取欄位」

fields 要求參數值是以逗號分隔的欄位清單,每個欄位是根據回應的根來指定。因此,如果您執行的是 list 作業,回應會是一個集合,其中通常包含資源陣列。如果您執行的作業傳回單一資源,欄位會根據該資源來指定。如果您選取的欄位是一個陣列 (或陣列的一部分),則伺服器會傳回該陣列中所有元素的選定部分。

以下提供幾個集合層級的範例:

範例 效果
advertisers 傳回 advertisers 陣列中的所有元素,包括每個元素中的所有欄位,但不包含其他欄位。
advertisers,nextPageToken 同時傳回 nextPageToken 欄位和 advertisers 陣列中的所有元素。
advertisers/advertiserId 只傳回 advertisers 陣列中所有元素的 advertiserId

每當傳回巢狀欄位時,回應都會包含包住該欄位的父項物件。父項欄位不會包含任何其他子欄位 (除非已同時明確地選擇這些欄位)。
advertisers/generalConfig/domainUrl 傳回 generalConfig 物件的 domainUrl 欄位,該欄位本身巢狀配置在 advertisers 陣列下方。

以下提供幾個資源層級的範例:

範例 效果
advertiserId 傳回所要求資源的 advertiserId 欄位。
generalConfig/domainUrl 傳回所要求資源中 generalConfig 物件的 domainUrl 欄位。
使用「子選取項目」只請求指定欄位部分。

根據預設,如果您的要求指定特定的欄位,伺服器會傳回整個物件或陣列元素。您可以指定回應中僅包含哪些特定欄位。方法很簡單,只要使用「( )」子選取項目語法即可,如下列範例所示。

範例 效果
advertisers(advertiserId,generalConfig/domainUrl) 只傳回 advertisers 陣列中每個元素的 advertiserId 和 generalConfig domainUrl 值。
處理部分回應

伺服器處理包含 fields 查詢參數的有效要求後,會傳回一個 HTTP 200 OK 狀態碼,以及所要求的資料。如果 fields 查詢參數發生錯誤或無效,伺服器會傳回 HTTP 400 Bad Request 狀態碼和錯誤訊息,指出使用者選取欄位時發生的錯誤 (例如 "Invalid field selection a/b")。