第三方 API

Google Ads 脚本的一项强大功能是能够与第三方 API 中的数据和服务集成。

本指南介绍了以下概念,可帮助您编写脚本来连接到其他服务:

  • 发出 HTTP 请求:如何使用 UrlFetchApp 访问外部 API。
  • 身份验证:我们介绍了一些常见的身份验证场景。
  • 解析响应:如何处理返回的 JSON 和 XML 数据。

我们还提供了一些常用 API 的示例,以说明这些概念。

使用 UrlFetchApp 提取数据

UrlFetchApp 提供与第三方 API 交互所需的核心功能。

以下示例展示了如何从 OpenWeatherMap 提取天气数据。我们之所以选择 OpenWeatherMap,是因为其授权方案和 API 相对简单。

发出请求

OpenWeatherMap 文档指定了请求当前天气的格式,如下所示:

http://api.openweathermap.org/data/2.5/weather?q=[location]&apikey=[apikey]

该网址提供了我们的第一个授权示例:参数 apikey 是必需的,并且每个用户的值都是唯一的。您可以通过注册来获取此密钥。

注册后,您可以按如下方式发出使用该密钥的请求:

const location = 'London,uk';
const apikey = 'da.......................81'; // Replace with your API key
const currentWeatherUrl = `http://api.openweathermap.org/data/2.5/weather?q=${location}&apiKey=${apiKey}`;
const response = UrlFetchApp.fetch(currentWeatherUrl);
console.log(response.getContentText());

执行此代码会将一长串 JSON 文本写入 Google Ads 脚本中的日志记录窗口。

下一步是将其转换为可在脚本中使用的格式。

JSON 数据

许多 API 以 JSON 格式提供响应。这表示 JavaScript 对象的简单序列化,以便对象、数组和基本类型可以作为字符串表示和传输。

如需将 JSON 字符串(例如从 OpenWeatherMap 返回的字符串)转换回 JavaScript 对象,请使用内置的 JSON.parse 方法。继续使用上面的示例:

const json = response.getContentText();
const weatherData = JSON.parse(json);
console.log(weatherData.name);
//  "London"

JSON.parse 方法会将字符串转换为具有 name 属性的对象。

如需详细了解如何处理不同格式的 API 响应,请参阅解析响应部分。

错误处理

在脚本中使用第三方 API 时,错误处理是一项重要考虑因素,因为第三方 API 经常会发生变化,并生成意外的响应值,例如:

  • API 的网址或参数可能会在您不知情的情况下发生变化。
  • 您的 API 密钥(或其他用户凭据)可能会过期。
  • 我们可能会随时更改回复的格式,恕不另行通知。

HTTP 状态代码

由于可能会出现意外响应,因此您应检查 HTTP 状态代码。默认情况下,如果遇到 HTTP 错误代码,UrlFetchApp 会抛出异常。如需更改此行为,您需要传递一个可选参数,如以下示例所示:

const options = {
  muteHttpExceptions: true
}
const response = UrlFetchApp.fetch(url, options);
// Any status code greater or equal to 400 is either a client or server error.
if (response.getResponseCode() >= 400) {
  // Error encountered, send an email alert to the developer
  sendFailureEmail();
}

响应结构

当第三方 API 发生变化时,开发者通常不会立即发现可能会影响其脚本的更改。例如,如果 OpenWeatherMap 示例中返回的 name 属性更改为 locationName,则使用此属性的脚本将会失败。

因此,测试返回的结构是否符合预期会很有帮助,例如:

const weatherData = JSON.parse(json);
if (weatherData && weatherData.name) {
  console.log('Location is : ' + name);
} else {
  console.log('Data not in expected format');
}

使用 UrlFetchApp 发送 POST 数据

使用 OpenWeatherMap 的入门示例仅提取了数据。通常,不会更改远程服务器状态的 API 调用会使用 HTTP GET 方法。

GET 方法是 UrlFetchApp 的默认方法。不过,某些 API 调用(例如对发送短信的服务的调用)需要使用其他方法,例如 POSTPUT

为了说明如何将 POST 调用与 UrlFetchApp 搭配使用,以下示例演示了如何与协作消息应用 Slack 集成,以向 Slack 用户和群组发送 Slack 消息。

设置 Slack

本指南假定您已注册 Slack 账号。

