IlmHamroh
Python kursi/Web backend FastAPI2/16-dars16 daqiqa
Mundarija (22)

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/kurslar

Qoidalar

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 API

4. Batafsil misollar

Misollarda REST tamoyillari resurs va endpoint dizayni orqali ko'rsatiladi.

Misol 1 — Resurs URI dizayni

python
"""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:

text
=== 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 mumkin

Nima ko'rsatdi: 2.1, 2.2-bo'limlar.

Misol 2 — CRUD: metod + resurs

python
"""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:

text
=== 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   → DELETE

Nima ko'rsatdi: 2.3, 2.4-bo'limlar.

Misol 3 — Filtr, sahifalash va ichma-ich resurslar

python
"""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:

text
=== 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 belgilaydi

Nima 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.

python
"""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:

text
=== 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 API

Nima 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                  # ✅ iyerarxik

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

  1. Resurslar — otlar, ko'plikda (/kurslar).

  2. Amalni metod bildiradi (GET/POST/PUT/DELETE), URI emas.

  3. Bir xil URI, turli metod (CRUD naqshi).

  4. Mos status kodlar (201 yaratildi, 404 topilmadi, 204 o'chirildi).

  5. Filtr/saralash/sahifalash — so'rov parametrlari.

  6. Ichma-ich resurslar iyerarxiyani ko'rsatsin (/kurslar/5/darslar).

  7. API ni versiyalang (/v1/).

  8. 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=python
Javoblar
  1. GET /foydalanuvchilar
  2. POST /buyurtmalar
  3. GET /buyurtmalar/7
  4. DELETE /foydalanuvchilar/{id}
  5. GET /foydalanuvchilar/3/buyurtmalar
  6. GET /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
  1. 201 Created
  2. 404 Not Found
  3. 204 No Content
  4. 200 OK
  5. 400 Bad Request (yoki 422)
  6. 200 OK

Vazifa 3: API loyihalash

"Kutubxona" API sini RESTful loyihalang:

  1. Resurslar: kitoblar, mualliflar, ijaralar
  2. Har resurs uchun CRUD endpointlar
  3. Ichma-ich (muallif kitoblari)
  4. Filtr va sahifalash

Vazifa 4: REST tekshiruvchi

Endpoint ro'yxatini tekshiring:

  1. Fe'lli URI larni toping
  2. Nomuvofiq status kodlarni
  3. Birlik resurs nomlarini
  4. Tavsiyalar bering

Vazifa 5: Versiyalash strategiyasi

  1. URI versiyalash (/v1/) vs sarlavha versiyalash
  2. Buzuvchi o'zgarishda migratsiya
  3. Eski versiyani qo'llab-quvvatlash
  4. Afzallik/kamchilik

Vazifa 6: HATEOAS

REST'ning ilg'or tamoyili (havolalar):

  1. Javobga bog'liq resurs havolalarini qo'shing
  2. {"id": 5, "_links": {"darslar": "/kurslar/5/darslar"}}
  3. Mijoz havolalar orqali navigatsiya qilsin
  4. 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

  1. Mavjud infratuzilmaga mos yechim g'olib bo'ladi
  2. Tabiiy abstraktsiya (resurs) qabul qilinadi
  3. Oddiylik — keng tarqalishning kaliti
  4. Muqobillar aniq holatda, REST umumiy uchun

6. Xulosa

  1. REST vebning HTTP/URL infratuzilmasiga mos keladi
  2. "Resurs" — veb uchun tabiiy abstraktsiya
  3. Oddiylik va universallik uni standart qildi
  4. 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:

  1. 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.

  2. 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.

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
20.2-dars: REST tamoyillari — IlmHamroh