跳到主要内容

Java 服务端集成

安装​

Java 11+。将以下依赖加入 Maven 工程,并把示例保存为 src/main/java/ClassroomExample.java。SDK 传递引入 Gson。

<dependency>
<groupId>com.eduskit</groupId>
<artifactId>server-sdk</artifactId>
<version>0.1.5</version>
</dependency>

Gradle:

implementation 'com.eduskit:server-sdk:0.1.5'

入参为 Map<String, Object>,返回 Gson JsonElement。四参数 ClientConfig 包含 appId;省略 appId 的旧构造器不能完成本地 Token 签发。

创建课堂并签发学生凭证​

先配置服务端环境变量。本例使用独立老师和学生账号,头像 URL 为示例值,实际接入时替换为可访问的资源。每次运行都会创建新课堂;originId 仅使用户注册幂等。

import com.eduskit.sdk.ClientConfig;
import com.eduskit.sdk.Eduskit;
import com.eduskit.sdk.EduskitError;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Map;

public class ClassroomExample {
private static String required(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) throw new IllegalArgumentException("Missing " + name);
return value.trim();
}

public static Map<String, String> createDemoClassroom() {
Eduskit sdk = new Eduskit(new ClientConfig(
required("EDU_SERVER_URL"), required("EDU_APP_ID"),
required("EDU_APP_KEY"), required("EDU_APP_SECRET")
), null);
var teacher = sdk.client().users.register(Map.of(
"originId", "demo-teacher-001", "nickname", "Teacher",
"avatar", "https://example.com/teacher.png"
)).getAsJsonObject();
var student = sdk.client().users.register(Map.of(
"originId", "demo-student-001", "nickname", "Student",
"avatar", "https://example.com/student.png"
)).getAsJsonObject();
String studentId = student.get("eduUserId").getAsString();
var classroom = sdk.client().classrooms.create(Map.<String, Object>of(
"name", "SDK integration",
"startsAt", Instant.now().plus(15, ChronoUnit.MINUTES).toString(),
"durationMinutes", 60,
"teacherEduUserId", teacher.get("eduUserId").getAsString(),
"studentEduUserIds", List.of(studentId),
"joinPolicy", "invite_only"
)).getAsJsonObject();
var token = sdk.client().auth.issueToken(Map.of(
"eduUserId", studentId, "originId", "demo-student-001", "expiresIn", 3600
)).getAsJsonObject();
return Map.of(
"appId", token.get("appId").getAsString(),
"classroomId", classroom.get("classroomId").getAsString(),
"userId", studentId,
"userToken", token.get("accessToken").getAsString(),
"expiresAt", token.get("expiresAt").getAsString()
);
}

public static void main(String[] args) {
try {
var entry = createDemoClassroom();
System.out.println(entry.get("classroomId") + " " + entry.get("userId"));
} catch (EduskitError error) {
System.err.println(error.getErrorCode() + " " + error.getStatus() + " " + error.getTraceId());
System.exit(1);
}
}
}

将返回的 userToken 通过业务进课接口交给已通过鉴权的学生。正式系统在排课时创建课堂,在用户进课时签发 Token。

调用约定​

sdk.client() / sdk.whiteboardClient()。某一侧传 null 表示不配置。需要自定义超时时,使用带 Duration、lang、HttpClient 的完整 ClientConfig 构造器。

成员、权限、课件及上下课方法见课堂 API。白板录制与转码见白板服务端集成。错误与排查说明 HTTP 失败、签名失败和重试边界。

应用业务与租户管理接口​

源码构建的 client 提供 50 个应用凭证 HTTP 路由,包含用户、课堂、课件库、直播素材与诊断。参数与返回结构见应用业务接口,完整流程见业务操作示例。独立的租户管理客户端 使用租户会话管理账号、应用、仪表盘和计费。新增方法需要对应版本的 server-api 与 SDK 源码构建;公开包 0.1.5 不包含这些新增方法。