JSON turlari · Error Envelope · Paginatsiya · Bearer/JWT · CORS va Rate Limit
11-sinfProfessional IT4-hafta · 12-darsJSON 6 turi, Python'da serializatsiya, ISO-8601 vaqt va pul birliklari.
Yagona xatolik konverti, maydonlar validatsiyasi va paginatsiya dizayni.
JWT/Bearer token, 401 vs 403, CORS, Rate limiting va maxfiy sirlar.
Universal ma'lumot formati va uning arxitektura qoidalari
"Clean Code" (qo'shtirnoq shart!)150000 yoki 19.99 (float/int bitta)true / false (kichik harfda)null (mavjud emaslik){"id": 1, "name": "Ali"}["kitob", "qalam"]Eslatma: Python'dagi None → JSON'da null, True → true bo'ladi.
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.
Float hisob-kitoblarda xatolik beradi (0.1 + 0.2 != 0.3):
"amount_cents": 15000000
150 000 so'm tiyinlarda yoki eng kichik birlikda saqlanadi.
Qaysi yozuv to‘g‘ri JSON?
null va false kichik harfda.Odatda orqaga mos (backward compatible): eski mijozlar uni e’tiborsiz qoldiradi
Buzuvchi o‘zgarish (breaking change)
/api/v1/ -> /api/v2/, v1 uchun «deprecation» va ko‘chish muddati
Har qanday xatolikda mijoz tushunadigan standart javob formati
{
"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."
}
]
}
}
{
"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
}
}
?limit=20&offset=40Sodda, 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).
So‘rovda title yo‘q, year esa matn. Server nima qaytarishi kerak?
code, message, details. Stack trace mijozga chiqmaydi.Autentifikatsiya, CORS, Rate Limit va maxfiy ma'lumotlarni yashirish
«Siz kimsiz?» — So'rovda token yoki login ma'lumotlari yo'q, yaroqsiz yoki muddati o'tgan.
Authorization: Bearer <token>
«Sizga mumkin emas!» — Server sizning kimligingizni biladi, lekin bu amalga (masalan admin paneliga) ruxsat yo'q.
Brauzer xavfsizligi: boshqa domen (masalan frontend.uz) sizning API (api.uz) ga murojaat qila olishini boshqarish.
Access-Control-Allow-Origin: https://frontend.uz
DDoS va suiiste'mollikdan himoya: bitta IP yoki foydalanuvchiga daqiqasiga 60 ta so'rov chegarasi.
429 Too Many Requests (Retry-After: 30)
# 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()
}
check_access("Bearer tok-ali", "admin") nima qaytaradi? (tok-ali - reader)
reader, admin kerak - ruxsat yo‘q: 403.password_hash, token javobga chiqib ketadi
*Hamma domenga ruxsat: aniq domenlar ro‘yxati kerak
float daYaxlitlash xatosi: tiyinda butun son yoki decimal satr
GET /api/v1/booksPOST /api/v1/booksGET /api/v1/books/{id}DELETE /api/v1/books/{id}
Bearer JWT token tekshiruvi, xato holatlarida yagona Error Envelope va maydonlar filtri.
pytest va curl yordamida barcha status kodlari va xatolik holatlari tekshirilgan.
Hodisalarga asoslangan arxitektura va EventBus orqali bo'sh bog'liqlik.
Resurslar, URI qoidalari, HTTP metodlari va idempotentlik.
Kontrakt intizomi, Error envelope, 401/403 va xavfsizlik choralari.