18. API va HTTP bilan ishlash

Zamonaviy dasturlar ko‘pincha boshqa dasturlar bilan ma’lumot almashadi.

Masalan, Softromeda dasturi:

ob-havo ma’lumotlarini olishi
foydalanuvchi ma’lumotlarini serverga yuborishi
to‘lov tizimi bilan bog‘lanishi
Telegram yoki boshqa xizmat bilan ishlashi
ma’lumotlarni tashqi serverdan olishi

mumkin.

Bunday vaziyatlarda HTTP va API tushunchalari juda muhim.

Bu bobda:

  • HTTP nima?
  • GET
  • POST
  • PUT
  • DELETE
  • requests
  • JSON API
  • API bilan amaliy loyiha

mavzularini o‘rganamiz.


HTTP nima?

HTTP — dasturlar orasida ma’lumot almashish uchun ishlatiladigan protokol.

Brauzer orqali saytga kirganimizda ham HTTP yoki HTTPS ishlatiladi.

Oddiy jarayon:

Python dasturi
      ↓
HTTP so‘rovi
      ↓
Server
      ↓
HTTP javobi
      ↓
Python dasturi

Masalan:

Softromeda
    ↓
"Foydalanuvchilarni ber"
    ↓
Server
    ↓
"Mana foydalanuvchilar"
    ↓
Softromeda

Mijoz va server

HTTP orqali aloqa qiladigan ikkita asosiy tomon mavjud:

Mijoz
Server

Mijoz — so‘rov yuboradi.

Server — so‘rovni qabul qilib, javob qaytaradi.

Masalan:

Python dasturi → mijoz

API serveri → server

HTTP so‘rovi

HTTP so‘rovida bir nechta muhim qismlar bo‘lishi mumkin:

metod
URL
sarlavhalar
parametrlar
tana

Masalan:

GET /foydalanuvchilar

Bu serverdan foydalanuvchilarni olishni anglatishi mumkin.


HTTP metodlari

Eng ko‘p ishlatiladigan HTTP metodlari:

GET
POST
PUT
DELETE

Ularning umumiy ma’nosi:

GET
    ma’lumot olish

POST
    yangi ma’lumot yaratish

PUT
    mavjud ma’lumotni yangilash

DELETE
    ma’lumotni o‘chirish

GET

GET serverdan ma’lumot olish uchun ishlatiladi.

Masalan:

GET /foydalanuvchilar

Server:

foydalanuvchilar ro‘yxatini

qaytarishi mumkin.

Python'da:

import requests

javob = requests.get(
    "https://example.com/foydalanuvchilar"
)

print(
    javob.status_code
)

requests

Python'da HTTP so‘rovlarini yuborish uchun mashhur kutubxonalardan biri:

requests

Agar tizimda mavjud bo‘lmasa:

pip install requests

orqali o‘rnatish mumkin.

Keyin:

import requests

deb ishlatiladi.


Javob holati

Server HTTP javobini holat kodi bilan qaytaradi.

Masalan:

200
201
400
401
403
404
500

Eng ko‘p uchraydiganlari:

200 → muvaffaqiyatli
201 → yangi ma’lumot yaratildi
400 → noto‘g‘ri so‘rov
401 → autentifikatsiya talab qilinadi
403 → ruxsat yo‘q
404 → topilmadi
500 → server xatosi

status_code

Python'da javob kodini:

javob.status_code

orqali olish mumkin.

import requests

javob = requests.get(
    "https://example.com"
)

print(
    f"Holat kodi: {javob.status_code}"
)

response

requests.get() natijasini odatda javob kabi o‘zgaruvchiga saqlaymiz.

import requests

javob = requests.get(
    "https://example.com"
)

print(
    javob
)

javob ichida serverdan kelgan ma’lumotlar mavjud bo‘ladi.


text

Server javobini oddiy matn sifatida olish:

import requests

javob = requests.get(
    "https://example.com"
)

print(
    javob.text
)

JSON javob

API'lar ko‘pincha JSON qaytaradi.

Masalan:

{
    "ism": "Ali",
    "yosh": 25
}

requests yordamida JSON'ni Python obyektiga aylantirish mumkin:

import requests

javob = requests.get(
    "https://example.com/foydalanuvchi"
)

ma'lumot = javob.json()

print(
    ma'lumot
)

Natija Python lug‘ati bo‘lishi mumkin:

{
    "ism": "Ali",
    "yosh": 25
}

POST

POST odatda serverga yangi ma’lumot yuborish uchun ishlatiladi.

Masalan:

import requests

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25
}

javob = requests.post(
    "https://example.com/foydalanuvchilar",
    json=foydalanuvchi
)

