AXV

JSON formati, Kontrakt va Xavfsizlik

JSON turlari · Error Envelope · Paginatsiya · Bearer/JWT · CORS va Rate Limit

11-sinfProfessional IT4-hafta · 12-dars

Bugungi dars rejasi

01. JSON va Kontrakt

JSON 6 turi, Python'da serializatsiya, ISO-8601 vaqt va pul birliklari.

02. Error Envelope

Yagona xatolik konverti, maydonlar validatsiyasi va paginatsiya dizayni.

03. API Xavfsizligi

JWT/Bearer token, 401 vs 403, CORS, Rate limiting va maxfiy sirlar.

01

JSON tuzilmasi va Kontrakt dizayni

Universal ma'lumot formati va uning arxitektura qoidalari

JSON'ning 6 ta ma'lumot turi

Oddiy (Primitive) turlar

  • String: "Clean Code" (qo'shtirnoq shart!)
  • Number: 150000 yoki 19.99 (float/int bitta)
  • Boolean: true / false (kichik harfda)
  • Null: null (mavjud emaslik)

Murakkab (Complex) turlar

  • Object (Lug'at): {"id": 1, "name": "Ali"}
  • Array (Massiv): ["kitob", "qalam"]

Eslatma: Python'dagi None → JSON'da null, True → true bo'ladi.

Professional API Kontrakti qoidalari

Sana va Vaqt: ISO-8601 UTC

Hech qachon lokal vaqt yoki formatlanmagan string yubormang:

"created_at": "2026-10-05T08:30:00Z"

Mijoz uni o'z vaqt zonasiga o'zi o'tkazib oladi.

Pul birliklari: Butun son (Integer)

Float hisob-kitoblarda xatolik beradi (0.1 + 0.2 != 0.3):

"amount_cents": 15000000

150 000 so'm tiyinlarda yoki eng kichik birlikda saqlanadi.

Serializatsiya va deserializatsiya

Python dictlistNoneTrue / False JSON { } obyekt[ ] arraynulltrue / false json.dumps() json.loads()

Mini-test: qaysi JSON to‘g‘ri?

Qaysi yozuv to‘g‘ri JSON?

Kalit va matn qo‘sh tirnoqda, oxirgi vergul yo‘q, null va false kichik harfda.

Kontraktni buzmasdan o‘zgartirish

Yangi maydon qo‘shish

Odatda orqaga mos (backward compatible): eski mijozlar uni e’tiborsiz qoldiradi

Olib tashlash yoki ma’nosini o‘zgartirish

Buzuvchi o‘zgarish (breaking change)

Yangi versiya

/api/v1/ -> /api/v2/, v1 uchun «deprecation» va ko‘chish muddati

02

Yagona Xatolik Konverti (Error Envelope)

Har qanday xatolikda mijoz tushunadigan standart javob formati

Error Envelope standarti

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Kiritilgan ma'lumotlarda xatolik bor.",
    "details": [
      {
        "field": "email",
        "issue": "Email formati noto'g'ri."
      },
      {
        "field": "price",
        "issue": "Narx 0 dan katta bo'lishi shart."
      }
    ]
  }
}

Paginatsiya (Sahifalash) javobi

{
  "data": [
    {"id": 21, "title": "Clean Code", "author": "R. Martin"},
    {"id": 22, "title": "Design Patterns", "author": "GoF"}
  ],
  "meta": {
    "limit": 10,
    "offset": 20,
    "total_items": 142,
    "total_pages": 15,
    "current_page": 3
  }
}

Paginatsiya: offset yoki cursor?

?limit=20&offset=40

Sodda, kichik hajm uchun yetarli. Lekin ro‘yxatga yangi yozuv qo‘shilsa, sahifalar «suriladi».

?cursor=...

Javobda next_cursor keladi. Katta va tez o‘zgaruvchan oqimlarda barqarorroq.

Filtr: status=paid, saralash: sort=-created_at (minus - teskari).

Bashorat qiling

So‘rovda title yo‘q, year esa matn. Server nima qaytarishi kerak?

Mijoz xatosi - 4xx. Yagona konvert: code, message, details. Stack trace mijozga chiqmaydi.
03

API Xavfsizligi va Himoya choralari

Autentifikatsiya, CORS, Rate Limit va maxfiy ma'lumotlarni yashirish

401 Unauthorized vs 403 Forbidden

401 Unauthorized

«Siz kimsiz?» — So'rovda token yoki login ma'lumotlari yo'q, yaroqsiz yoki muddati o'tgan.

Authorization: Bearer <token>

403 Forbidden

«Sizga mumkin emas!» — Server sizning kimligingizni biladi, lekin bu amalga (masalan admin paneliga) ruxsat yo'q.

CORS va Rate Limiting (429)

CORS (Cross-Origin Resource Sharing)

Brauzer xavfsizligi: boshqa domen (masalan frontend.uz) sizning API (api.uz) ga murojaat qila olishini boshqarish.

Access-Control-Allow-Origin: https://frontend.uz

Rate Limiting — 429

DDoS va suiiste'mollikdan himoya: bitta IP yoki foydalanuvchiga daqiqasiga 60 ta so'rov chegarasi.

429 Too Many Requests (Retry-After: 30)

Katta xavf: Maxfiy maydonlar chiqib ketishi

# XATOLIK: Barcha maydonlarni to'g'ridan-to'g'ri qaytarish
def get_user_bad(user):
    return user.__dict__  # password_hash, salt, sirlar chiqib ketadi!

# TO'G'RI: Faqat xavfsiz ochiq maydonlarni tanlab JSON qilish (DTO)
def get_user_secure(user):
    return {
        "id": user.id,
        "username": user.username,
        "email": user.email,
        "created_at": user.created_at.isoformat()
    }

Himoya qatlamlari (1.17-jadval)

TLS (HTTPS) Rate limiting · CORS · WAF Autentifikatsiya: Bearer / JWT Avtorizatsiya: RBAC Ma’lumot

401 yoki 403? Qaror daraxti

Bearer token bormi? yo‘q / noto‘g‘ri: 401 Roli yetarlimi? yo‘q: 403 ha: 200

Mini-test

check_access("Bearer tok-ali", "admin") nima qaytaradi? (tok-ali - reader)

Token to‘g‘ri - kimligi ma’lum. Lekin roli reader, admin kerak - ruxsat yo‘q: 403.

Odatiy xatolar

Sir javobda

password_hash, token javobga chiqib ketadi

CORS *

Hamma domenga ruxsat: aniq domenlar ro‘yxati kerak

Pul float da

Yaxlitlash xatosi: tiyinda butun son yoki decimal satr

0
JSON turi
0
himoya komponenti

Mini-loyiha: Kutubxona API yakuni

Endpoints

GET /api/v1/books
POST /api/v1/books
GET /api/v1/books/{id}
DELETE /api/v1/books/{id}

Himoyalangan

Bearer JWT token tekshiruvi, xato holatlarida yagona Error Envelope va maydonlar filtri.

Testlangan

pytest va curl yordamida barcha status kodlari va xatolik holatlari tekshirilgan.

4-hafta xulosasi

10-dars: Observer

Hodisalarga asoslangan arxitektura va EventBus orqali bo'sh bog'liqlik.

11-dars: REST & HTTP

Resurslar, URI qoidalari, HTTP metodlari va idempotentlik.

12-dars: JSON & Security

Kontrakt intizomi, Error envelope, 401/403 va xavfsizlik choralari.