Tarkibga o'tish

gorilla/mux bilan routing

github.com/gorilla/mux — Go uchun eng mashhur routerlardan biri. U uzoq yillar davomida Go’da REST API yozishning deyarli standart vositasi bo‘lib keldi. Ko‘plab mavjud loyihalar, darsliklar va kutubxonalar undan foydalanadi.

Go 1.22 versiyasigacha standart http.ServeMux juda sodda edi. Unda HTTP metodi bo‘yicha routing ham, /books/{id} kabi yo‘l parametrlari ham yo‘q edi. gorilla/mux aynan shu bo‘shliqni to‘ldirgan.

Nima uchun hali ham o‘rganish kerak?

Go 1.22 dan keyin standart router metod va yo‘l parametrlarini qo‘llab-quvvatlaydi. Shunday bo‘lsa-da, gorilla/muxni bilish foydali:

  1. Mavjud loyihalar. Ishga kirganingizda ko‘p hollarda gorilla/mux asosida yozilgan kodga duch kelasiz.
  2. Qo‘shimcha imkoniyatlar. Yo‘l parametrlarida regex, query parametrlar bo‘yicha moslashtirish, subrouter’lar, marshrutga nom berib URL yasash, Host, sarlavha va sxema bo‘yicha routing.
  3. Tanlovni asoslash. Standart router, gorilla/mux va framework’lar o‘rtasidagi farqni bilsangiz, loyihangiz uchun ongli tanlov qila olasiz.

Standart router bilan solishtirish

Imkoniyat http.ServeMux (Go 1.22+) gorilla/mux
Metod bo‘yicha routing ✅ "GET /books" ✅ .Methods("GET")
Yo‘l parametrlari ✅ {id} ✅ {id}
Parametrda regex ❌ ✅ {id:[0-9]+}
Query bo‘yicha moslashtirish ❌ ✅ .Queries("page", "{page}")
Sarlavha, host, sxema bo‘yicha Faqat host ✅ .Headers(), .Host(), .Schemes()
Subrouter’lar Qo‘lda, alohida mux orqali ✅ .PathPrefix().Subrouter()
Router darajasidagi middleware Qo‘lda o‘raladi ✅ r.Use(...)
Nomli marshrutdan URL yasash ❌ ✅ .Name("book").URL(...)
405 va Allow sarlavhasi ✅ avtomatik 405, lekin Allow sarlavhasisiz
Tashqi bog‘liqlik Yo‘q Bitta modul

Loyiha holati

gorilla tashkiloti 2022-yil oxirida qo‘llab-quvvatlovchilar yetishmagani sababli o‘z repozitoriylarini arxivlagan edi. 2023-yilda loyiha yangi jamoa tomonidan qayta faollashtirildi. Hozirgi barqaror versiya v1.8.1.

Kutubxona yetuk va barqaror. Unga yangi imkoniyatlar kam qo‘shiladi, asosan xatolar tuzatiladi. Yangi loyiha boshlashdan oldin repozitoriydagi so‘nggi faollikni va chiqarilgan versiyalarni o‘zingiz tekshirib ko‘ring.

O‘rnatish

go get github.com/gorilla/mux

Birinchi tanishuv

main.go
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/books/{id:[0-9]+}", func(w http.ResponseWriter, r *http.Request) {
        id := mux.Vars(r)["id"]
        fmt.Fprintf(w, "Kitob ID: %s\n", id)
    }).Methods(http.MethodGet)

    log.Println("Server: http://localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", r))
}
curl http://localhost:8080/books/42
curl http://localhost:8080/books/abc
Kitob ID: 42
404 page not found

Birinchi qarashda standart routerga o‘xshaydi. Farqi {id:[0-9]+} qismida: parametr faqat raqamlardan iborat bo‘lsagina marshrut mos keladi. abc qiymati regex’ga mos kelmagani uchun handler umuman chaqirilmadi.

Bo‘lim rejasi

Dars Mavzu
Framework kerakmi? Standart kutubxona, router va framework: qachon nima tanlanadi
mux bilan router yaratish Router, marshrutlar, metodlar, 404 va 405 handlerlari
Path parametrlari mux.Vars, regex, query moslashtirish, URL yasash
Subroutes Marshrutlarni guruhlash va API versiyalash
Middleware integratsiyasi r.Use, subrouter middleware’lari va ularning xususiyatlari

Bo‘lim davomida avvalgi bo‘limlarda yozilgan kitoblar API’sini gorilla/mux bilan qayta tuzamiz. Birinchi darsda esa "umuman framework kerakmi?" degan savolga javob beramiz.