发出您的第一个 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 Client 扩展程序设置 VS Code。
  • 如何在 Google Cloud 控制台中设置客户端 ID。
  • 如何完成 Google OAuth 2.0 授权流程以获取访问令牌和刷新令牌。
  • 如何使用 Rest Client 调用 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”并启用它。

设置 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. 保存文件以命名。在主菜单中,依次选择文件 -> 另存为 -> 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。

如需请求多个授权范围,请在授权范围参数中包含所有授权范围,并以空格分隔(例如,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={{clientId}}&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",
  "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 Activity Intraday 端点。

如需执行调用,请按 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 Health API 端点,并详细了解针对 Web 服务器应用的 Google OAuth 2.0。