与前面的 OpenWeatherMap 示例一样,您必须获取令牌才能发送消息。Slack 会提供一个唯一网址(称为“传入 webhook”),供您向团队发送消息。

点击添加传入 WebHooks 集成并按照说明操作,设置传入 WebHooks。该进程应发出用于发送消息的网址。

发出 POST 请求

设置好 Incoming Webhook 后,只需在传递给 UrlFetchApp.fetchoptions 参数中使用一些额外的属性,即可发出 POST 请求:

  • method:如前所述,此值默认为 GET,但在这里,我们将其替换为 POST
  • payload:这是要作为 POST 请求的一部分发送到服务器的数据。在此示例中,Slack 希望对象序列化为 JSON 格式,如 Slack 文档中所述。为此,请使用 JSON.stringify 方法,并将 Content-Type 设置为 application/json

      // Change the URL for the one issued to you from 'Setting up Slack'.
      const SLACK_URL = 'https://hooks.slack.com/services/AAAA/BBBB/CCCCCCCCCC';
      const slackMessage = {
        text: 'Hello, slack!'
      };
    
      const options = {
        method: 'POST',
        contentType: 'application/json',
        payload: JSON.stringify(slackMessage)
      };
      UrlFetchApp.fetch(SLACK_URL, options);
    

扩展的 Slack 示例

上述示例显示了启用 Slack 消息接收功能所需的最小值。下面的扩展示例展示了如何创建广告系列效果报告并将其发送给组,以及一些格式和显示选项。

收到的消息

如需详细了解 Slack 消息,请参阅 Slack 文档中的消息格式部分。

表单数据

上面的示例演示了如何将 JSON 字符串用作 POST 请求的 payload 属性。

UrlFetchApp 会根据 payload 的格式采用不同的方法来构建 POST 请求:

  • payload 为字符串时,系统会将字符串参数作为请求正文发送。
  • 如果 payload 是对象(例如值的映射):

    {to: 'mail@example.com', subject:'Test', body:'Hello, World!'}
    

    键值对会转换为表单数据:

    subject=Test&to=mail@example.com&body=Hello,+World!
    

    此外,请求的 Content-Type 标头设置为 application/x-www-form-urlencoded

某些 API 在提交 POST 请求时需要使用表单数据,因此请务必注意这种从 JavaScript 对象自动转换为表单数据的操作。

HTTP 基本身份验证

HTTP 基本身份验证是最简单的身份验证形式之一,许多 API 都使用此方法。

身份验证是通过将编码的用户名和密码附加到每个请求中的 HTTP 标头来实现的。

HTTP 基本身份验证

构建请求

如需生成经过身份验证的请求,必须执行以下步骤:

  1. 使用英文冒号将用户名和密码连接起来,以便形成口令,例如 username:password
  2. 对口令进行 Base64 编码,例如 username:password 会变为 dXNlcm5hbWU6cGFzc3dvcmQ=
  3. Authorization 标头附加到请求中,格式为 Authorization: Basic <encoded passphrase>

以下代码段展示了如何在 Google Ads 脚本中实现此操作:

const USERNAME = 'your_username';
const PASSWORD = 'your_password';
const API_URL = 'http://<place_api_url_here>';

const authHeader = 'Basic ' + Utilities.base64Encode(USERNAME + ':' + PASSWORD);
const options = {
  headers: {Authorization: authHeader}
}
// Include 'options' object in every request
const response = UrlFetchApp.fetch(API_URL, options);

基本身份验证示例

“代码示例”部分包含两个示例,展示了如何使用 HTTP 基本身份验证:

Plivo

Plivo 是一项服务,可帮助您通过其 API 发送和接收短信。此示例展示了如何发送消息。

  1. Plivo 中注册。
  2. 示例脚本粘贴到 Google Ads 中的新脚本中。
  3. PLIVO_ACCOUNT_AUTHIDPLIVO_ACCOUNT_AUTHTOKEN 值替换为管理信息中心中的值。
  4. 在脚本中插入您的电子邮件地址,以接收错误通知。
  5. 如需使用 Plivo,您必须购买号码或向试用账号添加号码。添加可与试用账号搭配使用的沙盒号码
  6. 添加将显示为发件人的号码和收件人号码。
  7. 将脚本中的 PLIVO_SRC_PHONE_NUMBER 更新为刚刚注册的沙盒号码之一。此电话号码应包含国际国家/地区代码,例如英国电话号码的 447777123456

