发出您的第一个 Google Health API 调用

1. 简介

借助 Visual Studio Code (VS Code) 和 Huachao Mao 的 Rest Client 扩展程序,您可以测试 Google OAuth 许可流程和 Google Health API。此 Codelab 将向您展示如何设置 Rest Client 扩展程序、如何启动授权流程以及如何首次调用某个 Google Health API 端点。之后,您可以阅读 Rest Client 文档和 Fitbit 文档,以在 HTTP 项目中构建其他端点。

如果您不想使用 VS Code 和 Rest Client,可以使用 curl 命令进行 API 调用。

学习内容

  • 如何使用 REST 客户端扩展程序设置 VS Code。
  • 如何在 Google Cloud 控制台中设置客户端 ID。
  • 如何完成 Google OAuth 2.0 授权流程以获取访问令牌和刷新令牌。
  • 如何使用 REST 客户端调用 Google Health API 端点。

所需条件

如要设置 Fitbit 移动应用,请执行以下操作:

  1. 在 Apple App Store 或 Google Play 商店中搜索 Fitbit 移动应用,然后下载该应用。
  2. 选择应用图标。
  3. 点击使用 Google 账号登录
  4. 选择您的 Google 账号,然后按继续按钮。

如需安装 Visual Studio 工具,请执行以下操作:

  1. 下载 VS Code。下载内容通常包含可执行文件。
  2. 启动 VS Code。
  3. 安装 Huachao Mao 的 Rest Client 扩展程序。
    • 点击 IDE 左侧的扩展程序图标 扩展程序
    • 搜索 REST Client by Huachao Mao,然后按安装

2. 设置 Google Cloud 项目

您将使用 Google Cloud 控制台创建客户端 ID 并启用 Google Health API 的使用。

  1. 登录 Google Cloud 控制台
  2. 如需创建新项目,请执行以下操作:
    1. 在项目选择器中点击选择项目
    2. 在右上角,选择新建项目
    3. 输入您的项目名称
    4. 输入您的位置(例如,“无组织”)。
    5. 点击创建按钮。
    6. 选择您的项目。

启用 Google Health API

  1. 点击左上角的菜单图标:菜单
  2. 选择 API 和服务 > 库
  3. 搜索“Google Health API”,然后启用该 API。

设置 OAuth 凭据

如果您不在 Google Cloud 控制台中,请前往 Google Cloud 控制台

  1. 点击左上角的菜单图标:菜单
  2. 依次选择 API 和服务 > 凭据
  3. 在顶部中心位置,依次选择 + 创建凭据 > OAuth 客户端 ID
  4. 点击配置权限请求页面按钮。如果系统显示“尚未配置 Google Auth Platform”消息,请点击开始使用按钮。
  5. 在第 1 部分中:
    1. 输入应用名称
    2. 输入用户支持电子邮件地址
    3. 点击下一步按钮。
  6. 在第 2 部分中:
    1. 选择外部
    2. 点击下一步按钮。
  7. 在第 3 部分中:
    1. 联系信息字段中输入您的电子邮件地址。
    2. 点击下一步按钮。
  8. 在第 4 部分中:
    1. 点击复选框,表示您同意 Google 的 API 服务用户数据政策
    2. 点击创建按钮。
  9. 在“指标”部分中,按创建 OAuth 客户端 按钮。
  10. 选择应用类型 Web 应用
  11. 输入客户端 ID 名称
  12. 已获授权的 JavaScript 来源留空。
  13. 已获授权的重定向 URI 下,按 + 添加 URI 按钮。输入“https://www.google.com”作为重定向 URI。
  14. 点击创建按钮。
  15. Google 控制台会显示一条消息,告知您已创建客户端 ID。点击下载 JSON 链接下载客户端 ID 和客户端密钥,或记下这些值。之后您将无法恢复客户的密钥。
  16. 点击确定。系统会返回到“OAuth 2.0 客户端 ID”页面。
  17. 您的客户端 ID 将添加到您的项目中。点击客户端 ID 网址即可查看详细信息。

