控制台管理客户端
业务后端通过 client 和应用凭证调用应用业务接口。本客户端用于租户管理,需要租户登录会话,HTTP 地址为 console-api。
ConsoleClient 提供 88 项控制台管理接口,使用租户登录令牌调用 console-api。当前章节适用于包含 ConsoleClient 的源码构建;公开包 0.1.5 不包含此客户端。
客户端与鉴权
| 客户端 | 服务 | 凭证 | 能力 |
|---|---|---|---|
client | edu server-api | appKey、appSecret;本地签名另需 appId | 用户、课堂、成员、权限、上课码、课件库、直播素材与诊断 |
whiteboardClient | 白板 server-api | 白板应用凭证 | 白板私有房间、录制、截图、转码 |
consoleClient | edu console-api | 租户 accessToken | 应用、账号及全部控制台管理接口 |
baseUrl 是 console-api 的部署入口,不含 /v1。本地服务默认使用 http://localhost:3101。SDK 不自动发现服务地址。accessToken 来自账号登录接口,与课堂用户 Token、白板 Room Token 不通用。
应用内操作把第一个参数 appId 写入 x-app-id。应用管理的 apps.get、apps.updateConfig、apps.updateWebhook 则按接口契约在查询参数或 JSON Body 中传 appId。应用归属由服务端校验。公共登录接口不发送租户令牌;控制台请求不发送应用密钥。
五种语言
示例中的环境变量分别保存 console-api 地址、租户访问令牌和目标应用 ID。配置键按语言习惯命名,HTTP 字段始终使用 camelCase。
Node.js / TypeScript
import { Eduskit } from '@eduskit/server-sdk';
const sdk = new Eduskit({
consoleClient: {
baseUrl: process.env.EDU_CONSOLE_URL!,
accessToken: process.env.EDU_TENANT_ACCESS_TOKEN!,
},
});
const c = sdk.consoleClient;
const apps = await c.apps.list();
const users = await c.users.list(process.env.EDU_APP_ID!, { page: 1, pageSize: 20 });
Python
import os
from eduskit import Eduskit
sdk = Eduskit(console_client={
"base_url": os.environ["EDU_CONSOLE_URL"],
"access_token": os.environ["EDU_TENANT_ACCESS_TOKEN"],
})
c = sdk.console_client
apps = c.apps.list()
users = c.users.list(os.environ["EDU_APP_ID"], page=1, pageSize=20)
Java
import com.eduskit.sdk.ConsoleClient;
import com.eduskit.sdk.ConsoleConfig;
import java.util.Map;
ConsoleClient c = new ConsoleClient(new ConsoleConfig(
System.getenv("EDU_CONSOLE_URL"),
System.getenv("EDU_TENANT_ACCESS_TOKEN")));
var apps = c.apps.list();
var users = c.users.list(System.getenv("EDU_APP_ID"), Map.of("page", 1, "pageSize", 20));
Go
package main
import (
"context"
"log"
"os"
eduskit "github.com/eduskit/server-sdk-go"
)
func main() {
c := eduskit.NewConsoleClient(eduskit.ConsoleConfig{
BaseURL: os.Getenv("EDU_CONSOLE_URL"),
AccessToken: os.Getenv("EDU_TENANT_ACCESS_TOKEN"),
})
var apps []map[string]any
if err := c.Apps.List(context.Background(), &apps); err != nil { log.Fatal(err) }
var users map[string]any
if err := c.Users.List(context.Background(), os.Getenv("EDU_APP_ID"),
map[string]any{"page": 1, "pageSize": 20}, &users); err != nil { log.Fatal(err) }
}
PHP
<?php
require __DIR__ . '/vendor/autoload.php';
$c = new \Eduskit\ConsoleClient([
'baseUrl' => getenv('EDU_CONSOLE_URL'),
'accessToken' => getenv('EDU_TENANT_ACCESS_TOKEN'),
]);
$apps = $c->apps->list();
$users = $c->users->list(getenv('EDU_APP_ID'), ['page' => 1, 'pageSize' => 20]);
会话、响应和错误
auth.refresh({ refreshToken }) 返回新会话,调用方保存新 refreshToken 并用 setAccessToken(session.accessToken) 更新客户端。Python 方法为 set_access_token,Go 为 SetAccessToken。SDK 不自动刷新、持久化会话或重试请求。退出会话后可将客户端令牌设为空字符串。
成功调用返回响应信封中的 data。Go 把结果解码到最后一个 out 参数;传入 nil 可忽略响应。分页字段保留服务端原值。计费积分使用字符串,避免浮点计算丢失精度。
| 错误码 | 含义 |
|---|---|
SDK_CLIENT_NOT_CONFIGURED | 未配置控制台客户端 |
SDK_CONSOLE_TOKEN_REQUIRED | 受保护接口缺少租户访问令牌 |
SDK_CONSOLE_APP_ID_REQUIRED | 应用内接口缺少 appId |
SDK_QUERY_INVALID | 查询参数值不是字符串、数字或布尔值 |
SDK_UPLOAD_FAILED | 对象存储返回非 2xx 状态 |
错误保留 source=console、服务端错误码、HTTP 状态和 traceId。lastTraceId 仅表示共享客户端最近一次响应。业务服务根据错误与操作结果决定是否重试。