提升性能

本文介绍了一些您可以用来提高应用性能的技巧。在某些情况下,我们会采用其他已实现的 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)

部分响应:服务器为响应上述请求而发回的响应包含一个简化的 advertisers 数组,该数组仅包含每个广告客户的广告客户 ID、显示名称和合作伙伴 ID 属性(如果有)。

200 OK

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

请注意,响应是一个只包含所选字段及其所属父对象的 JSON 对象。

接下来,我们将详细介绍如何设置 fields 参数格式,以及响应中会返回哪些确切内容。

“fields”参数语法摘要

fields 请求参数值的格式大致基于 XPath 语法。下文总结了支持的语法,随后还有更多示例。

  • 使用以逗号分隔的列表来选择多个字段。

  • 使用 a/b 选择嵌套在字段 a 内的字段 b;使用 a/b/c 选择嵌套在 b 内的字段 c

  • 将表达式放在括号“( )”内,使用子选择器来请求数组或对象的一组特定子字段。

    例如:fields=advertisers(advertiserId,generalConfig/domainUrl) 只会返回 advertisers 数组中每个元素的广告客户 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")。