Twilio

Twilio 是另一种可通过其 API 发送和接收短信的服务。此示例展示了如何发送消息。

  1. Twillio 注册。
  2. 示例脚本粘贴到 Google Ads 中的新脚本中。
  3. TWILIO_ACCOUNT_SIDTWILIO_ACCOUNT_AUTHTOKEN 值替换为账号控制台页面上显示的值。
  4. TWILIO_SRC_PHONE_NUMBER 替换为信息中心中的号码,这是 Twilio 授权用于发送消息的号码。

OAuth 1.0

许多热门服务都使用 OAuth 进行身份验证。OAuth 有多个变种和版本。

HTTP 基本身份验证不同,用户在 OAuth 中只有一个用户名和密码,但 OAuth 允许第三方应用使用特定于该第三方应用的凭据来访问用户的账号和数据。此外,访问权限的范围也将因应用而异。

如需了解 OAuth 1.0 的背景信息,请参阅 OAuth Core 指南。具体而言,请参阅6. 使用 OAuth 进行身份验证。在完整的三方 OAuth 1.0 中,该过程如下所示:

  1. 应用(“使用方”)会获取请求令牌。
  2. 用户授权请求令牌。
  3. 应用将请求令牌换成访问令牌。
  4. 对于所有后续资源请求,访问令牌将在已签名请求中使用。

如果第三方服务要在不与用户互动的情况下使用 OAuth 1.0(例如 Google Ads 脚本所要求的情况),则无法执行第 1、2 和 3 步。因此,某些服务会从其配置控制台发出访问令牌,以允许应用直接进入第 4 步。这称为单方模式 OAuth 1.0。

OAuth1

Google Ads 脚本中的 OAuth 1.0

对于 Google Ads 脚本,每个脚本通常都会被解读为一个应用。通常,您需要通过服务的控制台/管理设置页面执行以下操作:

  • 设置应用配置,以表示脚本。
  • 指定要向脚本授予哪些权限。
  • 获取使用方密钥、使用方密码、访问令牌和访问 Secret,以便与单腿 OAuth 搭配使用。

OAuth 2.0

OAuth 2.0 用于在热门 API 中提供对用户数据的访问权限。给定第三方服务的账号所有者可向特定应用授予权限,以允许这些应用访问用户数据。这样做的好处在于,所有者:

  • 无需与应用分享其账号凭据。
  • 可以单独控制哪些应用可以访问数据以及访问数据的程度。(例如,授予的访问权限可能是只读权限,或者仅限于数据的一部分。)

如需在 Google Ads 脚本中使用支持 OAuth 2.0 的服务,需要完成以下几个步骤:

在脚本之外

授权 Google Ads 脚本通过第三方 API 访问您的用户数据。在大多数情况下,这需要在第三方服务的控制台中设置应用。此应用代表您的 Google Ads 脚本。

您可以指定应为 Google Ads 脚本应用授予哪些访问权限,并且系统通常会为其分配一个客户端 ID。这样,您就可以通过 OAuth 2 控制哪些应用可以访问第三方服务中的数据,以及它们可以查看或修改哪些数据方面。

在脚本中

向远程服务器授权。根据服务器允许的授予类型,您需要遵循一组不同的步骤(称为流程),但所有这些步骤最终都会导致系统发出访问令牌,该令牌将用于该会话的所有后续请求。

发出 API 请求。在每个请求中传递访问令牌

授权流程

每种授予类型和相应的流程都适用于不同的使用场景。例如,当用户参与互动会话时,系统会使用不同的流程,而当应用需要在用户不存在的情况下在后台运行时,则会使用另一种流程。

API 提供方将决定接受哪些授予类型,这将指导用户如何继续集成其 API。

实现

对于所有不同的 OAuth 流程,其目标都是获取访问令牌,以便在会话的其余时间内对请求进行身份验证。

示例库,说明如何针对每种不同的流程类型进行身份验证。这两种方法都会返回一个对象,用于获取和存储访问令牌,并为经过身份验证的请求提供便利。

一般使用模式如下:

// Authenticate using chosen flow type
const urlFetchObj = OAuth2.<flow method>(args);
// Make request(s) using obtained object.
const response1 = urlFetchObj.fetch(url1);
const response2 = urlFetchObj.fetch(url2, options);

