API Versioning Strategies
API'ni versiyalash strategiyalari
Restoran ESKI menyusi bilan ishlab kelayotgan doimiy mijozlar bor, lekin oshxona YANGI taomlar (va narxlar) bilan YANGI menyu chiqarmoqchi. Yechim — ikkala menyuni ham BIR VAQTDA saqlash: eski mijoz "eski menyu"ni so'rasa, ESKI narxlar va taomlar beriladi; yangisini xohlasa — YANGI menyu. API'da ham xuddi shunday: versiyalash (versioning) — API o'zgarganda, ESKI mijozlarning kodi BUZILMASLIGI uchun, ESKI va YANGI shaklni BIR VAQTDA xizmat qilish.
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
)
// BookV1 — API'ning BIRINCHI, sodda shakli
type BookV1 struct {
ID string `json:"id"`
Title string `json:"title"`
}
// BookV2 — Author va Price qo'shilgan, KENGAYTIRILGAN shakl
type BookV2 struct {
ID string `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
Price float64 `json:"price"`
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /v1/books/{id}", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(BookV1{ID: "1", Title: "Go bilan tanishuv"})
})
mux.HandleFunc("GET /v2/books/{id}", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(BookV2{ID: "1", Title: "Go bilan tanishuv", Author: "A. Karimov", Price: 45000})
})
req1 := httptest.NewRequest("GET", "/v1/books/1", nil)
rec1 := httptest.NewRecorder()
mux.ServeHTTP(rec1, req1)
fmt.Print(rec1.Body.String())
req2 := httptest.NewRequest("GET", "/v2/books/1", nil)
rec2 := httptest.NewRecorder()
mux.ServeHTTP(rec2, req2)
fmt.Print(rec2.Body.String())
}/v1/books/{id} va /v2/books/{id} — URL yo'l orqali versiyalash (URL path versioning): versiya raqami MANZILNING O'ZIDA. Bu — eng KO'RINADIGAN, eng TUSHUNARLI usul: mijoz brauzerda ham, log fayllarida ham qaysi versiyani ishlatayotganini DARHOL ko'radi. Kamchiligi: BUTUN yo'llar to'plamini (/v1/*, /v2/*) parallel SAQLASH kerak bo'ladi.
Muqobil yondashuv — sarlavha orqali versiyalash (header-based versioning): yo'l BIR XIL qoladi (/books/{id}), lekin mijoz Accept-Version: v1 kabi maxsus SARLAVHA yuboradi, server esa shu sarlavhaga qarab QAYSI shaklni qaytarishni TANLAYDI. Bu — URL'ni "toza" saqlaydi, lekin versiyani ko'rish uchun sarlavhalarni TEKSHIRISH kerak bo'ladi (brauzerda oddiy havoladan ko'rib bo'lmaydi).
>_ Exercise
Sarlavha orqali versiyalashni amalga oshiring.
- •"GET /books/{id}" (BITTA yo'l, versiyasiz) handlerini yozing
- •r.Header.Get("Accept-Version") == "v1" bo'lsa BookV1, aks holda BookV2 qaytaring
- •"Accept-Version: v1" bilan va sarlavhasiz (standart — v2) ikkita so'rov yuborib, ikkalasining javobini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
API versiyalash — YO URL yo'lida (/v1/, /v2/), YOKI maxsus sarlavhada (Accept-Version) amalga oshiriladi; ikkalasining ham maqsadi bir xil — API o'zgarganda ESKI mijozlarni buzmasdan, YANGI imkoniyatlarni qo'shish.
NEXT UP
Authentication: API Keys
$ go run main.go
Kodingizni ishga tushiring