Request & Response
Memahami struktur request HTTP yang masuk dan cara mengirim response yang tepat dari handler NusaScript.
Objek Request
Setiap handler menerima satu argumen req yang merupakan objek request HTTP. Dari sinilah Anda bisa mengakses semua informasi tentang permintaan yang masuk.
| Properti/Fungsi | Tipe | Deskripsi |
|---|---|---|
metode_req(req) | teks | Metode HTTP: "GET", "POST", dst. |
path_req(req) | teks | Path URL: "/api/pengguna" |
param_query(req, k) | teks | Nilai query parameter |
body_json(req) | peta | Body JSON diparsing ke peta |
body_teks(req) | teks | Body request sebagai teks mentah |
header_req(req, k) | teks | Nilai header HTTP tertentu |
Membaca Data dari Request
Contoh — Semua Cara Baca Request
tambah_rute(app, "POST", "/api/contoh", fungsi(req) {
// 1. Metode HTTP
buat metode = metode_req(req)
tampilkan("Metode:", metode) // POST
// 2. Path URL
buat path = path_req(req)
tampilkan("Path:", path) // /api/contoh
// 3. Query parameter (?versi=2)
buat versi = param_query(req, "versi")
tampilkan("Versi:", versi) // 2
// 4. Header
buat auth = header_req(req, "Authorization")
buat konten = header_req(req, "Content-Type")
tampilkan("Auth:", auth)
tampilkan("Content-Type:", konten)
// 5. Body JSON
buat body = body_json(req)
buat nama = ambil(body, "nama")
buat email = ambil(body, "email")
tampilkan("Nama:", nama, "Email:", email)
kembalikan ke_json({"ok": benar})
})
Jenis Response
Handler bisa mengembalikan berbagai jenis nilai. NusaScript akan otomatis mengatur Content-Type yang sesuai.
Response JSON (Paling Umum)
Contoh
tambah_rute(app, "GET", "/api/pengguna", fungsi(req) {
// Kembalikan objek JSON
kembalikan ke_json({
"id" : 1,
"nama" : "Budi Santoso",
"email" : "budi@example.com",
"aktif" : benar
})
})
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"nama": "Budi Santoso",
"email": "budi@example.com",
"aktif": true
}Response Array JSON
Contoh
tambah_rute(app, "GET", "/api/kota", fungsi(req) {
buat kota = ["Jakarta", "Surabaya", "Bandung", "Medan", "Makassar"]
kembalikan ke_json(kota)
})
HTTP Response
["Jakarta","Surabaya","Bandung","Medan","Makassar"]
Response Teks Biasa
Contoh
tambah_rute(app, "GET", "/ping", fungsi(req) {
kembalikan "pong"
})
HTTP Response
HTTP/1.1 200 OK Content-Type: text/plain pong
Response dengan Status Error
Untuk mengembalikan respons error, gunakan format JSON standar dengan field error.
Contoh — Validasi & Error Response
tambah_rute(app, "POST", "/api/login", fungsi(req) {
buat body = body_json(req)
buat email = ambil(body, "email")
buat sandi = ambil(body, "sandi")
// Validasi field wajib
jika email == nihil atau email == "" {
kembalikan ke_json({"error": "Email wajib diisi"})
}
jika sandi == nihil atau panjang(sandi) < 6 {
kembalikan ke_json({"error": "Sandi minimal 6 karakter"})
}
// Cek ke database
buat db = db_buka("sqlite", "app.db")
buat rows = db_ambil_semua(db,
"SELECT id, nama, sandi_hash FROM pengguna WHERE email=?", email)
jika panjang(rows) == 0 {
kembalikan ke_json({"error": "Email tidak ditemukan"})
}
buat user = rows[0]
buat sandi_hash = ambil(user, "sandi_hash")
jika !verifikasi_sandi(sandi, sandi_hash) {
kembalikan ke_json({"error": "Sandi salah"})
}
// Login berhasil — buat token JWT
buat token = jwt_buat({"id": ambil(user, "id"), "email": email}, "rahasia", 86400)
kembalikan ke_json({
"sukses" : benar,
"token" : token,
"nama" : ambil(user, "nama")
})
})
Contoh Response Sukses
{
"sukses": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"nama": "Budi Santoso"
}Pola Response API Standar
Gunakan pola response konsisten di semua endpoint agar mudah dikonsumsi oleh frontend.
Contoh — Response Wrapper
// Fungsi helper untuk response sukses
fungsi resp_ok(data, pesan) {
kembalikan ke_json({
"sukses" : benar,
"pesan" : pesan,
"data" : data
})
}
// Fungsi helper untuk response error
fungsi resp_error(pesan) {
kembalikan ke_json({
"sukses" : salah,
"pesan" : pesan,
"data" : nihil
})
}
// Gunakan di handler
tambah_rute(app, "GET", "/api/produk", fungsi(req) {
buat db = db_buka("sqlite", "toko.db")
buat data = db_ambil_semua(db, "SELECT * FROM produk")
kembalikan resp_ok(data, "Data berhasil diambil")
})
tambah_rute(app, "DELETE", "/api/produk", fungsi(req) {
buat b = body_json(req)
buat id = ambil(b, "id")
jika id == nihil {
kembalikan resp_error("ID produk wajib diisi")
}
buat db = db_buka("sqlite", "toko.db")
db_query(db, "DELETE FROM produk WHERE id=?", id)
kembalikan resp_ok(nihil, "Produk berhasil dihapus")
})
Response Sukses
{
"sukses": true,
"pesan": "Data berhasil diambil",
"data": [...]
}Middleware — Autentikasi JWT Global
Gunakan fungsi helper yang dipanggil di awal setiap handler untuk memvalidasi token secara konsisten.
Contoh — Middleware Auth Manual
tetap RAHASIA_JWT = "kunci-rahasia-sangat-panjang"
// Fungsi middleware — periksa token JWT
fungsi wajib_login(req) {
buat token = header_req(req, "Authorization")
jika token == "" {
kembalikan nihil
}
// Hapus prefix "Bearer "
jika muat(token, "Bearer ") {
token = potong(token, 7)
}
kembalikan jwt_verifikasi(token, RAHASIA_JWT)
}
// Gunakan di handler yang butuh autentikasi
tambah_rute(app, "GET", "/api/profil", fungsi(req) {
buat klaim = wajib_login(req)
jika klaim == nihil {
kembalikan ke_json({"error": "Akses ditolak. Token tidak valid."})
}
buat user_id = ambil(klaim, "id")
buat db = db_buka("sqlite", "app.db")
buat rows = db_ambil_semua(db,
"SELECT id, nama, email FROM pengguna WHERE id=?", user_id)
jika panjang(rows) == 0 {
kembalikan ke_json({"error": "Pengguna tidak ditemukan"})
}
kembalikan ke_json(rows[0])
})
📌 Tip: Selalu gunakan
ke_json() saat mengembalikan data dari handler agar response dikirim sebagai JSON yang valid, bukan sebagai teks biasa.