API tidak resmi (unofficial) berbasis Node.js untuk mendapatkan definisi kata dan daftar indeks dari kamus online BASAbaliWiki. API ini dibangun dengan melakukan web scraping secara real-time ke situs sumber.
- ✅ Definisi Kata Lengkap: Ambil detail definisi, tingkatan bahasa (
sor-singgih), dialek, dan contoh kalimat. - ✅ Indeks Kata A-Z: Dapatkan daftar kata berdasarkan huruf awal.
- ✅ Arsitektur Bersih: Dibangun dengan pola desain berlapis (Routes, Controllers, Services) untuk kemudahan pemeliharaan.
- ✅ Desain RESTful: Endpoint yang bersih dan intuitif, memisahkan sumber daya
katadanindeks. - ✅ Penanganan Error: Respons error yang informatif dan konsisten.
⚠️ Peringatan: API ini bergantung pada struktur HTML dari situsdictionary.basabali.org. Jika situs sumber mengubah layout-nya, API ini mungkin akan mengalami kegagalan. Gunakan dengan bijak.
- Instalasi
- Menjalankan Proyek
- Dokumentasi Endpoint API
- Contoh Respons
- Teknologi yang Digunakan
- Struktur Proyek
- Potensi Peningkatan
- Lisensi
Untuk menjalankan proyek ini di lingkungan lokal Anda, ikuti langkah-langkah berikut:
-
Clone repositori ini:
git clone https://github.com/YudaKusumaID/basa-bali-wiki-api.git cd basa-bali-wiki-api -
Instal dependensi proyek: Gunakan
npmatauyarnuntuk menginstal semua paket yang dibutuhkan.npm install
-
Konfigurasi Lingkungan (Environment): Buat file
.envdi direktori root proyek dengan menyalin dari contoh.env.exampleatau buat secara manual.# Port untuk menjalankan server PORT=8080 # Mode environment: 'development' atau 'production' # 'development' akan menampilkan stack trace pada error NODE_ENV=development
-
Mode Development (dengan auto-reload): Mode ini menggunakan
nodemonuntuk secara otomatis me-restart server setiap kali ada perubahan file.npm run dev
-
Mode Produksi:
npm start
Setelah server berjalan, Anda akan melihat pesan di konsol:
Server berjalan di http://localhost:8080
Semua endpoint berada di bawah base URL: /api/v1
Endpoint ini digunakan untuk mendapatkan detail informasi dari sebuah kata.
Mengambil detail definisi, tingkatan bahasa, dialek, dan contoh penggunaan untuk sebuah kata.
Parameter:
nama(string, required): Kata dalam Bahasa Bali yang ingin dicari. Contoh:titiang.
Contoh Penggunaan (cURL):
curl http://localhost:8080/api/v1/kata/titiangRespons Sukses (200 OK): Mengembalikan objek JSON dengan data lengkap tentang kata tersebut. (Lihat Contoh Respons)
Respons Gagal (404 Not Found): Jika kata tidak ditemukan di kamus. (Lihat Contoh Respons Gagal)
Endpoint ini digunakan untuk mendapatkan daftar kata yang tersedia di kamus.
Mengambil daftar gabungan dari semua kata di kamus, dari A hingga Z.
⚠️ Catatan Performa: Endpoint ini melakukan 26 permintaan scraping secara bersamaan ke situs sumber. Panggilan pertama mungkin akan lambat. Sangat disarankan untuk mengimplementasikan caching pada API ini.
Contoh Penggunaan (cURL):
curl http://localhost:8080/api/v1/indeksRespons Sukses (200 OK): Mengembalikan objek JSON yang berisi jumlah total kata dan sebuah array besar berisi semua kata.
Mengambil daftar semua kata yang diawali dengan huruf tertentu, dengan dukungan pagination.
-
Parameter Path:
huruf(string, required): Satu karakter alfabet (A-Z, tidak case-sensitive) untuk memfilter daftar kata.
-
Query Parameters (Opsional):
page(number): Nomor halaman yang ingin ditampilkan.- Default:
1
- Default:
limit(number): Jumlah data per halaman.- Default:
20 - Maksimum:
100
- Default:
-
Contoh Penggunaan (cURL):
- Halaman pertama (default):
curl "http://localhost:3000/api/v1/indeks/a" - Halaman kedua dengan 10 item per halaman:
curl "http://localhost:3000/api/v1/indeks/a?page=2&limit=10"
- Halaman pertama (default):
-
Respons Sukses (200 OK): Mengembalikan objek JSON yang berisi metadata pagination dan daftar kata untuk halaman tersebut.
Parameter:
huruf(string, required): Satu karakter alfabet (A-Z, tidak case-sensitive) untuk memfilter daftar kata.
Contoh Penggunaan (cURL):
curl http://localhost:8080/api/v1/indeks/bRespons Sukses (200 OK): Mengembalikan objek JSON yang berisi daftar kata untuk huruf yang diminta. (Lihat Contoh Respons)
Permintaan: GET /api/v1/kata/titiang
{
"success": true,
"message": "Definisi untuk kata 'titiang' berhasil diambil.",
"data": {
"word": "Titiang",
"definitions": [
{ "lang": "en", "text": "first person singular pronouns" },
{ "lang": "en", "text": "I; me (Alus sor)" },
{ "lang": "id", "text": "saya (Alus sor)" },
{ "lang": "id", "text": "kata ganti orang pertama tunggal" }
],
"speechLevels": [
{ "level": "Kasar", "text": "ake; wake; kola" },
{ "level": "Andap", "text": "cang; icang; dewek; gelah" },
{ "level": "Alus sor", "text": "titiang" },
{ "level": "Alus madya", "text": "tiang" }
],
"dialects": [
{ "dialect": "Bali Dataran", "text": "Oke (Buleleng); Oke (Jembrana, Batur); Kola (Nusa Penida)" }
],
"examples": [
{
"balinese": "Titiang sampun iriki.",
"english": "I am already here.",
"indonesian": "Saya sudah di sini."
}
]
}
}Permintaan: GET /api/v1/indeks/a?page=1&limit=5
{
"success": true,
"message": "Daftar kata untuk huruf 'A' berhasil diambil.",
"pagination": {
"currentPage": 1,
"totalPages": 165,
"limit": 5,
"totalItems": 822,
"itemsOnPage": 5
},
"data": [
"A",
"Aa",
"Aab",
"Aad",
"Aag"
]
}Permintaan: GET /api/v1/kata/katangawag
{
"success": false,
"status": 404,
"message": "Kata 'katangawag' tidak ditemukan di kamus."
}- Node.js - Lingkungan eksekusi JavaScript.
- Express.js - Framework web minimalis untuk Node.js.
- Axios - Klien HTTP berbasis Promise untuk browser dan Node.js.
- Cheerio - Implementasi cepat dan fleksibel dari jQuery Core untuk server.
- Dotenv - Memuat variabel lingkungan dari file
.env. - Nodemon - Utilitas untuk me-restart server secara otomatis saat pengembangan.
Proyek ini menggunakan arsitektur berlapis untuk memisahkan tanggung jawab (Separation of Concerns).
/src
├── api/
│ └── routes/ # Mendefinisikan endpoint API
├── controllers/ # Mengelola alur request-response
├── services/ # Berisi logika bisnis inti (scraping)
├── utils/ # Utilitas pembantu (e.g., kelas Error)
└── app.js # Entry point aplikasi & konfigurasi Express
Proyek ini dilisensikan di bawah Lisensi MIT. Lihat file LICENSE untuk detail lebih lanjut.