Endpoint adalah satu pintu di API yang siap menjawab: gabungan method dan path, misalnya GET /hello. Bayangin loket di kantor pos. Tiap loket punya papan nama dan satu petugas. Kamu datang ke loket yang tepat, menyerahkan formulir, lalu petugasnya memberi tepat satu jawaban. Di API, papan namanya adalah method + path, petugasnya adalah function yang kamu tulis, formulirnya adalah request, dan jawabannya adalah response.
🧪 Tebakan cepat: server Toko Buku cuma punya
app.post("/greet", ...). Kamu mengirimGET /greet. Server menjawab apa? Tebak dulu, jawabannya ada di bagian "Method + path = satu endpoint".
Endpoint GET pertama
Kita lanjutkan server API Toko Buku. Saat dijalankan di laptop, alamatnya http://localhost:3000. Endpoint pertamanya cuma menyapa:
app.get("/hello", (req, res) => {
res.json({ message: "Halo Dunia!" });
});
appadalah aplikasi server-nya. Di Express kamu membuatnya denganconst app = express(); di latihan,appsudah disediakan.app.get("/hello", ...)mendaftarkan endpoint: kalau datang request GET ke path /hello, jalankan function di sebelahnya.- Function
(req, res) => { ... }disebut handler.req(request) berisi semua yang dikirim client,res(response) adalah alat untuk menjawab. res.json({ ... })mengirim object itu sebagai JSON. Status-nya otomatis200 OK, dan headerContent-Type: application/jsonikut dipasang.
Request dan response-nya, persis seperti yang muncul di Lab:
GET /hello HTTP/1.1
Host: localhost:3000
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 25
{"message":"Halo Dunia!"}
Content-Length: 25 adalah panjang body-nya dalam byte: {"message":"Halo Dunia!"} memang 25 karakter.
Endpoint POST: baca req.body
Endpoint kedua menerima nama dari client, lalu menyapa nama itu:
app.post("/greet", (req, res) => {
const { name } = req.body;
res.json({ message: `Halo, ${name}!` });
});
app.postmendaftarkan endpoint untuk method POST, method untuk mengirim data ke server.req.bodyadalah body request, isi kiriman client, yang sudah diubah dari teks JSON jadi object. Di Express asli ini butuh satu barisapp.use(express.json())di awal; di latihan sudah disiapkan.const { name } = req.body;mengambil fieldnamedari body (destructuring). Sama denganconst name = req.body.name;.`Halo, ${name}!`adalah template literal:${name}diganti isiname. Hasilnya sama dengan"Halo, " + name + "!".
| Request | Body yang dikirim | Response |
|---|---|---|
POST /greet |
{"name": "Budi"} |
200 {"message":"Halo, Budi!"} |
POST /greet |
{"name": "Siti"} |
200 {"message":"Halo, Siti!"} |
POST /greet |
{} |
200 {"message":"Halo, undefined!"} |
Baris terakhir: client gak mengirim name, jadi name berisi undefined dan ikut tercetak. Endpoint ini belum memeriksa input. Cara menolak input seperti itu dibahas di pelajaran Validasi Input.
Method + path = satu endpoint
Server mencocokkan dua hal sekaligus: method dan path. GET /hello dan POST /greet adalah dua endpoint. GET /greet juga endpoint yang berbeda dari POST /greet, walau path-nya sama.
Jadi kalau server cuma punya app.post("/greet", ...) dan kamu mengirim GET /greet, gak ada yang cocok. Server menjawab 404 Not Found; Express aslinya mengirim halaman HTML kecil bertuliskan Cannot GET /greet. Itu jawaban tebakannya. Handler POST-nya gak pernah jalan sama sekali.
Mengetes endpoint
Endpoint gak bisa diklik seperti tombol. Kamu butuh alat yang mengirim request.
curl, alat di terminal. Tanpa -X dan tanpa -d, curl mengirim GET:
curl http://localhost:3000/hello
# {"message":"Halo Dunia!"}
curl -X POST http://localhost:3000/greet -H "Content-Type: application/json" -d '{"name":"Budi"}'
# {"message":"Halo, Budi!"}
-X POSTmemilih method-nya.-H "Content-Type: application/json"menambah header yang bilang body-nya JSON. Tanpa header ini,express.json()gak membaca body-nya.-d '{"name":"Budi"}'adalah body-nya.
Postman adalah aplikasi dengan tampilan (GUI) untuk hal yang sama: pilih method, ketik URL, isi body, klik Send. Alternatif populernya Insomnia dan Thunder Client (extension VS Code). Browser juga bisa, tapi mengetik URL di address bar selalu mengirim GET, jadi cuma cocok untuk endpoint GET.
Di latihan, kamu klik Jalankan. Tester-nya mendaftarkan endpoint-mu, mengirim request ke tiap endpoint, lalu menulis hasilnya, misalnya GET /hello → 200 lengkap dengan body-nya.
⚠️ Jebakan yang sering ketemu
- Menjawab dua kali. Satu request cuma dapat satu response.
res.send(data);lalures.json({ status: "ok" });di handler yang sama: client dapat jawaban pertama, lalu Express errorCannot set headers after they are sent to the client. Kalau harus berhenti di tengah handler, tulisreturn res.json(...). - Lupa menjawab. Handler yang gak memanggil
res.jsonataures.sendbikin client menunggu terus sampai timeout. - Nama diketik langsung.
res.json({ message: "Halo, Budi!" })cuma benar untuk Budi. Ambil namanya darireq.body, supaya Siti dapat "Halo, Siti!". - Salah method.
app.get("/greet", ...)gak menjawab request POST. Method di kode harus sama dengan method yang dikirim client.
TL;DR: Endpoint = method + path, misalnya GET /hello. app.get(path, handler) dan app.post(path, handler) mendaftarkannya; handler (req, res) => { ... } membaca request dari req dan menjawab lewat res. res.json(object) mengirim JSON dengan status 200 dan Content-Type: application/json. Data kiriman client ada di req.body, misalnya const { name } = req.body;, lalu `Halo, ${name}!`. Method dan path harus cocok dua-duanya; yang gak cocok dijawab 404. Satu request, satu response (res.send lalu res.json bikin error "Cannot set headers after they are sent"). Tes dengan curl di terminal, Postman (atau Insomnia, Thunder Client), browser untuk GET, atau tombol Jalankan di latihan.