import java.net.URI; import java.net.URLEncoder; import java.net.http.*; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Base64; class SessionResult { static String required(String name) { String value = System.getenv(name); if (value == null || value.isEmpty()) throw new IllegalArgumentException("Set " + name); return value; } static String quote(String value) { StringBuilder result = new StringBuilder("\""); for (char c : value.toCharArray()) { if (c == '"' || c == '\\') result.append('\\').append(c); else if (c < 32) result.append(String.format("\\u%04x", (int)c)); else result.append(c); } return result.append('"').toString(); } public static void main(String[] args) throws Exception { String authorization = "Basic " + Base64.getEncoder().encodeToString( (required("SCORMBOX_API_KEY") + ":" + required("SCORMBOX_API_SECRET")).getBytes(StandardCharsets.UTF_8)); String course_path = "https://scormbox.com/api/v1/courses/" + URLEncoder.encode(required("SCORMBOX_COURSE_ID"), StandardCharsets.UTF_8); String email = required("SCORMBOX_LEARNER_EMAIL"); String payload = "{\"user\":{\"name\":" + quote(required("SCORMBOX_LEARNER_NAME")) + ",\"email\":" + quote(email) + "},\"origin\":" + quote(required("SCORMBOX_ORIGIN")) + ",\"attempt_mode\":\"resume\"}"; HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(20)) .followRedirects(HttpClient.Redirect.NEVER).build(); HttpRequest create = HttpRequest.newBuilder(URI.create(course_path + "/sessions")) .timeout(Duration.ofSeconds(20)).header("Authorization", authorization) .header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(payload)).build(); HttpResponse session = client.send(create, HttpResponse.BodyHandlers.ofString()); if (session.statusCode() < 200 || session.statusCode() >= 300) throw new IllegalStateException("SCORMBox HTTP " + session.statusCode()); // Deliver only the parsed launch_token to this learner's authorized browser page; do not log session.body(). HttpRequest read = HttpRequest.newBuilder(URI.create(course_path + "/results?email=" + URLEncoder.encode(email, StandardCharsets.UTF_8))).timeout(Duration.ofSeconds(20)) .header("Authorization", authorization).GET().build(); HttpResponse result = client.send(read, HttpResponse.BodyHandlers.ofString()); if (result.statusCode() < 200 || result.statusCode() >= 300) throw new IllegalStateException("SCORMBox HTTP " + result.statusCode()); System.out.println(result.body()); } }