發出第一個 Google Health API 呼叫

1. 簡介

您可以使用 Visual Studio Code (VS Code) 和 Huachao Mao 的 Rest Client 擴充功能,測試 Google OAuth 同意流程和 Google Health API。本程式碼研究室將說明如何設定 REST 用戶端擴充功能、啟動授權流程,以及首次呼叫其中一個 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 用戶端呼叫 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」,然後按下「Install」

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 驗證平台」訊息,請按一下「開始使用」按鈕。
  5. 第 1 節:
    1. 輸入應用程式名稱
    2. 輸入「使用者支援電子郵件地址」
    3. 按一下 [Next] 按鈕。
  6. 第 2 節:
    1. 選取「外部」
    2. 按一下 [Next] 按鈕。
  7. 在第 3 節中:
    1. 在「聯絡資訊」欄位中輸入電子郵件地址。
    2. 按一下 [Next] 按鈕。
  8. 第 4 節:
    1. 勾選核取方塊,同意《Google API 服務:使用者資料政策》。
    2. 按一下 [建立] 按鈕。
  9. 在指標部分,按下「建立 OAuth 用戶端」按鈕。
  10. 選擇「網頁應用程式」應用程式類型。
  11. 輸入用戶端 ID 名稱
  12. 將「已授權的 JavaScript 來源」留空。
  13. 在「已授權的重新導向 URI」下方,按下「+ 新增 URI」按鈕。輸入「https://www.google.com」做為重新導向 URI。
  14. 按一下 [建立] 按鈕。
  15. Google 控制台會顯示訊息,指出已建立用戶端 ID。按一下「Download JSON」(下載 JSON) 連結,即可下載用戶端 ID 和用戶端密鑰,或記下這些值。之後就無法復原用戶端密鑰。
  16. 按一下「確定」。系統會返回「OAuth 2.0 用戶端 ID」頁面。
  17. 系統會將用戶端 ID 新增至專案。按一下用戶端 ID 網址即可查看詳細資料。

新增測試使用者

  1. 選取左側窗格中的「目標對象」。您應該會看到「發布狀態」設為「測試」,而「使用者類型」設為「外部」
  2. 在「測試使用者」部分下方,按一下「+ 新增使用者」按鈕。輸入要擷取資料的使用者電子郵件地址。
  3. 按一下 [儲存] 按鈕。

為用戶端 ID 新增範圍

  1. 選取左側窗格中的「資料存取權」
  2. 按一下「新增或移除範圍」按鈕。
  3. 在「API」欄中搜尋「Google Health API」。在本程式碼研究室中,我們使用 .../auth/googlehealth.activity_and_fitness.readonly 範圍
  4. 選取範圍後,按下「更新」按鈕返回「資料存取」頁面。
  5. 按一下 [儲存] 按鈕。

您已完成設定用戶端 ID。

3. 建立授權流程

  1. 在電腦上開啟 VS Code 應用程式。
  2. 在「Welcome」畫面上選取「Open」
  3. 選取要建立這個專案的資料夾,然後按一下「開啟」。畫面應與下圖類似,顯示「Explorer」中的資料夾或專案名稱。VSC
  4. 在主選單中,依序選擇「File」->「New Text file」
  5. 儲存檔案並命名。在主選單中,依序選擇「File」->「Save As」->「Codelab.http」。這應該會將檔案放在專案中。檔案的副檔名必須是 .http 或 .rest。在本程式碼研究室中,我們使用的是 .http。

在這個專案中,我們會多次使用多個值。這些值包括:

client_id

Google 控制台中的用戶端 ID 值。

secret

Google 控制台中的用戶端密鑰值。

redirect_uri

應用程式中處理授權碼的端點。在本程式碼研究室中,我們使用的是 https://www.google.com

access_token

同意聲明流程完成後,系統為使用者建立的存取權杖。

refresh_token

同意聲明流程完成後,系統會為使用者建立更新權杖。

新增下列程式碼,定義這個專案使用的變數。這些註解應位於 Codelab.http 檔案的頂端。填入 client_id 和密鑰的值。

### 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 授權伺服器支援多個查詢字串參數,供網路伺服器應用程式自訂授權流程。我們將使用下列必要查詢參數:client_idredirect_uriresponse_typescope。文件中列出所有查詢參數及其說明。

查詢參數的值為

client_id

Google 控制台的用戶端 ID 值

redirect_uri

應用程式中處理授權碼的端點。在本程式碼研究室中,請使用 https://www.google.com

response_type

code (網路應用程式支援的值)

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+Click (Windows/Linux) 或 Cmd+Click (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 (在本程式碼研究室中為 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

在正式版應用程式中,伺服器會從網址參數剖析這項資訊。在本程式碼研究室中,請從瀏覽器的網址複製授權碼。

現在,請將這個授權碼換成 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 第 1 版的 Activity Intraday 端點類似。

如要執行呼叫,請按一下 GET 端點的「Send Request」連結。回應內容大致如下:

{
  "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. 恭喜

恭喜!

您已完成基本程式碼研究室,並成功學會如何使用 Visual Studio Code 和 Rest Client 擴充功能測試 OAuth 2.0 授權,以及呼叫 Google Health API 端點。您可以在這裡新增其他端點,就像本節開頭的使用 List 方法擷取資料一樣。

希望您能順利建構與 Google Health API 生態系統整合的應用程式。如要瞭解詳情,請參閱參考文件中的其他 Google Health API 端點,並進一步瞭解網路伺服器應用程式適用的 Google OAuth 2.0。