客户端凭据授予

客户端凭据授权是 OAuth2 流程的一种较为简单的形式,其中应用会交换应用特有的 ID 和 Secret,以换取限时访问令牌

客户端凭据

// Access token is obtained and cached.
const authUrlFetch = OAuth2.withClientCredentials(
    tokenUrl, clientId, clientSecret, optionalScope));
// Use access token in each request
const response = authUrlFetch.fetch(url);
// ... use response

刷新令牌授予

刷新令牌授予类似于客户端凭据授予,因为向服务器发出简单请求将返回可在会话中使用的访问令牌

刷新令牌

获取刷新令牌

与刷新令牌授予不同,客户端凭据授予所需的详细信息来自应用配置(例如,服务的控制台),而刷新令牌是在更复杂的流程(例如授权码授予)的一部分中授予的,这需要用户互动:

授权代码

使用 OAuth Playground 获取刷新令牌

OAuth2 Playground 提供了一个界面,供用户逐步完成授权代码授予流程以获取刷新令牌。

您可以使用右上角的“设置”按钮来定义要在 OAuth 流程中使用的所有参数,包括:

  • 授权端点:用作授权流程的起点。
  • 令牌端点:与刷新令牌搭配使用,用于获取访问令牌。
  • 客户端 ID 和密钥:应用的凭据。

OAuth Playground

使用脚本获取刷新令牌

刷新令牌生成示例中提供了一种基于脚本的完成流程替代方案。

刷新令牌用法

执行初始授权后,服务可以发出刷新令牌,然后该令牌的使用方式与客户端凭据流程类似。下面给出两个示例:

const authUrlFetch = OAuth2.withRefreshToken(tokenUrl, clientId, clientSecret,
    refreshToken, optionalScope);
const response = authUrlFetch.fetch(url);
// ... use response

Search Ads 360 示例

Search Ads 360 就是一个可与刷新令牌搭配使用的 API 示例。在此示例中,脚本生成并返回报告。如需详细了解可执行的其他操作,请参阅 Search Ads 360 API 参考文档

创建脚本
  1. API 控制台中创建一个新项目,然后按照 DoubleClick 指南中的步骤获取客户端 ID、客户端密钥和刷新令牌,确保您已启用 DoubleClick Search API。
  2. 示例脚本粘贴到 Google Ads 中的新脚本中。
  3. OAuth2 示例库粘贴到代码列表下方。
  4. 修改脚本,使其包含正确的客户端 ID、客户端密钥和刷新令牌值。

Apps Script Execution API 示例

此示例展示了如何使用 Apps Script Execution API 在 Apps Script 中执行函数。这样,您就可以从 Google Ads 脚本调用 Apps 脚本。

创建 Apps 脚本

创建新脚本。以下示例将列出云端硬盘中的 10 个文件:

function listFiles() {
  const limit = 10;
  const files = [];
  const fileIterator = DriveApp.getFiles();
  while (fileIterator.hasNext() && limit) {
    files.push(fileIterator.next().getName());
    limit--;
  }
  return files;
}
配置要执行的 Apps 脚本
  1. 保存脚本。
  2. 依次点击 Resources > Cloud Platform project
  3. 点击项目名称以前往 API 控制台。
  4. 前往 API 和服务
  5. 启用相应的 API,在本例中为 Drive APIApps Script Execution API
  6. 从菜单中的凭据项创建 OAuth 凭据。
  7. 返回脚本,依次选择发布 > 作为 API 可执行文件部署,以发布脚本以供执行。
创建 Google Ads 脚本
  1. 示例脚本粘贴到 Google Ads 中的新脚本中。
  2. 此外,将 OAuth2 示例库粘贴到代码列表下方。
  3. 修改脚本,使其包含正确的客户端 ID、客户端密钥和刷新令牌值。

服务账号

服务账号是上述授予类型的替代方案。

服务账号与上述账号不同,因为它们不用于访问用户数据:在身份验证后,服务账号会代表应用发出请求,而不是以可能拥有项目的用户身份发出请求。例如,如果服务账号使用 Drive API 创建文件,该文件将归服务账号所有,并且默认情况下项目所有者无法访问该文件。

Google Natural Language API 示例

Natural Language API 可对文本执行情感分析实体分析