添加测试用户

  1. 在左侧窗格中,选择受众群体。您应该会看到“发布状态”设置为测试,“用户类型”设置为外部
  2. 在“测试用户”部分下,点击 + 添加用户按钮。输入您要检索其数据的任何用户的电子邮件地址。
  3. 点击保存按钮。

向客户端 ID 添加范围

  1. 在左侧窗格中,选择数据访问权限
  2. 点击添加或移除范围按钮。
  3. 在“API”列中,搜索“Google Health API”。在此 Codelab 中,我们使用的是范围 .../auth/googlehealth.activity_and_fitness.readonly
  4. 选择范围后,按更新按钮返回到“数据访问权限”页面。
  5. 点击保存按钮。

您已完成客户端 ID 的设置。

3. 创建授权流程

  1. 在您的机器上打开 VS Code 应用。
  2. 在欢迎界面上,选择打开
  3. 选择要创建此项目的文件夹,然后按打开。您的屏幕应类似于以下内容,在探索器中显示您的文件夹或项目名称。VSC
  4. 在主菜单中,依次选择文件 -> 新建文本文件
  5. 保存文件并为其命名。在主菜单中,依次选择 File -> Save As -> Codelab.http。这应该会将文件放置在您的项目中。文件的扩展名必须为 .http 或 .rest。在此 Codelab 中,我们使用的是 .http。

在整个项目中,我们将多次使用多个值。这些值包括:

client_id

Google 控制台中的客户端 ID 值。

secret

Google 控制台中的客户端密钥值。

redirect_uri

应用中用于处理授权代码的端点。 在本 Codelab 中,我们使用的是 https://www.google.com

access_token

在同意流程结束后为用户创建的访问令牌。

refresh_token

在意见征求流程结束后为用户创建的刷新令牌。

添加以下代码,用于定义此项目使用的变量。它们应位于 Codelab.http 文件的顶部。填写 client_id 和 secret 的值。

### File Variables for the Codelab
@client_id =
@secret =
@redirect_uri = https://www.google.com
@accessToken={{user.response.body.access_token}}
@refreshToken={{user.response.body.refresh_token}}

授权网址(用于启动意见征求流程)将发送给您要访问其数据的每位用户。为了构建授权网址,我们需要知道 Google OAuth 端点是什么,并使用查询参数来指定客户端 ID、我们想要访问的范围,以及当用户同意这些范围时要将用户重定向到哪里。如需查看有关构建 Google 授权字符串的完整文档,请参阅文档

Google 的 OAuth 2.0 端点位于 https://accounts.google.com/o/oauth2/v2/auth。此端点只能通过 HTTPS 访问。拒绝纯 HTTP 连接。

Google 授权服务器支持许多查询字符串参数,供 Web 服务器应用自定义授权流程。我们将使用以下必需的查询参数:client_idredirect_uriresponse_typescope。该文档提供了所有查询参数及其说明的列表。

查询参数的值为

client_id

Google 控制台中的客户端 ID 值

redirect_uri

应用中用于处理授权代码的端点。 对于此 Codelab,请使用 https://www.google.com

response_type

code(Web 应用支持的值)

scope

范围来自 Google 控制台,语法为 https://www.googleapis.com,后跟范围名称。例如,https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly。

如需请求多个范围,请在 scope 参数中包含所有范围,并以空格分隔(例如 scope1 scope2 scope3)。 当作为网址的一部分时,空格必须采用网址编码(例如 %20)。

在变量之后,按所示方式写入授权网址。在项目顶部定义的参数无法在授权字符串中使用。因此,我们需要包含 client_idredirect_uri 的值。将字符串 client-id 替换为您的客户端 ID。

### Google Health API Rest Client Example

### Authorization String
https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly

用户授予同意权后,Google 会提供一个授权代码,您可以通过调用 Google 的令牌端点来交换该代码以获取访问令牌。在授权字符串下方的 Codelab.http 中添加以下用于调用令牌端点的定义。您将在下一步中将 authorization-code 替换为授权代码。

### AUTHORIZATION ENDPOINTS
######################################################################
# @name user
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

