mux bilan router yaratish
Bu darsda gorilla/mux yordamida router yaratamiz va unga kitoblar API’sining marshrutlarini qo‘shamiz. Yo‘l davomida kutubxonaning standart ServeMuxdan farq qiladigan jihatlarini ham ko‘rib chiqamiz: marshrutlar qanday tartibda tekshiriladi, oxiridagi / bilan nima qilinadi va 404, 405 javoblarini qanday o‘zgartirish mumkin.
Router yaratish
mux.NewRouter() *mux.Router qaytaradi. U http.Handler interfeysini qanoatlantiradi, ya’ni standart http.ServeMux o‘rnida ishlatiladi:
Marshrut qo‘shish
r.HandleFunc("/books", listBooks).Methods(http.MethodGet)
r.HandleFunc("/books", createBook).Methods(http.MethodPost)
r.HandleFunc("/books/{id}", getBook).Methods(http.MethodGet)
r.HandleFunc("/books/{id}", updateBook).Methods(http.MethodPut)
r.HandleFunc("/books/{id}", deleteBook).Methods(http.MethodDelete)
r.HandleFunc *mux.Route qaytaradi. Unga zanjir ko‘rinishida qo‘shimcha shartlar qo‘shiladi. .Methods(...) — shulardan biri. Bitta marshrutga bir nechta metod ham berish mumkin:
Warning
.Methods() yozilmasa, marshrut barcha metodlarga mos keladi. DELETE /books so‘rovi ham ro‘yxat qaytaradigan handlerga borib qoladi. Har bir marshrutga metodni aniq ko‘rsating.
Tayyor http.Handler uchun r.Handle ishlatiladi:
Moslashtirish tartibi
Bu gorilla/mux va standart ServeMux o‘rtasidagi eng muhim farqlardan biri:
- standart
ServeMuxeng aniq patternni tanlaydi, ro‘yxatdan o‘tkazish tartibi ahamiyatsiz; gorilla/muxmarshrutlarni ro‘yxatdan o‘tkazilgan tartibda tekshiradi va birinchi mos kelganini tanlaydi.
r.HandleFunc("/books/{id}", getBook).Methods("GET")
r.HandleFunc("/books/latest", latestBook).Methods("GET") // hech qachon ishlamaydi!
GET /books/latest so‘rovi birinchi marshrutga ham mos keladi: {id} qiymati "latest" bo‘ladi. Shu sababli latestBook hech qachon chaqirilmaydi. Tuzatishning ikki yo‘li bor:
// 1. Aniq marshrutni oldinga qo‘yish
r.HandleFunc("/books/latest", latestBook).Methods("GET")
r.HandleFunc("/books/{id}", getBook).Methods("GET")
// 2. Parametrni regex bilan cheklash
r.HandleFunc("/books/{id:[0-9]+}", getBook).Methods("GET")
r.HandleFunc("/books/latest", latestBook).Methods("GET")
Ikkinchi usul ishonchliroq: marshrutlar tartibi o‘zgarsa ham, kod to‘g‘ri ishlashda davom etadi. Regex Path parametrlari darsida batafsil ko‘riladi.
Oxiridagi /: StrictSlash
Standart holatda /books va /books/ ikki xil yo‘l hisoblanadi:
StrictSlash(true) yoqilsa, router oxiridagi / farqi uchun klientni to‘g‘ri manzilga yo‘naltiradi:
Bu brauzer uchun qulay. Lekin API’da muammo tug‘diradi: POST /books/ so‘rovi 301 bilan yo‘naltirilganda, ko‘p klientlar keyingi so‘rovni GET sifatida yuboradi va so‘rov tanasi yo‘qoladi. Shuning uchun API’da odatda StrictSlash yoqilmaydi. Buning o‘rniga barcha marshrutlar oxiridagi / siz yoziladi va bu qoida hujjatda aniq ko‘rsatiladi.
404 va 405 javoblari
gorilla/mux standart holatda quyidagicha javob beradi:
| Holat | Status | Tana |
|---|---|---|
| Hech bir marshrut mos kelmadi | 404 |
404 page not found |
| Yo‘l mos keldi, lekin metod mos kelmadi | 405 |
bo‘sh |
JSON API uchun bu javoblarni yagona formatga keltirish kerak. Buning uchun routerda ikkita maydon bor:
r.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusNotFound, "not_found", "endpoint topilmadi")
})
r.MethodNotAllowedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusMethodNotAllowed, "method_not_allowed", "bu metod ruxsat etilmagan")
})
Standart ServeMuxdan farqli ravishda gorilla/mux 405 javobiga Allow sarlavhasini qo‘shmaydi. Kerak bo‘lsa, uni o‘zingiz hisoblab qo‘shishingiz mumkin. Lekin ko‘pchilik API’lar uchun bu shart emas.
To‘liq misol
| main.go | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | |
Server ishga tushganda marshrutlar ro‘yxati chiqadi:
2026/09/30 10:00:00 GET /books
2026/09/30 10:00:00 POST /books
2026/09/30 10:00:00 GET /books/latest
2026/09/30 10:00:00 GET /books/{id:[0-9]+}
2026/09/30 10:00:00 DELETE /books/{id:[0-9]+}
2026/09/30 10:00:00 Server: http://localhost:8080
r.Walk barcha marshrutlarni aylanib chiqadi. Loyiha kattalashganda qaysi endpointlar mavjudligini tekshirish uchun bu qulay vosita.
Sinab ko‘ramiz:
curl -X POST http://localhost:8080/books -d '{"title":"Sarob","author":"Abdulla Qahhor"}'
curl -X POST http://localhost:8080/books -d '{"title":"Ufq","author":"Said Ahmad"}'
curl http://localhost:8080/books/latest
curl http://localhost:8080/books/1
curl http://localhost:8080/books/abc
curl -X PUT http://localhost:8080/books/1
curl http://localhost:8080/authors
{"data":{"id":1,"title":"Sarob","author":"Abdulla Qahhor"}}
{"data":{"id":2,"title":"Ufq","author":"Said Ahmad"}}
{"data":{"id":2,"title":"Ufq","author":"Said Ahmad"}}
{"data":{"id":1,"title":"Sarob","author":"Abdulla Qahhor"}}
{"error":{"code":"not_found","message":"endpoint topilmadi"}}
{"error":{"code":"method_not_allowed","message":"bu metod ruxsat etilmagan"}}
{"error":{"code":"not_found","message":"endpoint topilmadi"}}
/books/latestto‘g‘ri ishladi, chunki{id}parametri faqat raqamlarni qabul qiladi./books/abchech bir marshrutga mos kelmadi va JSON formatidagi404qaytdi.PUT /books/1uchun yo‘l mos keldi, lekin metod yo‘q. Natijada405qaytdi.
Xulosa
mux.NewRouter()http.Handlerqaytaradi va standart router o‘rnida ishlatiladi.- Har bir marshrutga
.Methods(...)bilan metodni aniq ko‘rsating. gorilla/muxmarshrutlarni ro‘yxatdan o‘tkazilgan tartibda tekshiradi. Aniq marshrutlarni oldinga qo‘ying yoki parametrlarni regex bilan cheklang.- API’da
StrictSlashodatda yoqilmaydi. NotFoundHandlervaMethodNotAllowedHandlerbilan xato javoblari JSON formatiga keltiriladi.r.Walkbarcha marshrutlarni ko‘rib chiqish imkonini beradi.
Keyingi darsda yo‘l parametrlarini chuqurroq o‘rganamiz: regex, bir nechta parametr, query moslashtirish va nomli marshrutlardan URL yasash.