以下示例展示了如何计算广告文字(包括标题或广告内容描述)的情感。这有助于衡量广告内容的正面程度和影响力:我们销售蛋糕我们销售伦敦最好的蛋糕,哪个更好?立即购买!

设置脚本
  1. API 控制台中创建新项目
  2. 启用 Natural Language API
  3. 为项目启用结算功能。
  4. 创建服务账号。 下载凭据 JSON 文件。
  5. 示例脚本粘贴到 Google Ads 中的新脚本中。
  6. 此外,将 OAuth2 示例库粘贴到代码列表下方。
  7. 替换必要的值:
    • serviceAccount:服务账号的电子邮件地址,例如 xxxxx@yyyy.iam.gserviceaccount.com
    • key:创建服务账号时下载的 JSON 文件中的密钥。注释应以 -----BEGIN PRIVATE KEY... 开头,以 ...END PRIVATE KEY-----\n 结束。

API 响应

API 可以以多种格式返回数据。其中最值得注意的是 XML 和 JSON。

JSON

作为响应格式,JSON 通常比 XML 更易于使用。不过,仍可能会出现一些问题。

回复验证

从 API 调用中成功获取响应后,通常的下一步是使用 JSON.parse 将 JSON 字符串转换为 JavaScript 对象。此时,最好处理解析失败的情况:

const json = response.getContentText();
try {
  const data = JSON.parse(json);
  return data;
} catch(e) {
  // Parsing of JSON failed - handle error.
}

此外,如果 API 不受您控制,请注意响应的结构可能会发生变化,并且属性可能不再存在:

// Less good approach
// Assumes JSON was in form {"queryResponse": ...} when parsed.
const answer = data.queryResponse;

// Better approach
if (data && data.queryResponse) {
  const answer = data.queryResponse;
} else {
  // Format of API response has changed - alert developer or handle accordingly
}

XML

验证

XML 仍然是构建 API 的常用格式。您可以使用 XmlService parse 方法解析来自 API 调用的响应:

const responseText = response.getContentText();
try {
  const document = XmlService.parse(responseText);
} catch(e) {
  // Error in XML representation - handle accordingly.
}

虽然 XmlService.parse 会检测 XML 中的错误并相应地抛出异常,但它无法根据架构验证 XML。

根元素

成功解析 XML 文档后,使用 getRootElement() 方法获取根元素:

const document = XmlService.parse(responseText);
const rootElement = document.getRootElement();

命名空间

在以下示例中,Sportradar API 用于获取所选比赛的足球赛果。XML 响应采用以下格式:

<schedule xmlns="http://feed.elasticstats.com/schema/soccer/sr/v2/matches-schedule.xsd">
  <matches>
     ...
  </matches>
</schedule>

请注意如何在根元素中指定命名空间。因此,您需要:

  • 从文档中提取命名空间属性。
  • 在遍历和访问子元素时使用此命名空间。

以下示例展示了如何访问上述文档代码段中的 <matches> 元素:

const document = XmlService.parse(xmlText);
const scheduleElement = document.getRootElement();
// The namespace is required for accessing child elements in the schema.
const namespace = scheduleElement.getNamespace();
const matchesElement = scheduleElement.getChild('matches', namespace);

获取值

以下是足球赛时间表的示例:

<match status="..." category="..." ... >
  ...
</match>

您可以检索属性,例如:

const status = matchElement.getAttribute('status').getValue();

您可以使用 getText() 读取元素中包含的文本,但如果元素有多个文本子元素,这些文本将会串联起来。如果可能有多个文本子元素,请考虑使用 getChildren() 并迭代每个子元素。

Sportradar 示例

此完整的 Sportradar 示例演示了如何检索足球比赛的详细信息,尤其是英超联赛的比赛。Soccer API 是 Sportradar 提供的众多体育数据 Feed 之一。

设置 Sportradar 账号
  1. 前往 Sportradar 开发者网站
  2. 注册试用账号
  3. 注册后,登录您的账号。
  4. 登录后,前往MyAccount

Sportradar 会将不同的体育赛事划分到不同的 API。例如,您可以购买 Soccer API 的访问权限,但不能购买 Tennis API 的访问权限。您创建的每个应用都可以与不同的体育赛事相关联,并具有不同的键。

  1. 在“应用”下,点击创建新应用。为应用提供名称和说明,并忽略“网站”字段。
  2. 仅选择为“Soccer Trial Europe v2”颁发新密钥
  3. 点击注册应用

