Endpoint Pertama — API

Saatnya membuat endpoint API pertamamu! GET endpoint sederhana: app.get("/hello", (req, res) => { res.json({ message: "Halo Dunia!" }); }); POST endpoint…

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 mengirim GET /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!" });
});

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}!` });
});
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!"}

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

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.

Yang akan kamu pelajari