存取預覽 API

本頁面說明如何存取 Classroom API 預先發布版功能,並指定預先發布版功能。

與穩定版 v1 API 相比,使用預先發布版功能時,有三個需要考量的事項:

  1. 呼叫的 Google Cloud 專案必須註冊 Google Workspace 開發人員預覽計畫,並列入 Google 的許可清單。
  2. 搶先體驗或搶先體驗方案中的 API 功能不會在標準用戶端程式庫中公開,且可能無法透過 HTTP 預設存取。
  3. 無論何時,在預先發布版中都可能會有多個 API 狀態或版本。

在用戶端程式庫中啟用預先發布版功能

使用用戶端程式庫是使用 Classroom API 的常見做法。用戶端程式庫分為三種類型:

  1. 動態產生的用戶端程式庫
  2. Google 提供的靜態用戶端程式庫
  3. 您自己的自訂用戶端程式庫

建議使用動態產生或 Google 提供的靜態資料庫。如果您需要建構自己的程式庫,請參閱建構用戶端程式庫。建立自訂程式庫不在本指南的範圍內,但您應查看「動態程式庫」一節,瞭解預覽標籤及其在探索中的角色。

動態程式庫

語言等語言的程式庫會使用探索服務中的探索文件,在執行階段產生用戶端程式庫。

探索文件是一種機器可讀取的規格,用於說明及使用 REST API。此文件用於建構用戶端程式庫、IDE 外掛程式,以及與 Google API 互動的其他工具。一項服務可能會提供多份探索文件。

您可在下列端點找到 Classroom API 服務 (classroom.googleapis.com) 的探索文件:

https://classroom.googleapis.com/$discovery/rest?labels=PREVIEW_LABEL&version=v1&key=API_KEY

使用預覽版 API 時,重要的差異在於指定適當的 label。在 Classroom 公開測試版中,該標籤為 DEVELOPER_PREVIEW

如要產生 Python 程式庫並使用預覽方法將 Classroom 服務執行個體化,您可以使用適當的服務、憑證和標籤來指定 Discovery 網址:

classroom_service_with_preview_features = googleapiclient.discovery.build(
  serviceName='classroom',
  version='v1',
  credentials=credentials,
  static_discovery=False,
  discoveryServiceUrl='https://classroom.googleapis.com/$discovery/rest?labels=DEVELOPER_PREVIEW&key=API_KEY)'

如需每種語言的詳細資訊,請參閱個別的 Google API 用戶端程式庫說明文件

靜態資料庫

Java、Node.js、PHP、C# 和 Go 等語言的用戶端程式庫必須從原始碼建構。為您提供這些程式庫,且已納入預先發布版功能。

如需查看 Classroom 用戶端程式庫的公開預覽版,請參閱其他 Workspace 開發人員預覽版計畫用戶端程式庫。如需私人預覽功能,如果您需要產生靜態程式庫,請洽詢您的 Google 聯絡窗口。

您可能需要修改一般依附元件設定來使用這些本機程式庫,而不要匯入沒有預覽功能的標準用戶端程式庫。

舉例來說,如要使用 Go 用戶端程式庫,您需要在 go.mod 檔案中使用 replace 指令,才能需要本機目錄中的模組

module example.com/app

go 1.21.1

require (
    golang.org/x/oauth2 v0.12.0
    google.golang.org/api v0.139.0 // Classroom library is in here.
)

require (
  ...
)

// Use a local copy of the Go client library.
replace google.golang.org/api v0.139.0 => ../google-api-go-client

另外,如果您使用的是 Node.js 和 npm,請在 package.json 中將 Node.js 用戶端程式庫下載項目 (googleapis-classroom-1.0.4.tgz) 新增為本機依附元件:

{
  "name": "nodejs-classroom-example",
  "version": "1.0.0",
  ...
  "dependencies": {
    "@google-cloud/local-auth": "^2.1.0",
    "googleapis": "^95.0.0",
    "classroom-with-preview-features": "file:./googleapis-classroom-1.0.4.tgz"
  }
}

然後,在應用程式中,除了一般依附元件外,還需要 classroom-with-preview-features 模組,並將 classroom 服務從該模組例項化:

const {authenticate} = require('@google-cloud/local-auth');
const {google} = require('googleapis');
const classroomWithPreviewFeatures = require('classroom-with-preview-features');

...

const classroom = classroomWithPreviewFeatures.classroom({
  version: 'v1',
  auth: auth,
});

...

指定預覽版 API 版本

無論您使用的是靜態或動態程式庫,都必須在對具有預覽功能的方法發出 API 呼叫時,指定預覽版本。

如要瞭解不同的可用版本及其具備的功能,請參閱 Classroom API 發展藍圖。此外,方法和欄位的參考說明文件也說明瞭該方法或欄位可用的版本。

如要指定版本,請在要求中設定 PreviewVersion 欄位。舉例來說,如要使用 Rubrics CRUD 預覽版 API 建立評量標準,請在 CREATE 要求中將 previewVersion 設為 V1_20231110_PREVIEW

rubric = service.courses().courseWork().rubrics().create(
            courseId=course_id,
            courseWorkId=coursework_id,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW",
            body=body
).execute()

與預覽方法呼叫相關聯的資源也會將在呼叫中使用的 previewVersion 做為唯讀欄位,協助您瞭解所使用的版本。舉例來說,前述 CREATE 呼叫的回應包含 V1_20231110_PREVIEW 值:

print(json.dumps(rubric, indent=4))
{
  "courseId": "123",
  "courseWorkId": "456",
  "creationTime": "2023-10-23T18:18:29.932Z",
  "updateTime": "2023-10-23T18:18:29.932Z",
  "id": "789",
  "criteria": [...],
  # The preview version used in the call that returned this resource.
  "previewVersion": "V1_20231110_PREVIEW",
  ...
}

HTTP 要求

您也可以透過 HTTP 直接使用 Classroom API。

如果您在沒有用戶端程式庫的情況下提出 HTTP 要求,仍需啟用預覽功能來指定預覽版本。方法是將 label 設為包含 X-Goog-Visibilities 標頭,並將上述預覽版本設為查詢參數或 POST 主體欄位 (請參閱適用的個別 API 參考說明文件)。公開預先發布版的標籤為 DEVELOPER_PREVIEW

舉例來說,下列 curl 要求會向 Rubrics 服務發出 LIST 呼叫,並使用適當的顯示標籤和預覽版本:

curl \
  'https://classroom.googleapis.com/v1/courses/COURSE_ID/courseWork/COURSE_WORK_ID/rubrics?key=API_KEY&previewVersion=V1_20231110_PREVIEW' \
  --header 'X-Goog-Visibilities: DEVELOPER_PREVIEW' \
  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --compressed

您也可以在要求主體中指定預覽版本,例如在提出 POST 要求時:

curl --request PATCH \
  'https://classroom.googleapis.com/v1/courses/COURSE_ID/courseWork/COURSE_WORK_ID/rubrics/RUBRIC_ID?updateMask=criteria&key=API_KEY&previewVersion=V1_20231110_PREVIEW' \
  --header 'X-Goog-Visibilities: DEVELOPER_PREVIEW' \
  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"criteria":"[...]"}' \
  --compressed

