Mengirim Response JSON
Mengubah struct Go menjadi JSON, mengatur Content-Type dan status code dengan helper writeJSON.
JSON: bahasa data API
Hampir semua REST API bertukar data dalam format JSON. Contoh JSON sebuah todo:
{"id": 1, "title": "Belajar Go", "done": false}
Di Go, data biasanya dimodelkan dengan struct, lalu diubah menjadi JSON memakai paket encoding/json (proses ini disebut encode atau marshal).
Struct dan struct tag
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
Teks di dalam tanda backtick disebut struct tag. json:"title" berarti "di JSON, field ini bernama title". Tanpa tag, nama JSON-nya mengikuti Go (Title, huruf besar). Field harus berawalan huruf kapital agar bisa di-encode.
Tiga langkah menulis response JSON
- Header: beri tahu client bahwa isinya JSON —
w.Header().Set("Content-Type", "application/json"). - Status code:
w.WriteHeader(http.StatusOK)(nilai200). - Body:
json.NewEncoder(w).Encode(data)mengubah data menjadi JSON dan langsung menulisnya kew.
Urutan wajib: header diatur sebelum WriteHeader, dan WriteHeader sebelum menulis body. Begitu body mulai ditulis, header dan status sudah terkirim dan tidak bisa diubah lagi.
Bungkus jadi helper
Ketiga langkah itu akan kita pakai di setiap handler, jadi satukan dalam satu fungsi:
func writeJSON(w http.ResponseWriter, status int, data any) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
json.NewEncoder(w).Encode(data)
}
data any artinya parameter ini boleh berisi tipe apa saja (struct, slice, map). Pemakaiannya di handler jadi satu baris: writeJSON(w, http.StatusOK, todo).
Konstanta status
Alih-alih angka mentah, pakai konstanta agar mudah dibaca: http.StatusOK (200), http.StatusCreated (201), http.StatusNotFound (404).