GET: Daftar Todo & Detail per ID
Membuat endpoint GET /todos dan GET /todos/{id}, termasuk jawaban 404 saat data tidak ada.
Dua endpoint untuk membaca data
| Endpoint | Fungsi | Respons |
|---|---|---|
GET /todos | Semua todo | 200 + array JSON |
GET /todos/{id} | Satu todo | 200 + objek JSON, atau 404 |
Handler sebagai method dari struct
Handler butuh akses ke Store. Caranya: simpan Store di sebuah struct, lalu jadikan handler sebagai method dari struct itu. Method tetap memenuhi bentuk handler (w, r).
type API struct {
store *Store
}
func (a *API) List(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusOK, a.store.All())
}
Mendaftarkannya: mux.HandleFunc("GET /todos", api.List). Perhatikan: api.List tanpa tanda kurung.
Daftar kosong harus [], bukan null
Store kita memakai make([]Todo, 0, ...) sehingga saat kosong hasilnya []. Slice nil akan di-encode menjadi null yang bisa membuat client error.
Membaca ID dari alamat
r.PathValue("id") selalu string. Ubah ke angka dengan strconv.Atoi, yang mengembalikan dua nilai: angkanya dan error (bila teks bukan angka, misal /todos/abc).
id, err := strconv.Atoi(r.PathValue("id"))
if err != nil {
// 400 Bad Request: permintaan salah format
}
Dua jenis "tidak berhasil"
- 400 Bad Request — kesalahan ada pada permintaan client (
/todos/abc). - 404 Not Found — format benar, tetapi datanya tidak ada (
/todos/99). Kita tahu dariok == falsedistore.Get.
Setelah menjawab error, jangan lupa return supaya kode di bawahnya tidak ikut berjalan.