print(
    f"Holat kodi: {javob.status_code}"
)

Bu yerda:

json=foydalanuvchi

Python lug‘atini JSON ko‘rinishida serverga yuboradi.


PUT

PUT mavjud ma’lumotni yangilash uchun ishlatilishi mumkin.

import requests

yangilangan_ma'lumot = {
    "ism": "Ali",
    "yosh": 26
}

javob = requests.put(
    "https://example.com/foydalanuvchilar/1",
    json=yangilangan_ma'lumot
)

print(
    f"Holat kodi: {javob.status_code}"
)

DELETE

DELETE ma’lumotni o‘chirish uchun ishlatiladi.

import requests

javob = requests.delete(
    "https://example.com/foydalanuvchilar/1"
)

print(
    f"Holat kodi: {javob.status_code}"
)

CRUD

API'larda ko‘p uchraydigan CRUD amallari:

Create
Read
Update
Delete

HTTP bilan:

Create → POST
Read   → GET
Update → PUT
Delete → DELETE

Masalan:

POST   /foydalanuvchilar
GET    /foydalanuvchilar
PUT    /foydalanuvchilar/1
DELETE /foydalanuvchilar/1

URL

HTTP so‘rovi ma’lum URL manziliga yuboriladi.

Masalan:

https://api.softromeda.uz/foydalanuvchilar

URL odatda:

protokol
domen
yo‘l

qismlaridan tashkil topadi.

Masalan:

https://api.softromeda.uz/foydalanuvchilar

Bu yerda:

https → protokol

api.softromeda.uz → server

/foydalanuvchilar → yo‘l

Parametrlar

Ba’zan API'ga URL orqali qo‘shimcha parametrlar yuboriladi.

Masalan:

https://example.com/foydalanuvchilar?shahar=Toshkent

requests bilan:

import requests

parametrlar = {
    "shahar": "Toshkent"
}

javob = requests.get(
    "https://example.com/foydalanuvchilar",
    params=parametrlar
)

print(
    javob.url
)

requests parametrlarni URL'ga avtomatik qo‘shadi.


Bir nechta parametr

import requests

parametrlar = {
    "shahar": "Toshkent",
    "yosh": 25
}

javob = requests.get(
    "https://example.com/foydalanuvchilar",
    params=parametrlar
)

Sarlavhalar

HTTP so‘roviga qo‘shimcha ma’lumotlar headers orqali yuboriladi.

Masalan:

import requests

sarlavhalar = {
    "Accept": "application/json"
}

javob = requests.get(
    "https://example.com/api",
    headers=sarlavhalar
)

print(
    javob.status_code
)

API kaliti

Ba’zi API'lar autentifikatsiya uchun maxsus kalit talab qiladi.

Masalan:

import requests

sarlavhalar = {
    "Authorization": "Bearer API_KALIT"
}

javob = requests.get(
    "https://example.com/api",
    headers=sarlavhalar
)

Haqiqiy API kalitlarini kod ichiga ochiq yozib qo‘yish yaxshi amaliyot emas.


API kalitini muhit o‘zgaruvchisidan olish

Buning uchun:

import os
import requests

api_kalit = os.getenv(
    "SOFTROMEDA_API_KALITI"
)

sarlavhalar = {
    "Authorization": f"Bearer {api_kalit}"
}

javob = requests.get(
    "https://example.com/api",
    headers=sarlavhalar
)

Bu usul maxfiy ma’lumotlarni koddan ajratishga yordam beradi.


timeout

HTTP so‘rovi cheksiz kutib qolmasligi uchun timeout ishlatish yaxshi amaliyot.

import requests

javob = requests.get(
    "https://example.com/api",
    timeout=10
)

Bu yerda:

10

soniya kutish chegarasi sifatida ishlatiladi.


Xatolarni tekshirish

HTTP so‘rovida xatolik bo‘lishi mumkin.

import requests

javob = requests.get(
    "https://example.com/api",
    timeout=10
)

if javob.status_code == 200:

    print(
        "So‘rov muvaffaqiyatli."
    )

else:

    print(
        f"Xatolik: {javob.status_code}"
    )

raise_for_status()

requests kutubxonasida HTTP xatolarini istisno sifatida chiqarish uchun:

import requests

javob = requests.get(
    "https://example.com/api",
    timeout=10
)

javob.raise_for_status()

print(
    "So‘rov muvaffaqiyatli."
)

Agar server 4xx yoki 5xx javob qaytarsa, xatolik yuz beradi.


try va except

Tarmoq bilan ishlaganda xatolarni boshqarish muhim.

import requests

try:

    javob = requests.get(
        "https://example.com/api",
        timeout=10
    )

    javob.raise_for_status()

    ma'lumot = javob.json()

    print(
        ma'lumot
    )

