GoDasturchi
API Versioning Strategies

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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