Structured Error Responses
Izchil xato javoblari (error envelope)
Aeroportda yo'qolgan yuk haqida shikoyat qilsangiz, sizga MAXSUS blank beriladi: reyس raqami, tavsif, sana — HAR QANDAY aviakompaniyada BIR XIL tuzilishda. Agentlik xodimi bu blankani ko'rib, DARHOL nima gapligini tushunadi — har safar yangi format o'ylab topmaydi. API'dagi xatolar ham xuddi shunday: HAR BIR endpoint o'z xatosini O'ZICHA formatda qaytarsa (goh matn, goh JSON, goh boshqa maydon nomlari bilan), mijoz kodini yozish JAHANNAMGA aylanadi. Yechim — BUTUN API uchun BITTA, izchil xato konverti (error envelope).
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
)
type ErrorBody struct {
Code string `json:"code"`
Message string `json:"message"`
}
type ErrorResponse struct {
Error ErrorBody `json:"error"`
}
// writeError — BUTUN API bo'ylab ISHLATILADIGAN, YAGONA xato yozish funksiyasi
func writeError(w http.ResponseWriter, status int, code, message string) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
json.NewEncoder(w).Encode(ErrorResponse{Error: ErrorBody{Code: code, Message: message}})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /books/{id}", func(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusNotFound, "not_found", "kitob topilmadi")
})
req := httptest.NewRequest("GET", "/books/99", nil)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, req)
fmt.Println(rec.Code)
fmt.Print(rec.Body.String())
}ErrorResponse{Error: ErrorBody{...}} — xatoni "error" degan KALIT ICHIGA joylashtirish, muvaffaqiyatli javob ({"id":...}) bilan xato javobini ({"error":{...}}) BIR QARASHDA farqlash imkonini beradi: mijoz kodi if resp["error"] != nil deb TEKSHIRISHI mumkin. code (masalan "not_found") — DASTURIY tekshirish uchun (if err.Code == "not_found"), message esa ODAMGA o'qish uchun matn — ikkalasi TURLI maqsadga xizmat qiladi.
writeError — BARCHA handler'lar chaqiradigan, YAGONA "xato yozish" funksiyasi. Agar ertaga xato formatini o'zgartirish kerak bo'lsa (masalan timestamp maydonini qo'shish), BITTA joyni o'zgartirish YETARLI — HAR BIR handler'ni alohida-alohida tuzatish SHART emas. Bu — "Handle Errors Once" darsida ko'rgan tamoyilning HTTP javob darajasidagi ko'rinishi.
>_ Exercise
writeError'ni validatsiya xatosi uchun ham ishlatib, ikkinchi endpoint qo'shing.
- •"POST /books" handlerini yozing: so'rov tanasidan CreateBookRequest{Title string} decode qiling
- •title bo'sh bo'lsa, writeError(w, http.StatusUnprocessableEntity, "validation_failed", "title bo'sh bo'lishi mumkin emas") chaqiring va return qiling
- •aks holda 201 status va "yaratildi" matnini yozing
- •GET /books/99 (topilmaydi) va POST /books (bo'sh title bilan) so'rovlarini yuborib, HAR IKKISINING status va tanasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Xato konverti (error envelope) — BUTUN API bo'ylab BIR XIL JSON tuzilmasida (code + message) xato qaytaradigan, YAGONA writeError funksiyasi orqali amalga oshiriladi; bu mijoz kodini SODDALASHTIRADI va formatni o'zgartirishni BITTA joyga jamlaydi.
NEXT UP
HTTP Status Codes Done Right
$ go run main.go
Kodingizni ishga tushiring