except requests.RequestException:

    print(
        "API bilan aloqa qilishda xatolik yuz berdi."
    )

JSON API

Ko‘plab zamonaviy API'lar JSON formatidan foydalanadi.

Masalan, server quyidagicha javob qaytarishi mumkin:

{
    "muvaffaqiyat": true,
    "foydalanuvchi": {
        "id": 1,
        "ism": "Ali"
    }
}

Python'da:

import requests

javob = requests.get(
    "https://example.com/api",
    timeout=10
)

ma'lumot = javob.json()

if ma'lumot["muvaffaqiyat"]:

    foydalanuvchi = (
        ma'lumot["foydalanuvchi"]
    )

    print(
        f"Foydalanuvchi: "
        f"{foydalanuvchi['ism']}"
    )

API javobini tekshirish

JSON javobida kerakli maydon mavjudligini tekshirish mumkin:

import requests

javob = requests.get(
    "https://example.com/api",
    timeout=10
)

javob.raise_for_status()

ma'lumot = javob.json()

ism = ma'lumot.get(
    "ism"
)

if ism is not None:

    print(
        f"Ism: {ism}"
    )

else:

    print(
        "Ism ma'lumoti topilmadi."
    )

POST bilan JSON yuborish

import requests

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 25,
    "shahar": "Toshkent"
}

try:

    javob = requests.post(
        "https://example.com/api/foydalanuvchilar",
        json=foydalanuvchi,
        timeout=10
    )

    javob.raise_for_status()

    print(
        "Foydalanuvchi muvaffaqiyatli yuborildi."
    )

except requests.RequestException:

    print(
        "Foydalanuvchini yuborishda xatolik yuz berdi."
    )

PUT bilan yangilash

import requests

foydalanuvchi = {
    "ism": "Ali",
    "yosh": 26
}

try:

    javob = requests.put(
        "https://example.com/api/foydalanuvchilar/1",
        json=foydalanuvchi,
        timeout=10
    )

    javob.raise_for_status()

    print(
        "Foydalanuvchi yangilandi."
    )

except requests.RequestException:

    print(
        "Foydalanuvchini yangilashda xatolik yuz berdi."
    )

DELETE bilan o‘chirish

import requests

try:

    javob = requests.delete(
        "https://example.com/api/foydalanuvchilar/1",
        timeout=10
    )

    javob.raise_for_status()

    print(
        "Foydalanuvchi o‘chirildi."
    )

except requests.RequestException:

    print(
        "Foydalanuvchini o‘chirishda xatolik yuz berdi."
    )

API bilan ishlashda yaxshi amaliyotlar

API bilan ishlaydigan dasturda quyidagilarga e’tibor berish kerak:

timeout ishlatish
HTTP holat kodlarini tekshirish
xatolarni boshqarish
API kalitlarini himoyalash
JSON ma’lumotlarini tekshirish
keraksiz so‘rovlarni yubormaslik

API mijozini funksiya shaklida yozish

Bir xil kodni qayta-qayta yozmaslik uchun funksiya yaratish mumkin.

import requests


def foydalanuvchilarni_olish(
    manzil
):

    try:

        javob = requests.get(
            manzil,
            timeout=10
        )

        javob.raise_for_status()

        return javob.json()

    except requests.RequestException:

        print(
            "Foydalanuvchilarni olishda "
            "xatolik yuz berdi."
        )

        return []

Keyin:

foydalanuvchilar = foydalanuvchilarni_olish(
    "https://example.com/api/foydalanuvchilar"
)

for foydalanuvchi in foydalanuvchilar:

    print(
        foydalanuvchi
    )

API mijozini sinf bilan tashkil qilish

Katta loyihalarda API bilan ishlashni alohida sinfga ajratish mumkin.

import requests


class SoftromedaAPI:

    def __init__(
        self,
        asosiy_manzil
    ):

        self.asosiy_manzil = (
            asosiy_manzil
        )

    def foydalanuvchilarni_olish(
        self
    ):

        javob = requests.get(
            f"{self.asosiy_manzil}/foydalanuvchilar",
            timeout=10
        )

        javob.raise_for_status()

        return javob.json()

Foydalanish:

api = SoftromedaAPI(
    "https://example.com/api"
)

foydalanuvchilar = (
    api.foydalanuvchilarni_olish()
)

for foydalanuvchi in foydalanuvchilar:

    print(
        foydalanuvchi
    )

Amaliy loyiha — Softromeda API mijoz dasturi

Endi API bilan ishlaydigan kichik dastur yaratamiz.

Dastur:

