Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. REST va resurslar
- 2.2. Resurs URI lari
- 2.3. Metod + resurs = CRUD
- 2.4. Status kodlar REST'da
- 2.5. Holatsizlik (statelessness)
- 2.6. So'rov parametrlari
- 2.7. Javob formati va versiyalash
- 2.8. Keng tarqalgan REST xatolari
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Resurs URI dizayni
- Misol 2 — CRUD: metod + resurs
- Misol 3 — Filtr, sahifalash va ichma-ich resurslar
- Misol 4 — Amaliy: RESTful API loyihalash
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
20.2-dars: REST tamoyillari
20-QISM — WEB-BACKEND (FastAPI) · 2-dars
1. Kirish va motivatsiya
O'tgan darsda HTTP ni o'rgandik — metodlar, status kodlar. Endi ulardan izchil, tushunarli API qurishning uslubini o'rganamiz: REST (Representational State Transfer). REST — API loyihalashning eng keng tarqalgan uslubi: u HTTP metodlari va status kodlarini resurslar bilan izchil bog'lab, bashoratli, o'rganish oson API yaratadi. pip, GitHub, Twitter — deyarli barcha zamonaviy API REST uslubida.
REST — qat'iy standart emas, tamoyillar to'plami. Ularga amal qilgan API "RESTful" deyiladi va foydalanuvchilar uni intuitiv tushunadi.
Real vaziyat. Bir jamoa API yozdi, lekin REST tamoyillariga amal qilmasdi: /getKurslar, /createKurs, /deleteKursById?id=5 — har amal uchun alohida, nomuvofiq yo'l. Frontend dasturchisi har endpoint uchun hujjatni o'qishga majbur edi, chunki naqsh yo'q edi. Ular RESTga o'tdi: /kurslar (GET — ro'yxat, POST — yaratish), /kurslar/5 (GET — bitta, PUT — yangilash, DELETE — o'chirish). Endi naqsh bashoratli: frontend dasturchisi yangi resurs (/oqituvchilar) URL larini hujjatsiz taxmin qila olardi. Izchillik API ni intuitiv qildi.
Bu darsda REST tamoyillarini — izchil API loyihalashni o'rganamiz.
Bu darsda:
- REST nima va resurslar
- Resurs URI lari (naming)
- HTTP metodlari + resurslar (CRUD)
- Status kodlar REST'da
- Holatsizlik (statelessness)
- So'rov parametrlari (filtr, sahifalash)
- Keng tarqalgan REST xatolari
- Amaliy: RESTful API loyihalash
ℹ Misollarda REST tamoyillari resurs va endpoint dizayni orqali ko'rsatiladi (stdlib).
2. Nazariya — chuqur tushuntirish
2.1. REST va resurslar
REST'da hamma narsa resurs — nomga ega obyekt (kurs, foydalanuvchi, buyurtma):
| Tushuncha | Misol |
|---|---|
| Resurs | Kurs, foydalanuvchi |
| Resurs to'plami | Barcha kurslar (/kurslar) |
| Bitta resurs | Bitta kurs (/kurslar/5) |
| URI | Resurs manzili |
REST'ning asosiy g'oyasi: fe'l (amal) emas, ot (resurs). /getKurslar (fe'l) emas, /kurslar (ot); amalni HTTP metod bildiradi (GET, POST).
2.2. Resurs URI lari
Yaxshi REST URI — otlar, ko'plikda, iyerarxik:
| Yaxshi | Yomon |
|---|---|
/kurslar |
/getKurslar |
/kurslar/5 |
/kurs?id=5 |
/kurslar/5/darslar |
/kursDarslari?kursId=5 |
/foydalanuvchilar |
/user_list |
Qoidalar: otlar (fe'l emas), ko'plik (/kurslar), iyerarxiya (/kurslar/5/darslar), kichik harf, tire (-). Naqsh bashoratli bo'lsin.
2.3. Metod + resurs = CRUD
HTTP metodlari resurslar bilan CRUD (Create-Read-Update-Delete) ni bildiradi:
| Metod | URI | Amal | Status |
|---|---|---|---|
| GET | /kurslar |
Barchasini o'qish | 200 |
| GET | /kurslar/5 |
Bittasini o'qish | 200 / 404 |
| POST | /kurslar |
Yaratish | 201 |
| PUT | /kurslar/5 |
To'liq yangilash | 200 |
| PATCH | /kurslar/5 |
Qisman yangilash | 200 |
| DELETE | /kurslar/5 |
O'chirish | 204 / 404 |
Bu — REST'ning yuragi: bir xil URI (/kurslar/5), turli metod, turli amal. Naqsh har resurs uchun bir xil.
2.4. Status kodlar REST'da
| Holat | Kod |
|---|---|
| GET/PUT/PATCH muvaffaqiyatli | 200 OK |
| POST yaratildi | 201 Created |
| DELETE muvaffaqiyatli | 204 No Content |
| Resurs topilmadi | 404 Not Found |
| Noto'g'ri ma'lumot | 400/422 |
| Ruxsat yo'q | 401/403 |
To'g'ri status kod 20.1-bob REST'ning bir qismi: mijoz javob turini koddan biladi.
2.5. Holatsizlik (statelessness)
REST holatsiz: har so'rov mustaqil, o'zida barcha kerakli ma'lumotni (autentifikatsiya, kontekst) tashiydi:
| Holatli | Holatsiz (REST) |
|---|---|
| Server sessiyani eslaydi | Har so'rov o'zini tanitadi |
| Miqyoslash qiyin | Oson (20.1) |
| Server band | Yengil |
Holatsizlik — har so'rov Authorization sarlavhasini tashiydi (server oldingi so'rovni eslamaydi). Bu miqyoslanishni oson qiladi.
2.6. So'rov parametrlari
To'plamni filtrlash, saralash, sahifalash uchun so'rov parametrlari 20.1-bob:
GET /kurslar?til=uz&daraja=boshlangich # filtr
GET /kurslar?sort=nom&order=asc # saralash
GET /kurslar?sahifa=2&hajm=20 # sahifalash So'rov parametrlari — resurs URI ni o'zgartirmasdan to'plamni sozlash. Yo'l (/kurslar) resursni, parametrlar (?til=uz) uni qanday ko'rsatishni belgilaydi.
2.7. Javob formati va versiyalash
| Amaliyot | Tafsilot |
|---|---|
| JSON | Standart javob formati (16.2) |
| Izchil struktura | Bir xil xato/muvaffaqiyat formati |
| Versiyalash | /v1/kurslar yoki sarlavha |
| Ichma-ich resurslar | /kurslar/5/darslar |
API versiyalash (/v1/) — buzuvchi o'zgarish 19.5-bob bo'lsa eski mijozlarni buzmaslik uchun.
2.8. Keng tarqalgan REST xatolari
| Xato | To'g'risi |
|---|---|
Fe'lli URI (/getKurslar) |
Otli (/kurslar + GET) |
| Har amalda 200 | Mos status kod |
Birlikda (/kurs) |
Ko'plikda (/kurslar) |
| GET bilan o'zgartirish | GET xavfsiz |
| Holat serverda | Holatsiz (har so'rov mustaqil) |
| Nomuvofiq naqsh | Izchil URI/metod/status |
3. Tez ma'lumotnoma
Resurs URI: /kurslar (ko'plik, ot)
GET /kurslar → ro'yxat (200)
POST /kurslar → yaratish (201)
GET /kurslar/5 → bitta (200/404)
PUT /kurslar/5 → yangilash (200)
DELETE /kurslar/5 → o'chirish (204)
filtr: /kurslar?til=uz
sahifalash: /kurslar?sahifa=2&hajm=20
ichma-ich: /kurslar/5/darslar
versiya: /v1/kurslarQoidalar
resurs = ot (fe'l emas): /kurslar, /getKurslar emas
ko'plik, iyerarxik, kichik harf
metod = amal (GET o'qish, POST yaratish, DELETE o'chirish)
mos status kod (201, 404, 204)
holatsiz — har so'rov mustaqil
filtr/sahifalash — so'rov parametrlari
izchil naqsh — bashoratli API4. Batafsil misollar
Misollarda REST tamoyillari resurs va endpoint dizayni orqali ko'rsatiladi.
Misol 1 — Resurs URI dizayni
"""REST URI: ot (fe'l emas), ko'plik, iyerarxik; yomon (RPC uslubi) va yaxshi (REST) URI; naqsh bashoratliligi."""
def main() -> None:
print("=== 1. Yomon (RPC uslubi) vs yaxshi (REST) ===")
juftlar = [
("/getKurslar", "/kurslar (GET)"),
("/createKurs", "/kurslar (POST)"),
("/deleteKursById?id=5", "/kurslar/5 (DELETE)"),
("/updateKurs", "/kurslar/5 (PUT)"),
("/kursDarslari?kursId=5", "/kurslar/5/darslar (GET)"),
]
for yomon, yaxshi in juftlar:
print(f" ❌ {yomon:28} → ✅ {yaxshi}")
print("\n=== 2. URI qoidalari ===")
qoidalar = [
"Ot, fe'l emas (amalni metod bildiradi)",
"Ko'plik (/kurslar, /kurs emas)",
"Iyerarxik (/kurslar/5/darslar)",
"Kichik harf, tire (-)",
"So'rov parametri filtr uchun (?til=uz)",
]
for i, qoida in enumerate(qoidalar, 1):
print(f" {i}. {qoida}")
print("\n=== 3. Bashoratlilik ===")
print(" /kurslar naqshini bilib, boshqa resurslarni taxmin qilish mumkin:")
for resurs in ["oqituvchilar", "talabalar", "darslar"]:
print(f" GET /{resurs}, POST /{resurs}, GET /{resurs}/1, DELETE /{resurs}/1")
print(" ⭐ izchil naqsh — hujjatsiz taxmin qilish mumkin")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Yomon (RPC uslubi) vs yaxshi (REST) ===
❌ /getKurslar → ✅ /kurslar (GET)
❌ /createKurs → ✅ /kurslar (POST)
❌ /deleteKursById?id=5 → ✅ /kurslar/5 (DELETE)
❌ /updateKurs → ✅ /kurslar/5 (PUT)
❌ /kursDarslari?kursId=5 → ✅ /kurslar/5/darslar (GET)
=== 2. URI qoidalari ===
1. Ot, fe'l emas (amalni metod bildiradi)
2. Ko'plik (/kurslar, /kurs emas)
3. Iyerarxik (/kurslar/5/darslar)
4. Kichik harf, tire (-)
5. So'rov parametri filtr uchun (?til=uz)
=== 3. Bashoratlilik ===
/kurslar naqshini bilib, boshqa resurslarni taxmin qilish mumkin:
GET /oqituvchilar, POST /oqituvchilar, GET /oqituvchilar/1, DELETE /oqituvchilar/1
GET /talabalar, POST /talabalar, GET /talabalar/1, DELETE /talabalar/1
GET /darslar, POST /darslar, GET /darslar/1, DELETE /darslar/1
⭐ izchil naqsh — hujjatsiz taxmin qilish mumkinNima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — CRUD: metod + resurs
"""CRUD amallar: GET/POST/PUT/PATCH/DELETE + resurs URI; har amal mos metod va status kod; bir xil URI, turli metod."""
from http import HTTPStatus
def main() -> None:
print("=== 1. Kurslar resursi uchun CRUD ===")
amallar = [
("GET", "/kurslar", 200, "barcha kurslar (Read)"),
("POST", "/kurslar", 201, "yangi kurs (Create)"),
("GET", "/kurslar/5", 200, "bitta kurs (Read)"),
("PUT", "/kurslar/5", 200, "to'liq yangilash (Update)"),
("PATCH", "/kurslar/5", 200, "qisman yangilash (Update)"),
("DELETE", "/kurslar/5", 204, "o'chirish (Delete)"),
]
print(f" {'Metod':7} {'URI':16} {'Kod':4} {'Amal'}")
for metod, uri, kod, amal in amallar:
print(f" {metod:7} {uri:16} {kod:4} {amal}")
print("\n=== 2. Bir xil URI, turli metod ===")
print(" /kurslar/5 :")
print(" GET → bitta kursni o'qish")
print(" PUT → kursni yangilash")
print(" DELETE → kursni o'chirish")
print(" ⭐ URI resursni, metod amalni bildiradi")
print("\n=== 3. Xato holatlari ===")
xatolar = [
("GET", "/kurslar/999", 404, "yo'q kurs"),
("POST", "/kurslar", 400, "noto'g'ri ma'lumot"),
("DELETE", "/kurslar/999", 404, "yo'q kursni o'chirish"),
]
for metod, uri, kod, tavsif in xatolar:
print(f" {metod:7} {uri:16} → {kod} {HTTPStatus(kod).phrase} ({tavsif})")
print("\n=== 4. CRUD → HTTP xaritasi ===")
xarita = {"Create": "POST", "Read": "GET", "Update": "PUT/PATCH", "Delete": "DELETE"}
for crud, metod in xarita.items():
print(f" {crud:8} → {metod}")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Kurslar resursi uchun CRUD ===
Metod URI Kod Amal
GET /kurslar 200 barcha kurslar (Read)
POST /kurslar 201 yangi kurs (Create)
GET /kurslar/5 200 bitta kurs (Read)
PUT /kurslar/5 200 to'liq yangilash (Update)
PATCH /kurslar/5 200 qisman yangilash (Update)
DELETE /kurslar/5 204 o'chirish (Delete)
=== 2. Bir xil URI, turli metod ===
/kurslar/5 :
GET → bitta kursni o'qish
PUT → kursni yangilash
DELETE → kursni o'chirish
⭐ URI resursni, metod amalni bildiradi
=== 3. Xato holatlari ===
GET /kurslar/999 → 404 Not Found (yo'q kurs)
POST /kurslar → 400 Bad Request (noto'g'ri ma'lumot)
DELETE /kurslar/999 → 404 Not Found (yo'q kursni o'chirish)
=== 4. CRUD → HTTP xaritasi ===
Create → POST
Read → GET
Update → PUT/PATCH
Delete → DELETENima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — Filtr, sahifalash va ichma-ich resurslar
"""so'rov parametrlari: filtr, saralash, sahifalash; ichma-ich resurslar (/kurslar/5/darslar); versiyalash; URI va parametr farqi."""
from urllib.parse import parse_qs, urlparse
def main() -> None:
print("=== 1. Filtr ===")
url = "/kurslar?til=uz&daraja=boshlangich"
params = parse_qs(urlparse(url).query)
print(f" {url}")
print(f" filtrlar: {dict((k, v[0]) for k, v in params.items())}")
print("\n=== 2. Saralash ===")
url = "/kurslar?sort=nom&order=asc"
params = parse_qs(urlparse(url).query)
print(f" {url}")
print(f" saralash: {params['sort'][0]} bo'yicha {params['order'][0]}")
print("\n=== 3. Sahifalash ===")
url = "/kurslar?sahifa=2&hajm=20"
params = parse_qs(urlparse(url).query)
sahifa = int(params["sahifa"][0])
hajm = int(params["hajm"][0])
print(f" {url}")
print(f" sahifa {sahifa}, hajm {hajm} → {(sahifa - 1) * hajm}-{sahifa * hajm} yozuvlar")
print("\n=== 4. Ichma-ich resurslar ===")
print(" /kurslar/5/darslar → 5-kursning darslari")
print(" /kurslar/5/darslar/3 → 5-kursning 3-darsi")
print(" /foydalanuvchilar/7/buyurtmalar → 7-foydalanuvchi buyurtmalari")
print(" ⭐ iyerarxiya — resurslar orasidagi bog'lanishni ko'rsatadi")
print("\n=== 5. Versiyalash ===")
print(" /v1/kurslar → 1-versiya (buzuvchi o'zgarishda /v2/)")
print(" ⭐ URI resursni, parametr sozlashni, versiya moslikni belgilaydi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Filtr ===
/kurslar?til=uz&daraja=boshlangich
filtrlar: {'til': 'uz', 'daraja': 'boshlangich'}
=== 2. Saralash ===
/kurslar?sort=nom&order=asc
saralash: nom bo'yicha asc
=== 3. Sahifalash ===
/kurslar?sahifa=2&hajm=20
sahifa 2, hajm 20 → 20-40 yozuvlar
=== 4. Ichma-ich resurslar ===
/kurslar/5/darslar → 5-kursning darslari
/kurslar/5/darslar/3 → 5-kursning 3-darsi
/foydalanuvchilar/7/buyurtmalar → 7-foydalanuvchi buyurtmalari
⭐ iyerarxiya — resurslar orasidagi bog'lanishni ko'rsatadi
=== 5. Versiyalash ===
/v1/kurslar → 1-versiya (buzuvchi o'zgarishda /v2/)
⭐ URI resursni, parametr sozlashni, versiya moslikni belgilaydiNima ko'rsatdi: 2.6, 2.7-bo'limlar.
Misol 4 — Amaliy: RESTful API loyihalash
To'liq blog API sini REST tamoyillari bilan loyihalaymiz: postlar va izohlar resurslari, CRUD amallar, ichma-ich resurslar, filtr va sahifalash. Har endpoint uchun to'g'ri metod, URI va status kod tanlaymiz. Bu — FastAPI (20.3+) da amalga oshiriladigan dizayn.
"""to'liq blog API dizayni: postlar va izohlar resurslari; CRUD; ichma-ich (post izohlari); filtr/sahifalash; har endpoint mos metod+URI+status."""
from http import HTTPStatus
def endpoint_jadval() -> list[tuple]:
return [
# (metod, URI, status, tavsif)
("GET", "/v1/postlar", 200, "barcha postlar (filtr, sahifalash)"),
("POST", "/v1/postlar", 201, "yangi post yaratish"),
("GET", "/v1/postlar/5", 200, "bitta post"),
("PUT", "/v1/postlar/5", 200, "postni yangilash"),
("DELETE", "/v1/postlar/5", 204, "postni o'chirish"),
("GET", "/v1/postlar/5/izohlar", 200, "postning izohlari"),
("POST", "/v1/postlar/5/izohlar", 201, "izoh qo'shish"),
("DELETE", "/v1/postlar/5/izohlar/3", 204, "izohni o'chirish"),
]
def main() -> None:
endpointlar = endpoint_jadval()
print("=== 1. Blog API endpointlari ===")
print(f" {'Metod':7} {'URI':28} {'Kod':4} {'Amal'}")
for metod, uri, kod, amal in endpointlar:
print(f" {metod:7} {uri:28} {kod:4} {amal}")
print("\n=== 2. Resurslar ===")
resurslar = set()
for _, uri, *_ in endpointlar:
qismlar = [q for q in uri.split("/") if q and not q.startswith("v") and not q.isdigit()]
resurslar.update(qismlar)
print(f" resurslar: {sorted(resurslar)}")
print("\n=== 3. Metodlar taqsimoti ===")
from collections import Counter
metodlar = Counter(m for m, *_ in endpointlar)
for metod, soni in sorted(metodlar.items()):
print(f" {metod}: {soni}")
print("\n=== 4. Filtr va sahifalash namunasi ===")
print(" GET /v1/postlar?muallif=aziz&sahifa=1&hajm=10")
print(" GET /v1/postlar?teg=python&sort=sana&order=desc")
print("\n=== 5. REST tamoyillari qo'llanildi ===")
print(" ✅ otli resurslar (postlar, izohlar)")
print(" ✅ metod = amal (GET/POST/PUT/DELETE)")
print(" ✅ mos status kodlar (200/201/204/404)")
print(" ✅ ichma-ich resurslar (postlar/5/izohlar)")
print(" ✅ versiyalash (/v1/)")
print(" ⭐ izchil, bashoratli, RESTful API")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Blog API endpointlari ===
Metod URI Kod Amal
GET /v1/postlar 200 barcha postlar (filtr, sahifalash)
POST /v1/postlar 201 yangi post yaratish
GET /v1/postlar/5 200 bitta post
PUT /v1/postlar/5 200 postni yangilash
DELETE /v1/postlar/5 204 postni o'chirish
GET /v1/postlar/5/izohlar 200 postning izohlari
POST /v1/postlar/5/izohlar 201 izoh qo'shish
DELETE /v1/postlar/5/izohlar/3 204 izohni o'chirish
=== 2. Resurslar ===
resurslar: ['izohlar', 'postlar']
=== 3. Metodlar taqsimoti ===
DELETE: 2
GET: 3
POST: 2
PUT: 1
=== 4. Filtr va sahifalash namunasi ===
GET /v1/postlar?muallif=aziz&sahifa=1&hajm=10
GET /v1/postlar?teg=python&sort=sana&order=desc
=== 5. REST tamoyillari qo'llanildi ===
✅ otli resurslar (postlar, izohlar)
✅ metod = amal (GET/POST/PUT/DELETE)
✅ mos status kodlar (200/201/204/404)
✅ ichma-ich resurslar (postlar/5/izohlar)
✅ versiyalash (/v1/)
⭐ izchil, bashoratli, RESTful APINima ko'rsatdi: 2.1–2.7-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
"URI fe'l bo'lsin (/getKurslar)" |
Ot (/kurslar), amalni metod bildiradi |
| "Har amal alohida URI" | Bir URI, turli metod (CRUD) |
"Birlikda (/kurs)" |
Ko'plikda (/kurslar) |
| "REST — qat'iy standart" | Tamoyillar to'plami |
| "Holat serverda saqlanadi" | Holatsiz (har so'rov mustaqil) |
"Filtr yo'lda (/kurslar/uz)" |
So'rov parametrida (?til=uz) |
| "Versiyalash keraksiz" | Buzuvchi o'zgarish uchun (/v1/) |
| "Har amalga 200" | Mos status kod (201/204/404) |
6. Keng tarqalgan xatolar va yechimlari
1. Fe'lli URI
GET /getKurslar # ❌ RPC uslubi
GET /kurslar # ✅ REST (metod amalni bildiradi)2. Birlik resurs nomi
GET /kurs # ⚠️ ko'plik afzal
GET /kurslar # ✅3. GET bilan o'zgartirish
GET /kurslar/5/ochir # ❌ GET xavfsiz emas
DELETE /kurslar/5 # ✅4. Filtrni yo'lda
GET /kurslar/til/uz # ⚠️ filtr — parametr
GET /kurslar?til=uz # ✅5. Nomuvofiq status kod
POST → 200; DELETE → 200 # ⚠️ nomuvofiq
POST → 201; DELETE → 204 # ✅6. Ichma-ich resursni tekislash
GET /kursDarslari?kursId=5 # ❌
GET /kurslar/5/darslar # ✅ iyerarxik7. Versiyasiz API
/kurslar (versiyasiz) # ⚠️ buzuvchi o'zgarishda muammo
/v1/kurslar # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 20.1-dars (o'tilgan): HTTP — REST metod/status'ga asoslanadi
- 20.4-dars: FastAPI route — REST endpointlar
- 20.9-dars: CRUD — REST amallar
- 16.2-dars (o'tilgan): JSON — REST javob formati
- 26.7-dars: API integratsiyasi — RESTful mijoz
8. Eng yaxshi amaliyotlar
Resurslar — otlar, ko'plikda (
/kurslar).Amalni metod bildiradi (GET/POST/PUT/DELETE), URI emas.
Bir xil URI, turli metod (CRUD naqshi).
Mos status kodlar (201 yaratildi, 404 topilmadi, 204 o'chirildi).
Filtr/saralash/sahifalash — so'rov parametrlari.
Ichma-ich resurslar iyerarxiyani ko'rsatsin (
/kurslar/5/darslar).API ni versiyalang (
/v1/).Holatsiz: har so'rov o'zini tanitsin.
9. Amaliy topshiriq
Vazifa 1: URI ni tuzating
RPC uslubidagi URI ni RESTful qiling:
1. GET /getFoydalanuvchilar
2. POST /createBuyurtma
3. GET /getBuyurtmaById?id=7
4. POST /deleteFoydalanuvchi
5. GET /foydalanuvchiBuyurtmalari?userId=3
6. GET /searchKurslar?q=pythonJavoblar
GET /foydalanuvchilarPOST /buyurtmalarGET /buyurtmalar/7DELETE /foydalanuvchilar/{id}GET /foydalanuvchilar/3/buyurtmalarGET /kurslar?q=python(qidiruv — parametr)
Vazifa 2: Status kodni tanlang
Har amalga mos status kod:
1. POST /kurslar (yaratildi)
2. GET /kurslar/999 (yo'q)
3. DELETE /kurslar/5 (o'chirildi)
4. PUT /kurslar/5 (yangilandi)
5. POST /kurslar (noto'g'ri ma'lumot)
6. GET /kurslar (ro'yxat)Javoblar
201 Created404 Not Found204 No Content200 OK400 Bad Request(yoki 422)200 OK
Vazifa 3: API loyihalash
"Kutubxona" API sini RESTful loyihalang:
- Resurslar: kitoblar, mualliflar, ijaralar
- Har resurs uchun CRUD endpointlar
- Ichma-ich (muallif kitoblari)
- Filtr va sahifalash
Vazifa 4: REST tekshiruvchi
Endpoint ro'yxatini tekshiring:
- Fe'lli URI larni toping
- Nomuvofiq status kodlarni
- Birlik resurs nomlarini
- Tavsiyalar bering
Vazifa 5: Versiyalash strategiyasi
- URI versiyalash (
/v1/) vs sarlavha versiyalash - Buzuvchi o'zgarishda migratsiya
- Eski versiyani qo'llab-quvvatlash
- Afzallik/kamchilik
Vazifa 6: HATEOAS
REST'ning ilg'or tamoyili (havolalar):
- Javobga bog'liq resurs havolalarini qo'shing
{"id": 5, "_links": {"darslar": "/kurslar/5/darslar"}}- Mijoz havolalar orqali navigatsiya qilsin
- Afzalliklarni muhokama qiling
Vazifa 7: O'ylash
REST 2000-yilda Roy Fielding tomonidan dissertatsiyada tavsiflandi va veb API standartiga aylandi. Lekin so'nggi yillarda GraphQL, gRPC kabi muqobillar paydo bo'ldi va REST ba'zi kamchiliklarda tanqid qilinadi. Nima uchun REST bunday keng tarqaldi, va uning "resurs" abstraktsiyasi veb bilan qanchalik tabiiy mos keladi?
Javob
Qisqa javob: REST keng tarqaldi, chunki u vebning mavjud infratuzilmasiga (HTTP, URL, keshlash) tabiiy mos keladi — yangi narsa o'ylab topmadi, HTTP ni to'g'ri ishlatdi. "Resurs" abstraktsiyasi vebda tabiiy: veb allaqachon URL bilan manzillangan resurslardan (sahifalar, rasmlar) iborat. REST shu modelni API ga kengaytirdi. Uning soddaligi va vebga mosligi uni standart qildi — GraphQL/gRPC ma'lum holatlarda yaxshiroq, lekin REST'ning umumiyligi va oddiyligi uni hukmron qoldiradi.
1. Nega REST keng tarqaldi
| Sabab | Tafsilot |
|---|---|
| HTTP'ga tabiiy | Mavjud protokolni ishlatadi |
| URL — resurs | Veb allaqachon shunday |
| Keshlash | HTTP keshi ishlaydi |
| Oddiy | O'rganish oson |
| Universal | Har til/vosita |
| Vositalar | Brauzer, curl, hamma |
2. "Resurs" abstraktsiyasi
Veb tabiatan resurslardan iborat:
- Sahifa — resurs (URL)
- Rasm — resurs
- API'da: kurs, foydalanuvchi — resurs
REST bu tabiiy modelni API ga olib keldi — mos keladi.
3. REST vs muqobillar
| Yondashuv | Kuchli tomoni |
|---|---|
| REST | Oddiy, universal, keshlanadi |
| GraphQL | Moslashuvchan so'rov (aynan kerakli ma'lumot) |
| gRPC | Tez, ikkilik, tiplar (30.14) |
4. Nega REST hukmron qoladi
| Omil | Tafsilot |
|---|---|
| Oddiylik | Ko'p holatda yetarli |
| Ekotizim | Vositalar, hujjat, tajriba |
| HTTP mosligi | Kesh, proxy, brauzer |
| Ta'lim | Ko'p dasturchi biladi |
5. Muhandislik saboqlari
- Mavjud infratuzilmaga mos yechim g'olib bo'ladi
- Tabiiy abstraktsiya (resurs) qabul qilinadi
- Oddiylik — keng tarqalishning kaliti
- Muqobillar aniq holatda, REST umumiy uchun
6. Xulosa
- REST vebning HTTP/URL infratuzilmasiga mos keladi
- "Resurs" — veb uchun tabiiy abstraktsiya
- Oddiylik va universallik uni standart qildi
- GraphQL/gRPC — maxsus holat, REST — umumiy
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda REST tamoyillarini — izchil API loyihalashni o'rgandik.
Eng muhim uch fikr:
REST'da hamma narsa resurs (ot, fe'l emas). REST'ning asosiy g'oyasi:
/getKurslar(fe'l) emas,/kurslar(ot) — amalni HTTP metod bildiradi. URI qoidalari: otlar, ko'plikda (/kurslar), iyerarxik (/kurslar/5/darslar), kichik harf. Izchil naqsh API ni bashoratli qiladi: bir resurs naqshini bilib, boshqalarini hujjatsiz taxmin qilish mumkin.Metod + resurs = CRUD. Bir xil URI (
/kurslar/5), turli metod, turli amal: GET (o'qish → 200/404), POST (yaratish → 201), PUT/PATCH (yangilash → 200), DELETE (o'chirish → 204). Bu REST'ning yuragi — har resurs uchun bir xil naqsh. To'g'ri status kod (201 yaratildi, 404 topilmadi, 204 o'chirildi) REST muloqotining bir qismi.Holatsizlik, so'rov parametrlari va versiyalash. REST holatsiz — har so'rov mustaqil, o'zida kerakli ma'lumotni (
Authorization) tashiydi (miqyoslanishni oson qiladi). Filtr, saralash, sahifalash — so'rov parametrlari (?til=uz&sahifa=2): yo'l resursni, parametrlar uni qanday ko'rsatishni belgilaydi. API ni versiyalang (/v1/) — buzuvchi o'zgarishda eski mijozlarni buzmaslik uchun. REST aynan vebning HTTP/URL infratuzilmasiga tabiiy mos kelgani uchun standart bo'ldi.
Keyingi darsda nihoyat FastAPI ga o'tamiz: birinchi veb-ilova, avtomatik hujjat, va nima uchun FastAPI zamonaviy Python veb-frameworklaridan eng mashhuri.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!