Tarkibga o'tish

API nima?

Ilovangizda ob-havo ma'lumoti kerak. Siz meteorologiya bazasi qurmaysiz — mavjud ob-havo servisidan ma'lumot olasiz. Buning uchun o'sha servis sizga API beradi.

API (Application Programming Interface) — dasturlar o'rtasidagi shartnoma. U "qanday so'rov yuborish kerak va qanday javob keladi" degan qoidalarni belgilaydi.

Restoran analogiyasi: siz oshpazga to'g'ridan-to'g'ri kirmaysiz. Ofitsiant (API) sizning buyurtmangizni qabul qiladi, oshpazga (server/baza) yetkazadi va taomni olib keladi. Siz oshxonadagi jarayonni bilmasangiz ham bo'laveradi.

REST nima?

Bugungi kunda eng keng tarqalgan API uslubi — REST (Representational State Transfer). Bu HTTP protokoli ustidagi qoidalar to'plami.

REST da har bir narsa resurs. Resurs — URL orqali manzillanadi:

/users          → foydalanuvchilar
/users/42       → 42-foydalanuvchi
/users/42/posts → 42-foydalanuvchining postlari
/products       → mahsulotlar
/products/7     → 7-mahsulot

Resurs ustida nima qilish kerakligini esa HTTP metodi belgilaydi.

HTTP metodlari

Metod Nima qiladi Misol
GET Ma'lumot olish Foydalanuvchilar ro'yxatini olib keling
POST Yangi yozuv yaratish Yangi foydalanuvchi qo'shing
PUT Yozuvni to'liq yangilash Foydalanuvchini qayta yozing
PATCH Yozuvni qisman yangilash Faqat emailni o'zgartiring
DELETE Yozuvni o'chirish Foydalanuvchini o'chiring

Bir xil URL, turli metodlar — turli amallar:

GET    /users     → barcha foydalanuvchilarni olish
POST   /users     → yangi foydalanuvchi yaratish

GET    /users/42  → 42-foydalanuvchini olish
PUT    /users/42  → 42-foydalanuvchini yangilash
DELETE /users/42  → 42-foydalanuvchini o'chirish

HTTP status kodlari

Server javobining birinchi satridagi raqam — status kodi. U so'rov muvaffaqiyatli bo'lganligini bildiradi.

Diapazon Nima Misollar
2xx Muvaffaqiyat 200 OK, 201 Created, 204 No Content
3xx Yo'naltirish 301 Moved Permanently, 302 Found
4xx Klient xatosi 400 Bad Request, 401 Unauthorized, 404 Not Found
5xx Server xatosi 500 Internal Server Error, 503 Service Unavailable

Eng ko'p ishlatilganlar:

200 OK           → So'rov bajarildi
201 Created      → Yangi resurs yaratildi (POST dan keyin)
204 No Content   → Bajarildi, javob tanasi yo'q (DELETE dan keyin)
400 Bad Request  → So'rov noto'g'ri (validatsiya xatosi)
401 Unauthorized → Autentifikatsiya talab qilinadi
403 Forbidden    → Ruxsat yo'q
404 Not Found    → Resurs topilmadi
500 Internal Server Error → Serverdagi kutilmagan xato

JSON — API tili

REST API lar ma'lumotni odatda JSON (JavaScript Object Notation) formatida uzatadi. JSON matn formatida, lekin tuzilgan:

{
  "id": 42,
  "ism": "Ali Karimov",
  "email": "[email protected]",
  "faol": true,
  "yosh": 28
}

Ro'yxat:

[
  {"id": 1, "ism": "Ali"},
  {"id": 2, "ism": "Vali"},
  {"id": 3, "ism": "Gani"}
]

JSON deyarli barcha dasturlash tillari tomonidan qo'llab-quvvatlanadi. Go'da encoding/json paketi JSON bilan ishlashni ta'minlaydi.

Go'da oddiy API server

main.go
package main

import (
    "encoding/json"
    "net/http"
)