成功后,系统应会显示一个包含新 API 密钥的页面。

  1. 示例脚本粘贴到 Google Ads 中的新脚本中。
  2. 将商家信息中的 API 密钥替换为上面获取的密钥,然后修改电子邮件地址字段。

问题排查

在使用第三方 API 时,可能会因多种原因而发生错误,例如:

  • 客户端以 API 不支持的格式向服务器发出请求。
  • 客户期望的响应格式与实际遇到的响应格式不同。
  • 客户端使用无效的令牌或键,或者将值留作占位符。
  • 客户端达到使用限制。
  • 客户端提供无效参数。

在所有这些情况下,以及其他情况下,确定问题原因的第一步是检查导致错误的响应的详细信息。

解析响应

默认情况下,Google Ads 脚本引擎会抛出任何返回错误(状态代码为 400 或更高)的响应。

如需防止此行为并允许检查错误和错误消息,请将可选参数的 muteHttpExceptions 属性设置为 UrlFetchApp.fetch。例如:

const params = {
  muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, params);
if (response.getResponseCode() >= 400) {
  // ... inspect error details...
}

常见状态代码

  • 200 OK 表示成功。如果响应不包含预期数据,请考虑以下几点:

    • 某些 API 允许指定要使用的字段和/或响应格式。如需了解详情,请参阅 API 文档。
    • 一个 API 可以有多个可调用的资源。请参阅相关文档,确定是否应使用其他资源,以及该资源是否会返回您需要的数据。
    • 自编写代码以来,API 可能已发生变化。如需了解详情,请参阅相关文档或与开发者联系。
  • 400 Bad Request 通常表示发送到服务器的请求的格式或结构有误。检查请求并将其与 API 规范进行比较,确保其符合预期。如需详细了解如何检查请求,请参阅检查请求

  • 401 Unauthorized 通常表示在调用 API 时未提供或未成功执行授权。

    • 如果 API 使用基本授权,请确保在请求中构建并提供 Authorization 标头。
    • 如果 API 使用 OAuth 2.0,请确保已获取访问令牌,并将其作为不记名令牌提供。
    • 对于任何其他授权变体,请确保为请求提供必要的凭据。
  • 403 Forbidden 表示用户无权访问请求的资源。

    • 确保已向用户授予必要的权限,例如,在基于文件的请求中向用户授予对文件的访问权限。
  • 404 Not Found 表示请求的资源不存在。

    • 检查用于 API 端点的网址是否正确。
    • 如果提取资源,请检查所引用的资源是否存在(例如,基于文件的 API 是否存在文件)。

检查请求

当 API 响应表明请求格式有误(例如,返回 400 状态代码)时,检查请求会很有用。为了帮助检查请求,UrlFetchApp 提供了与 fetch() 方法配套的方法,称为 getRequest()

此方法不会向服务器发送请求,而是构建本应发送的请求,然后返回该请求。这样,用户就可以检查请求的元素,确保请求看起来正确无误。

例如,如果请求中的表单数据由许多串联在一起的字符串组成,则错误可能出在您创建的用于生成该表单数据的函数中。最简单的形式如下:

const request = UrlFetchApp.getRequest(url, params);
console.log(request);
// Now make the fetch:
const response = UrlFetchApp.fetch(url, params);
// ...

您可以使用该工具检查请求的元素。

记录请求和响应

为了协助检查对第三方 API 的请求和响应的整个过程,以下辅助函数可用作 UrlFetchApp.fetch() 的直接替代项,用于记录请求和响应。

  1. 将代码中的所有 UrlFetchApp.fetch() 实例替换为 logUrlFetch()

  2. 将以下函数添加到脚本的末尾。

    function logUrlFetch(url, opt_params) {
      const params = opt_params || {};
      params.muteHttpExceptions = true;
      const request = UrlFetchApp.getRequest(url, params);
      console.log('Request:       >>> ' + JSON.stringify(request));
      const response = UrlFetchApp.fetch(url, params);
      console.log('Response Code: <<< ' + response.getResponseCode());
      console.log('Response text: <<< ' + response.getContentText());
      if (response.getResponseCode() >= 400) {
        throw Error('Error in response: ' + response);
      }
      return response;
    }
    

执行脚本时,系统会将所有请求和响应的详细信息记录到控制台,以便您更轻松地进行调试。