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