REST 說明文件會說明每個 HTTP 要求的 API。

Google Apps Script

您可以透過 Google Apps Script 呼叫預覽版 API。不過,這與一般 Apps Script 用法有些不同。

  1. 您必須設定指令碼,以便使用您在開發人員預覽計畫中註冊的 Google Cloud 專案。
  2. 進階服務不支援預覽方法,因此您必須直接使用 HTTP 提出要求。
  3. 您必須提供標籤和預覽版本,如上文HTTP 專節所述。

請參閱對應的快速入門導覽課程,熟悉 Apps Script 並設定基本專案。接著,請按照下列操作說明開始呼叫預覽版 API:

變更指令碼使用的 Cloud 專案

在「Project Settings」(專案設定) 中,按一下「Change project」(變更專案),然後輸入已註冊至開發人員預覽計畫的任何專案的 Cloud 專案 ID (預設情況下,Apps Script 指令碼會使用一般專案)。只有註冊的專案可以呼叫預覽方法。

設定 HTTP 要求

接著,請在編輯器中設定要回呼的任何方法的 HTTP 要求。例如,在快速入門導覽課程中,運用 Classroom 服務列出課程如下所示:

function listCourses() {
  try {
    const response = Classroom.Courses.list();
    const courses = response.courses;
    if (!courses || courses.length === 0) {
      console.log('No courses found.');
      return;
    }
    for (const course of courses) {
      console.log('%s (%s)', course.name, course.id);
    }
  } catch (err) {
    // TODO: Developer to handle.
    console.log(err.message);
  }
}

直接使用 HTTP 的對應作業如下:

function listCourses() {
  const response = UrlFetchApp.fetch(
        'https://classroom.googleapis.com/v1/courses', {
        method: 'GET',
        headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
        contentType: 'application/json',
      });
  const data = JSON.parse(response.getContentText());
  if (data.error) {
    // TODO: Developer to handle.
    console.log(err.message);
    return;
  }
  if (!data.courses || !data.courses.length) {
    console.log('No courses found.');
    return;
  }
  for (const course of data.courses) {
    console.log('%s (%s)', course.name, course.id);
  }
}

使用進階服務時,系統會推斷必要的 OAuth 範圍,但如要在 Apps Script 中對 Google API 發出直接 HTTP 呼叫,您必須手動新增適當的範圍。

在「專案設定」中,啟用「在編輯器中顯示『appsscript.json』資訊清單檔案」。回到編輯器,針對所需的範圍,將 oauthScopes 新增至 appscript.json 檔案。特定方法的範圍會列在參考頁面中。例如,請參閱 courses.courseWork.rubrics 清單方法頁面

更新後的 appscript.json 檔案可能如下所示:

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/classroom.coursework.students",
    "https://www.googleapis.com/auth/classroom.courses",
    "https://www.googleapis.com/auth/spreadsheets.readonly",
    "https://www.googleapis.com/auth/spreadsheets"
  ]
}

提供標籤和預覽版本

回到指令碼,確認您已按照前述HTTP 部分所述,新增適當的標籤和預覽版本。對評分量表服務發出的 LIST 呼叫範例如下所示:

function listRubrics() {
  const courseId = COURSE_ID;
  const courseWorkId = COURSE_WORK_ID;
  const response = UrlFetchApp.fetch(
         `https://classroom.googleapis.com/v1/courses/${courseId}/courseWork/${courseWorkId}/rubrics?previewVersion=V1_20231110_PREVIEW`, {
        method: 'GET',
        headers: {
          'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
          'X-Goog-Visibilities': 'DEVELOPER_PREVIEW'
        },
        contentType: 'application/json',
        muteHttpExceptions: true
      });
  const data = JSON.parse(response.getContentText());
  console.log(data)
  if (data.error) {
    // TODO: Developer to handle.
    console.log(error.message);
    return;
  }
  if (!data.rubrics || !data.rubrics.length) {
    console.log('No rubrics for this coursework!');
    return;
  }
  console.log(data.rubrics);
}