API manzilini qabul qiladi
foydalanuvchilarni oladi
xatolarni tekshiradi
JSON ma’lumotini qayta ishlaydi
foydalanuvchilarni chiqaradi
import requests


class SoftromedaAPI:

    def __init__(
        self,
        asosiy_manzil
    ):

        self.asosiy_manzil = (
            asosiy_manzil.rstrip("/")
        )

    def foydalanuvchilarni_olish(
        self
    ):

        manzil = (
            f"{self.asosiy_manzil}/foydalanuvchilar"
        )

        try:

            javob = requests.get(
                manzil,
                timeout=10
            )

            javob.raise_for_status()

            ma'lumotlar = (
                javob.json()
            )

            if not isinstance(
                ma'lumotlar,
                list
            ):

                print(
                    "API noto‘g‘ri ma’lumot qaytardi."
                )

                return []

            return ma'lumotlar

        except requests.RequestException:

            print(
                "API bilan aloqa qilishda "
                "xatolik yuz berdi."
            )

            return []

        except ValueError:

            print(
                "Server JSON ma’lumot qaytarmadi."
            )

            return []


def foydalanuvchilarni_chiqarish(
    foydalanuvchilar
):

    if not foydalanuvchilar:

        print(
            "Foydalanuvchilar topilmadi."
        )

        return

    print(
        "=== Softromeda foydalanuvchilari ==="
    )

    for foydalanuvchi in foydalanuvchilar:

        ism = foydalanuvchi.get(
            "ism",
            "Noma'lum"
        )

        yosh = foydalanuvchi.get(
            "yosh",
            "Noma'lum"
        )

        print(
            f"Ism: {ism}"
        )

        print(
            f"Yosh: {yosh}"
        )

        print(
            "--------------------"
        )


api = SoftromedaAPI(
    "https://example.com/api"
)

foydalanuvchilar = (
    api.foydalanuvchilarni_olish()
)

foydalanuvchilarni_chiqarish(
    foydalanuvchilar
)

API bilan ishlashning umumiy sxemasi

Ko‘pgina API dasturlarida quyidagi jarayon mavjud:

1. API manzilini aniqlash
2. HTTP so‘rov yuborish
3. javob holatini tekshirish
4. JSON ma’lumotini olish
5. ma’lumotni tekshirish
6. ma’lumotni qayta ishlash
7. foydalanuvchiga natijani chiqarish

Masalan:

javob = requests.get(
    manzil,
    timeout=10
)

javob.raise_for_status()

ma'lumotlar = javob.json()

Amaliy mashqlar

Mashq 1

requests kutubxonasidan foydalanib HTTP GET so‘rovi yuboring.

Mashq 2

Javobning:

status_code
text

qiymatlarini chiqaring.

Mashq 3

JSON javobini:

javob.json()

orqali Python obyektiga aylantiring.

Mashq 4

POST yordamida JSON ma’lumot yuboring.

Mashq 5

PUT yordamida mavjud ma’lumotni yangilang.

Mashq 6

DELETE yordamida ma’lumotni o‘chiring.

Mashq 7

try va except yordamida HTTP xatolarini boshqaring.

Mashq 8

API so‘rovlariga timeout qo‘shing.

Mashq 9

API kalitini muhit o‘zgaruvchisidan o‘qing.

Mashq 10

Softromeda uchun API mijoz dasturini yarating.

Dastur:

foydalanuvchilarni olsin
foydalanuvchi qo‘shsin
foydalanuvchini yangilasin
foydalanuvchini o‘chirsin
xatolarni boshqarsin
JSON ma’lumotlarini qayta ishlasin

Bob xulosasi

Bu bobda Python yordamida HTTP va API bilan ishlashni o‘rgandik.

Asosiy HTTP metodlari:

GET
POST
PUT
DELETE

Ularning vazifalari:

GET
    ma’lumot olish

POST
    yangi ma’lumot yaratish

PUT
    ma’lumotni yangilash

DELETE
    ma’lumotni o‘chirish

Python'da HTTP so‘rovlarini yuborish uchun:

import requests

ishlatiladi.

Muhim funksiyalar va xususiyatlar:

requests.get()
requests.post()
requests.put()
requests.delete()

javob.status_code
javob.text
javob.json()

javob.raise_for_status()

Shuningdek:

timeout
headers
params
JSON
API kaliti
try/except

kabi tushunchalarni ham o‘rgandik.

API bilan ishlash — zamonaviy Python dasturchisi uchun eng muhim ko‘nikmalardan biridir. Chunki real dasturlar ko‘pincha boshqa serverlar, xizmatlar va tizimlar bilan HTTP orqali aloqa qiladi.

Keyingi bobda 19. Asinxron dasturlash mavzusini o‘rganamiz.