GoDasturchi
Structured Error Responses

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).

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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).

example.go
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.

Hints (0/3)

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