Routing

Kelola URL, metode HTTP, parameter dinamis, dan middleware untuk REST API NusaScript.

Dasar Routing

Routing adalah proses mengarahkan permintaan HTTP ke handler yang sesuai berdasarkan metode dan path URL.

Contoh
buat app = server_baru(8080)

// GET /                    → halaman utama
// POST /api/data           → simpan data
// GET /api/data            → ambil semua data
// DELETE /api/data         → hapus data

tambah_rute(app, "GET", "/", fungsi(req) {
    kembalikan "Selamat datang di API NusaScript!"
})

tambah_rute(app, "GET", "/api/data", fungsi(req) {
    kembalikan ke_json(["item1", "item2", "item3"])
})

tambah_rute(app, "POST", "/api/data", fungsi(req) {
    kembalikan ke_json({"status": "disimpan"})
})

tambah_rute(app, "DELETE", "/api/data", fungsi(req) {
    kembalikan ke_json({"status": "dihapus"})
})

jalankan_server(app)

Metode HTTP yang Didukung

MetodeKegunaanContoh URL
GETAmbil data/api/pengguna
POSTBuat data baru/api/pengguna
PUTUpdate data lengkap/api/pengguna
PATCHUpdate sebagian data/api/pengguna
DELETEHapus data/api/pengguna

Query Parameter

Ambil parameter dari URL query string (?kunci=nilai) menggunakan param_query(req, "nama").

Contoh
// URL: GET /api/pengguna?halaman=2&per_halaman=10
tambah_rute(app, "GET", "/api/pengguna", fungsi(req) {
    buat halaman     = param_query(req, "halaman")
    buat per_halaman = param_query(req, "per_halaman")

    // Nilai default jika parameter kosong
    jika halaman == "" {
        halaman = "1"
    }
    jika per_halaman == "" {
        per_halaman = "20"
    }

    kembalikan ke_json({
        "halaman"     : ke_bilangan(halaman),
        "per_halaman" : ke_bilangan(per_halaman),
        "data"        : []
    })
})
Response JSON
{
  "halaman": 2,
  "per_halaman": 10,
  "data": []
}

Membaca Body Request (POST/PUT)

Baca body JSON dari request menggunakan body_json(req).

Contoh
tambah_rute(app, "POST", "/api/produk", fungsi(req) {
    buat body = body_json(req)

    buat nama  = ambil(body, "nama")
    buat harga = ambil(body, "harga")
    buat stok  = ambil(body, "stok")

    // Validasi data
    jika nama == nihil atau nama == "" {
        kembalikan ke_json({"error": "Nama produk wajib diisi"})
    }
    jika harga == nihil {
        kembalikan ke_json({"error": "Harga produk wajib diisi"})
    }

    kembalikan ke_json({
        "sukses" : benar,
        "pesan"  : "Produk " + nama + " berhasil ditambahkan",
        "data"   : {
            "nama"  : nama,
            "harga" : harga,
            "stok"  : stok
        }
    })
})

Pattern CRUD Lengkap

Contoh pengelolaan endpoint CRUD untuk resource produk.

Contoh — CRUD Produk
buat app = server_baru(3000)
buat db  = db_buka("sqlite", "toko.db")

// Inisialisasi tabel
db_query(db, "CREATE TABLE IF NOT EXISTS produk (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    nama    TEXT    NOT NULL,
    harga   REAL    NOT NULL,
    stok    INTEGER DEFAULT 0
)")

// [C] CREATE — Tambah produk
tambah_rute(app, "POST", "/api/produk", fungsi(req) {
    buat b     = body_json(req)
    buat nama  = ambil(b, "nama")
    buat harga = ambil(b, "harga")
    buat stok  = ambil(b, "stok")

    db_query(db, "INSERT INTO produk (nama, harga, stok) VALUES (?, ?, ?)",
        nama, harga, stok)

    kembalikan ke_json({"sukses": benar, "pesan": "Produk ditambahkan"})
})

// [R] READ — Ambil semua produk
tambah_rute(app, "GET", "/api/produk", fungsi(req) {
    buat data = db_ambil_semua(db, "SELECT * FROM produk")
    kembalikan ke_json(data)
})

// [U] UPDATE — Update produk berdasarkan id
tambah_rute(app, "PUT", "/api/produk", fungsi(req) {
    buat b     = body_json(req)
    buat id    = ambil(b, "id")
    buat nama  = ambil(b, "nama")
    buat harga = ambil(b, "harga")

    db_query(db, "UPDATE produk SET nama=?, harga=? WHERE id=?",
        nama, harga, id)

    kembalikan ke_json({"sukses": benar, "pesan": "Produk diperbarui"})
})

// [D] DELETE — Hapus produk
tambah_rute(app, "DELETE", "/api/produk", fungsi(req) {
    buat b  = body_json(req)
    buat id = ambil(b, "id")

    db_query(db, "DELETE FROM produk WHERE id=?", id)
    kembalikan ke_json({"sukses": benar, "pesan": "Produk dihapus"})
})

jalankan_server(app)

Membaca Header Request

Contoh
tambah_rute(app, "GET", "/api/profil", fungsi(req) {
    // Baca header Authorization
    buat token = header_req(req, "Authorization")

    jika token == "" {
        kembalikan ke_json({"error": "Token diperlukan"})
    }

    // Verifikasi token JWT
    buat klaim = jwt_verifikasi(token, "rahasia-saya")
    jika klaim == nihil {
        kembalikan ke_json({"error": "Token tidak valid"})
    }

    kembalikan ke_json({
        "id"    : ambil(klaim, "id"),
        "email" : ambil(klaim, "email")
    })
})

Routing Berdasarkan Metode Request

Gunakan metode_req(req) untuk mendapatkan metode HTTP dari request.

Contoh
tambah_rute(app, "GET", "/info", fungsi(req) {
    buat metode = metode_req(req)
    buat path   = path_req(req)
    buat ip     = header_req(req, "X-Forwarded-For")

    kembalikan ke_json({
        "metode" : metode,
        "path"   : path,
        "ip"     : ip
    })
})

Referensi Fungsi Routing

FungsiParameterKeterangan
server_baru(port)port: bilanganBuat server HTTP baru
tambah_rute(app, metode, path, fn)Daftarkan rute
jalankan_server(app)Mulai server (blocking)
param_query(req, nama)nama: teksBaca query parameter
body_json(req)Parse body JSON ke peta
header_req(req, nama)nama: teksBaca header HTTP
metode_req(req)Ambil metode HTTP (GET/POST/dll)
path_req(req)Ambil path URL
📌 NusaScript menggunakan model routing eksplisit. Setiap kombinasi metode + path yang berbeda harus didaftarkan secara terpisah menggunakan tambah_rute().