Bagikan melalui


Panduan Cepat: Menyiapkan dan Menggunakan Data Katalog API Platform Microsoft Learn

Dalam Mulai Cepat ini, Anda mempelajari cara menyiapkan dan menjalankan MICROSOFT Learn Platform API, yang mencakup contoh untuk mengambil kursus, jalur pembelajaran, modul, dan sertifikasi.

Prasyarat

Sebelum memulai, pastikan Anda telah menginstal hal berikut:

  • Node.js (versi 18.0.0 atau lebih tinggi)

    • Node.js adalah runtime JavaScript yang memungkinkan Anda menjalankan kode JavaScript/TypeScript di luar browser web. Diperlukan untuk menjalankan contoh skrip dan mengelola paket melalui npm (Node Package Manager).
    • Unduh dari: https://nodejs.org/
    • Memverifikasi penginstalan.
  • Azure CLI

    • Azure Command-Line Interface (CLI) adalah alat untuk mengelola sumber daya Azure dari baris perintah. Dalam panduan ini, ini digunakan untuk mengautentikasi identitas Anda sehingga contoh dapat mengakses Learn Platform API atas nama Anda.
    • Unduh dari: https://docs.microsoft.com/cli/azure/install-azure-cli
    • Memverifikasi penginstalan.
  • Akun Azure

    • Akun Azure dengan langganan aktif diperlukan untuk mengautentikasi dan mengakses API Platform Microsoft Learn. API menggunakan ID Microsoft Entra (sebelumnya Azure Active Directory) untuk autentikasi, yang memerlukan kredensial Azure yang valid. Tidak ada biaya untuk mengambil token autentikasi dari langganan Azure Anda.
    • Anda memerlukan langganan Azure aktif
    • Daftar di: https://azure.microsoft.com/free/
  • Visual Studio Code (opsional)

    • Visual Studio Code (kode VS) adalah editor kode gratis dan ringan dengan dukungan terminal, IntelliSense, dan TypeScript terintegrasi. Meskipun Anda dapat menggunakan editor teks dan terminal apa pun, Visual Studio Code memberikan pengalaman yang disederhanakan untuk menjalankan contoh ini.
    • Unduh dari: https://code.visualstudio.com/
    • Verifikasi penginstalan: Buka Visual Studio Code dan tekan Ctrl+' untuk membuka terminal terintegrasi

Nota