type Foydalanuvchi struct {
    ID   int    `json:"id"`
    Ism  string `json:"ism"`
    Yosh int    `json:"yosh"`
}

func main() {
    http.HandleFunc("/users", usersHandler)
    http.ListenAndServe(":8080", nil)
}

func usersHandler(w http.ResponseWriter, r *http.Request) {
    users := []Foydalanuvchi{
        {ID: 1, Ism: "Ali", Yosh: 25},
        {ID: 2, Ism: "Vali", Yosh: 30},
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(users)
}

Dasturni ishga tushirib, http://localhost:8080/users ga kirsangiz:

[
  {"id":1,"ism":"Ali","yosh":25},
  {"id":2,"ism":"Vali","yosh":30}
]

Ikki yangi narsa:

w.Header().Set("Content-Type", "application/json") — klientga javob JSON formatida ekanligini bildiradi. Brauzer va boshqa dasturlar bu sarlavhaga qarab ma'lumotni qanday qayta ishlashni biladi.

json.NewEncoder(w).Encode(users) — Go strukturasini JSON ga aylantirib, to'g'ridan-to'g'ri javobga yozadi.

Metodga qarab ishlash

Bir yo'l (/users) turli metodlarga turlicha javob berishi kerak:

main.go
package main

import (
    "encoding/json"
    "net/http"
)

type Foydalanuvchi struct {
    ID  int    `json:"id"`
    Ism string `json:"ism"`
}

var users = []Foydalanuvchi{
    {ID: 1, Ism: "Ali"},
}

func main() {
    http.HandleFunc("/users", usersHandler)
    http.ListenAndServe(":8080", nil)
}

func usersHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    switch r.Method {
    case http.MethodGet:
        json.NewEncoder(w).Encode(users)

    case http.MethodPost:
        var yangi Foydalanuvchi
        if err := json.NewDecoder(r.Body).Decode(&yangi); err != nil {
            http.Error(w, "Noto'g'ri so'rov", http.StatusBadRequest)
            return
        }
        yangi.ID = len(users) + 1
        users = append(users, yangi)
        w.WriteHeader(http.StatusCreated)
        json.NewEncoder(w).Encode(yangi)

    default:
        http.Error(w, "Metod ruxsat etilmagan", http.StatusMethodNotAllowed)
    }
}

GET /users — ro'yxatni qaytaradi.

POST /users — tanadan yangi foydalanuvchini o'qib, qo'shadi va 201 Created qaytaradi.

Boshqa metodlar — 405 Method Not Allowed.

Note

http.Error(w, "xabar", statusKod) — xato javobini yuborish uchun qulay funksiya. U status kodini va matnni birga yozadi.

Sarlavhalar (Headers)

Sarlavhalar — so'rov va javob haqida meta-ma'lumot. Tanadan alohida yuboriladi.

Ko'p uchraydigan sarlavhalar:

Content-Type: application/json    → tananing formati
Authorization: Bearer <token>     → autentifikatsiya
Accept: application/json          → klient qanday format qabul qiladi
Cache-Control: no-cache           → kesh sozlamalari

Go'da so'rov sarlavhasini o'qish:

token := r.Header.Get("Authorization")

Javobga sarlavha qo'shish:

w.Header().Set("Content-Type", "application/json")
w.Header().Set("X-Request-ID", "abc123")

API vs Web server

Farq nima?

Web server API server
HTML sahifalar qaytaradi JSON ma'lumot qaytaradi
Brauzer uchun Dastur uchun (brauzer, mobil, boshqa server)
Foydalanuvchi ko'radi Dastur qayta ishlaydi

Ko'p zamonaviy ilovalar ikkalasini birlashtiradi: frontend (React, Vue) alohida ishlaydi, backend faqat API qaytaradi. Bu SPA + API arxitekturasi.

Keyingi qadam

Bu darsda API ning asosiy tushunchalari — resurs, metod, status kodi, JSON — ko'rildi. Keyingi darslarda Go'da to'liqroq router (gorilla/mux), JSON validatsiya, autentifikatsiya va boshqalarni ko'ramiz.