code=authorization-code&client_id={{client_id}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code

@name user 引用您正在访问其数据的当前用户。

4. 授权账号并获取令牌

现在,我们将逐步介绍授权流程,以获取授权令牌。

Codelab.http 中的授权字符串用于启动 Google 基于浏览器的同意流程。Rest Client 扩展程序可能会针对此网址显示发送请求链接。请勿针对此特定网址使用发送请求。您可以将其复制并粘贴到浏览器中,也可以在 VS Code 中使用 Ctrl+点击 (Windows/Linux) 或 Cmd+点击 (Mac) 在默认浏览器中打开该链接。

https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
  1. 系统会要求您登录 Google 账号。您必须使用在添加测试用户部分配置的某个测试用户账号登录。
  2. 系统可能会显示一条消息,指出该应用未经过验证。这是因为该应用尚未发布。按“继续”。

屏幕截图:显示未经验证的应用警告。

  1. 同意页面会列出正在请求的范围。用户可以选择要与此应用共享的任意范围。点击“继续”。

同意共享所请求的范围后,您会被重定向到您指定的 redirect_uri(在此 Codelab 中为 https://www.google.com)。Google 会将授权代码和其他参数附加到 redirect_uri,因此浏览器地址栏中的网址应如下所示:

https://www.google.com/?code=4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly

授权代码是“code=”和“&scope”之间的字母数字值。在上述示例中,该值为:

4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw

在正式版应用中,您的服务器会从网址参数中解析此信息。在此 Codelab 中,请从浏览器中的网址复制授权代码。

现在,将此授权代码兑换为 access_tokenrefresh_token。在 Codelab.http 中,将 POST /token 请求正文中的 authorization-code 替换为您复制的授权代码。

POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

code=authorization-code&client_id={{client_id}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code

点击 POST https://oauth2.googleapis.com/token 这行文字上方的发送请求链接。

响应内容应如下所示:

{
  "access_token": "ya29.a0ATi6K2uasci7FyyIClNLtQou6z...",
  "expires_in": 3599,
  "refresh_token": "1//05EuqYpEXjJCHCgYIA...",
  "scope": "https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly",
  "token_type": "Bearer",
  "refresh_token_expires_in": 604799
}

当您收到此响应时,Rest Client 会自动填充 Codelab.http 顶部定义的 @accessToken@refreshToken 变量,以供后续请求使用。

刷新令牌简介

当您兑换授权代码时,除了 access_token 之外,响应还可能包含 refresh_tokenaccess_token的生命周期较短(通常为 1 小时)。当 access_token 过期时,您必须使用 refresh_token 获取新的 access_token,而无需用户再次登录或同意。之所以能这么做,是因为我们在授权请求中添加了 access_type=offline

如果您在响应中未收到 refresh_token,可能是因为您已为此应用和范围授予同意声明。刷新令牌通常仅在用户首次向您的应用授予同意权限时,或者在授权网址中添加 prompt=consent 以强制显示权限请求页面(即使在后续授权中也是如此)时才会颁发。

refresh_token 的有效期较长,但如果 6 个月未使用、用户撤消了对您应用的访问权限,或出于其他原因,则可能会过期或失效。您应安全地存储 refresh_token 以备将来使用。

如需了解详情,请参阅刷新访问令牌(离线访问)

5. 向 Fitbit 移动应用添加数据

对于 Fitbit 新用户,您的 Fitbit 账号中可能没有可查询的数据。我们将手动添加锻炼日志,然后通过某个端点查询该日志。如需手动记录锻炼,请按以下步骤操作:

  1. 在设备上打开 Fitbit 移动应用。根据需要登录 Fitbit 账号。
  2. 点按屏幕右下角的“+”按钮。
  3. 在“手动记录”部分中,点按活动
  4. 搜索锻炼类型步行,然后选择该类型。
  5. 输入今天的开始时间
  6. 将时长更改为 15 分钟
  7. 将距离保持为 1.0 英里
  8. 点按添加
  9. 长按屏幕并向下滑动,将移动应用与 Fitbit 服务器同步。松开手指后,您应该会看到移动应用开始同步。
  10. 在“活动”部分,您应该会看到手动记录的“步行”条目。显示步行活动的屏幕截图。

6. 使用 list 方法检索数据

如需调用 list 方法,请将以下代码添加到 Codelab.http 中,紧邻 /token 端点下方。

### users.dataTypes.dataPoints
#####################################################

### LIST exercise
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints
Authorization: Bearer {{accessToken}}
Accept: application/json

此代码会调用 list 端点,以显示用户在其 Fitbit 账号中记录的步数。响应中将返回每分钟的步数,与 Fitbit Web API v1 的“活动天内”端点类似。

如需执行调用,请按 GET 端点的发送请求链接。您的响应应如下所示:

{
  "dataPoints": [
    {
      "name": "users/2515055256096816351/dataTypes/exercise/dataPoints/8896720705097069096",
      "dataSource": {
        "recordingMethod": "MANUAL",
        "platform": "FITBIT"
      },
      "exercise": {
        "interval": {
          "startTime": "2026-02-23T13:10:00Z",
          "startUtcOffset": "-18000s",
          "endTime": "2026-02-23T13:25:00Z",
          "endUtcOffset": "-18000s"
        },
        "exerciseType": "WALKING",
        "metricsSummary": {
          "caloriesKcal": 16,
          "distanceMillimiters": 1609344,
          "steps": "2038",
          "averagePaceSecondsPerMeter": 0.55923407301360051,
          "activeZoneMinutes": "0"
        },
        "exerciseMetadata": {},
        "displayName": "Walk",
        "activeDuration": "900s",
        "exerciseEvents": [
          {
            "eventTime": "2026-02-23T13:10:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "START"
          },
          {
            "eventTime": "2026-02-23T13:25:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "STOP"
          }
        ],
        "updateTime": "2026-02-24T01:19:22.450466Z"
      }
    },
    {
      "name": "users/2515055256096816351/dataTypes/exercise/dataPoints/5870930690409355408",
      "dataSource": {
        "recordingMethod": "MANUAL",
        "platform": "FITBIT"
      },
      "exercise": {
        "interval": {
          "startTime": "2026-02-23T06:00:00Z",
          "startUtcOffset": "-18000s",
          "endTime": "2026-02-23T06:15:00Z",
          "endUtcOffset": "-18000s"
        },
        "exerciseType": "WALKING",
        "metricsSummary": {
          "caloriesKcal": 17,
          "distanceMillimiters": 1609344,
          "steps": "2038",
          "averagePaceSecondsPerMeter": 0.55923407301360051,
          "averageHeartRateBeatsPerMinute": "81",
          "activeZoneMinutes": "0",
          "heartRateZoneDurations": {
            "lightTime": "900s"
          }
        },
        "exerciseMetadata": {},
        "displayName": "Walk",
        "activeDuration": "900s",
        "exerciseEvents": [
          {
            "eventTime": "2026-02-23T06:00:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "START"
          },
          {
            "eventTime": "2026-02-23T06:15:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "STOP"
          }
        ],
        "updateTime": "2026-02-23T08:29:39.480437Z"
      }
    }
  ],
  "nextPageToken": ""
}

许多端点都支持用于过滤或分页的查询参数。例如,锻炼支持过滤条件 interval.civil_start_time。向 Codelab.http 添加以下请求,以列出特定时间范围内的锻炼项目:

### LIST exercise >= civil start time
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints?filter=exercise.interval.civil_start_time >= "2026-02-22T00:00:00"
Authorization: Bearer {{accessToken}}
Accept: application/json

7. 恭喜

恭喜!

您已完成此基础 Codelab,并成功学习了如何使用 Visual Studio Code 和 Rest Client 扩展程序来测试 OAuth 2.0 授权并调用 Google Health API 端点。在此处,您可以像在本部分开头使用 List 方法检索数据中所做的那样,添加其他端点。

希望您喜欢构建与 Google Health API 生态系统集成的应用。如需了解详情,请参阅参考文档,探索其他 Google 健康数据 API 端点,并详细了解如何针对网络服务器应用使用 Google OAuth 2.0。