Semua perintah yang ditulis di bawah ini harus dijalankan di terminal Git Bash. Anda dapat menggunakan terminal terintegrasi VS Code (tekan Ctrl+`), Windows PowerShell, atau Command Prompt.

Menyiapkan proyek

Ikuti langkah-langkah ini untuk membuat proyek baru dan menginstal dependensi yang diperlukan.

  1. Buat folder baru untuk proyek Anda dan navigasikan ke folder tersebut.

    mkdir learn-api-examples
    cd learn-api-examples
    
  2. Menginisialisasi proyek Node.js baru dengan pengaturan default. Bendera -y secara otomatis menerima semua default.

    npm init -y
    
  3. Instal paket npm yang diperlukan (@azure/identity untuk autentikasi, tsx untuk menjalankan TypeScript secara langsung, typescript kompilator, dan @types/node untuk definisi jenis).

    npm install @azure/identity tsx typescript @types/node
    
  4. Buat file baru yang disebut examples.ts dan tempel kode di bawah ini. Ini termasuk autentikasi yang memanfaatkan Kredensial Default Azure dan beberapa contoh kemampuan katalog yang tersedia melalui Learn Platform API.

    /**
     * Microsoft Learn Platform API Examples
     * API Version: 2023-11-01-preview
     * Base URL: https://learn.microsoft.com/api/v1
     *
     * Authentication: OAuth2 with scope https://learn.microsoft.com/.default
     */
    
    import { DefaultAzureCredential } from "@azure/identity";
    
    const API_BASE_URL = "https://learn.microsoft.com/api/v1";
    const API_VERSION = "2023-11-01-preview";
    
    // ============================================================================
    // AUTHENTICATION HELPER
    // ============================================================================
    
    async function getAccessToken(): Promise<string> {
      const credential = new DefaultAzureCredential();
      const token = await credential.getToken("https://learn.microsoft.com/.default");
      return token.token;
    }
    
    /**
     * Helper to handle API response with error checking
     */
    async function handleResponse(response: Response, label: string): Promise<void> {
      if (!response.ok) {
        const text = await response.text();
        console.log(`${label} Error: ${response.status} ${response.statusText}`);
        console.log("Response:", text || "(empty)");
        return;
      }
    
      const text = await response.text();
      if (!text) {
        console.log(`${label}: (empty response)`);
        return;
      }
    
      try {
        const data = JSON.parse(text);
        console.log(`${label}:`, JSON.stringify(data, null, 2));
      } catch (e) {
        console.log(`${label} Parse Error: Invalid JSON`);
        console.log("Raw response:", text.substring(0, 500));
      }
    }
    
    // ============================================================================
    // TRAINING ENDPOINTS
    // ============================================================================
    
    /**
     * List all courses with optional filters
     * GET /courses
     */
    async function listCourses(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/courses?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Courses");
    }
    
    /**
     * Get a specific course by ID
     * GET /courses/{id}
     */
    async function getCourse(courseId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/courses/${courseId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Course");
    }
    
    /**
     * List all learning paths
     * GET /learning-paths
     */
    async function listLearningPaths(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      subjects?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.subjects) params.append("subjects", options.subjects.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/learning-paths?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Learning Paths");
    }
    
    /**
     * Get a specific learning path by ID
     * GET /learning-paths/{id}
     */
    async function getLearningPath(learningPathId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/learning-paths/${learningPathId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Learning Path");
    }
    
    /**
     * List all modules
     * GET /modules
     */
    async function listModules(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      subjects?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.subjects) params.append("subjects", options.subjects.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/modules?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Modules");
    }
    
    /**
     * Get a specific module by ID
     * GET /modules/{id}
     */
    async function getModule(moduleId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/modules/${moduleId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Module");
    }
    
    /**
     * Get a specific unit by ID
     * GET /units/{id}
     */
    async function getUnit(unitId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/units/${unitId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Unit");
    }
    
    // ============================================================================
    // CREDENTIALS ENDPOINTS
    // ============================================================================
    
    /**
     * List all certifications
     * GET /certifications
     */
    async function listCertifications(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      subjects?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.subjects) params.append("subjects", options.subjects.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/certifications?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Certifications");
    }
    
    /**
     * Get a specific certification by ID
     * GET /certifications/{id}
     */
    async function getCertification(certificationId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/certifications/${certificationId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Certification");
    }
    
    /**
     * List all exams
     * GET /exams
     */
    async function listExams(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/exams?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Exams");
    }
    
    /**
     * Get a specific exam by ID
     * GET /exams/{id}
     */
    async function getExam(examId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/exams/${examId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Exam");
    }
    
    /**
     * List all applied skills
     * GET /applied-skills
     */
    async function listAppliedSkills(options?: {
      levels?: string[];
      roles?: string[];
      products?: string[];
      subjects?: string[];
      locale?: string;
      maxpagesize?: number;
    }): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (options?.levels) params.append("levels", options.levels.join(","));
      if (options?.roles) params.append("roles", options.roles.join(","));
      if (options?.products) params.append("products", options.products.join(","));
      if (options?.subjects) params.append("subjects", options.subjects.join(","));
      if (options?.locale) params.append("locale", options.locale);
      if (options?.maxpagesize) params.append("maxpagesize", options.maxpagesize.toString());
    
      const response = await fetch(`${API_BASE_URL}/applied-skills?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Applied Skills");
    }
    
    /**
     * Get a specific applied skill by ID
     * GET /applied-skills/{id}
     */
    async function getAppliedSkill(appliedSkillId: string, locale?: string): Promise<void> {
      const token = await getAccessToken();
    
      const params = new URLSearchParams({ "api-version": API_VERSION });
      if (locale) params.append("locale", locale);
    
      const response = await fetch(`${API_BASE_URL}/applied-skills/${appliedSkillId}?${params}`, {
        method: "GET",
        headers: {
          "Accept": "application/json",
          "Authorization": `Bearer ${token}`
        }
      });
    
      await handleResponse(response, "Applied Skill");
    }
    
    // ============================================================================
    // PAGINATION HELPER
    // ============================================================================
    
    /**
     * Helper to handle paginated responses
     */
    async function fetchAllPages<T>(initialUrl: string, token: string): Promise<T[]> {
      const allItems: T[] = [];
      let nextLink: string | undefined = initialUrl;
    
      while (nextLink) {
        const response = await fetch(nextLink, {
          method: "GET",
          headers: {
            "Accept": "application/json",
            "Authorization": `Bearer ${token}`
          }
        });
    
        const data = await response.json();
        allItems.push(...data.value);
        nextLink = data.nextLink;
      }
    
      return allItems;
    }
    
    // ============================================================================
    // EXAMPLE USAGE
    // ============================================================================
    
    async function main() {
      try {
        // List beginner-level certifications for Azure
        console.log("=== Listing Azure certifications (beginner level) ===");
        await listCertifications({
          levels: ["beginner"],
          products: ["azure"],
          maxpagesize: 5
        });
    
        // List certifications
        console.log("\n=== Listing certifications ===");
        await listCertifications({ maxpagesize: 5 });
    
        // List all Spanish learning paths
        console.log("\n=== Listing Spanish learning paths ===");
        await listLearningPaths({ locale: "es-es", maxpagesize: 5 });
    
        // Get a specific learning path by ID
        console.log("\n=== Getting learning path: learn.introduction-ai-azure ===");
        await getLearningPath("learn.introduction-ai-azure");
    
        // Get a specific module by ID
        console.log("\n=== Getting module: learn.wwl.fundamentals-generative-ai ===");
        await getModule("learn.wwl.fundamentals-generative-ai");
    
        // Get a specific unit by ID
        console.log("\n=== Getting unit: learn.wwl.fundamentals-generative-ai.agents ===");
        await getUnit("learn.wwl.fundamentals-generative-ai.agents");
    
        // Get a specific applied skill by ID
        console.log("\n=== Getting applied skill: applied-skill.deploy-and-configure-azure-monitor ===");
        await getAppliedSkill("applied-skill.deploy-and-configure-azure-monitor");
    
        // Get a specific certification by ID
        console.log("\n=== Getting certification: certification.d365-functional-consultant-customer-service ===");
        await getCertification("certification.d365-functional-consultant-customer-service");
    
        // Get a specific exam by ID
        console.log("\n=== Getting exam: exam.77-881 ===");
        await getExam("exam.77-881");
    
        // Get a specific instructor-led course by ID
        console.log("\n=== Getting instructor-led course: course.ai-900t00 ===");
        await getCourse("course.ai-900t00");
    
      } catch (error) {
        console.error("Error:", error);
      }
    }
    
    main();
    
    

