API, Autentikasi, dan Keamanan · 1/7
Merancang HTTP API
Resource, method, status code, dan bentuk error yang benar-benar bisa dipakai frontend-mu.
Baca 28 menit
Setelah pelajaran ini kamu bisa
- Merancang endpoint di sekitar resource alih-alih aksi
- Memilih status code yang tepat tanpa perlu mencari
- Mengembalikan error yang benar-benar bisa dipakai frontend
- Menjelaskan kenapa idempotency penting untuk retry
API REST menamai benda, dan memakai method HTTP untuk kata kerjanya. Desain pemula yang paling umum menaruh kata kerjanya di URL, yang berarti setiap operasi baru butuh endpoint baru.
| Aksi | Kata kerja di URL (hindari) | Berbasis resource (utamakan) |
|---|---|---|
| Daftar venue | GET /getVenues | GET /venues |
| Satu venue | GET /getVenue?id=42 | GET /venues/42 |
| Membuat | POST /createVenue | POST /venues |
| Mengubah | POST /updateVenue | PATCH /venues/42 |
| Menghapus | POST /deleteVenue | DELETE /venues/42 |
| Booking-nya | GET /getVenueBookings?id=42 | GET /venues/42/bookings |
Status code
Kamu sudah menemuinya di modul 1. Ini keputusannya, sebagai urutan pertanyaan yang perlu ditanyakan.
Keputusannya sebagai sebuah function. Ini urutan berpikirnya, dan ia menghilangkan tebak-tebakan.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Body error yang bisa dipakai frontend
// ❌ Useless: which field? what do I show the user?
{ "error": "Validation failed" }
// ❌ Dangerous: leaks your schema and file paths to an attacker.
{ "error": "SQLITE_CONSTRAINT: UNIQUE constraint failed: users.name_key at /app/features/auth/users.ts:73" }
// ✅ Machine-readable code, plus per-field messages.
{
"error": "validation_failed",
"fields": {
"nights": "Must be between 1 and 30",
"email": "That does not look like an email address"
}
}fields adalah bentuk dari pelajaran form — ia memungkinkan client menampilkan setiap pesan di sebelah input-nya sendiri. Kode error yang stabil memungkinkan client bercabang tanpa mencocokkan teks.Idempotency
Kamu sudah menemui istilahnya di modul 1: melakukannya dua kali menghasilkan kondisi yang sama seperti sekali. Ini penting karena jaringan melakukan retry. Client mobile di kereta mengirim sebuah request, response-nya hilang, lalu ia mengirim lagi — server sekarang menerimanya dua kali.
Retry yang sama terhadap tiga desain. Hanya satu yang selamat.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Tugas praktik
Rancang endpoint untuk fitur progres di proyek ini: membaca progres milikmu sendiri, menandai sebuah pelajaran selesai, dan membatalkan tandanya. Tulis method, path, status code, dan body error untuk masing-masingnya. Lalu bandingkan desainmu dengan features/progress/actions.ts dan catat apa yang tidak lagi dibutuhkan karena memakai Server Action.
Hasil yang diharapkan
Sebuah URL, satu method per operasi — dan tidak perlu semua itu saat pemanggilnya adalah UI-mu sendiri.