Mengautentikasi dan menjalankan contoh

Ikuti langkah-langkah ini untuk mengautentikasi dengan Azure dan menjalankan kode contoh.

  1. Masuk ke Azure CLI. Langkah ini membuka jendela browser tempat Anda memasukkan kredensial Azure Anda.

    az login
    
  2. Jika Anda memiliki beberapa langganan, atur langganan aktif. Ganti <your-subscription-name> dengan nama langganan atau ID Anda.

    az account set --subscription "<your-subscription-name>"
    
  3. Verifikasi kredensial Anda dapat mengakses Learn Platform API.

    az account get-access-token --resource https://learn.microsoft.com
    

    Jika berhasil, Anda akan melihat respons JSON dengan bidang accessToken .

  4. Jalankan file contoh menggunakan npx untuk menjalankan tsx paket.

    npx tsx examples.ts
    
  5. (Opsional) Simpan output ke file menggunakan pengalihan output.

    npx tsx examples.ts > output.txt 2>&1
    

Membersihkan sumber daya

Jika Anda tidak lagi memerlukan sumber daya yang dibuat dalam panduan cepat ini, Anda dapat menghapusnya.

  1. Hapus folder proyek dan semua isinya.

    cd ..
    rm -rf learn-api-examples
    

    Di Windows PowerShell, gunakan:

    cd ..
    Remove-Item -Recurse -Force learn-api-examples
    
  2. (Opsional) Keluar dari Azure CLI untuk menghapus kredensial cache.

    az logout
    

Nota

Mulai cepat ini tidak membuat sumber daya Azure apa pun yang dikenakan biaya. Panggilan API hanya menggunakan identitas Azure yang ada untuk autentikasi.