Məzmuna keç
Educora
İrəli18 dəq26 / 42

Veb API-lər və requests kitabxanası

HTTP necə işləyir: metodlar, status kodları, başlıqlar və JSON. `requests` ilə GET və POST sorğuları, `params`, `headers`, `timeout`, `raise_for_status`, xətaların idarəsi və API açarlarının təhlükəsiz saxlanması.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • HTTP sorğusunun və cavabının hissələrini, əsas metodları və status kodlarını izah etmək
  • requests ilə parametrli GET və JSON gövdəli POST sorğuları göndərmək
  • Vaxt limiti, raise_for_status və istisnalarla etibarlı kod yazmaq, API açarlarını gizli saxlamaq

Telefonundakı hava proqnozu, bankın valyuta məzənnələri, xəritədə marşrut — bu məlumatların hamısını proqramlar serverlərdən API (Application Programming Interface) vasitəsilə alır. Educora tətbiqləri də dərsləri saytın API-sindən yükləyir. Veb API sadə razılaşmadır: müəyyən ünvana HTTP sorğusu göndərirsən, server isə adətən JSON cavabı qaytarır. Python-da bunun ən populyar aləti requests kitabxanasıdır.

HTTP qısaca

Sorğu dörd hissədən ibarətdir: metod (nə etmək), URL (hara), başlıqlar (əlavə məlumat: format, açar) və gövdə (göndərilən verilənlər, məsələn, JSON). Cavab status kodu, başlıqlar və gövdədən ibarətdir. URL-dəki ? işarəsindən sonrakı hissə sorğu parametrləridir (query string): ?city=Baku&units=metric.

Text
GET /v1/weather?city=Baku&units=metric HTTP/1.1
Host: api.example.com
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json

{"city": "Baku", "temp": 24.5, "wind": 7.2, "description": "sunny"}
Sorğu və cavab «içəridən» belə görünür. api.example.com sənədlər üçün ayrılmış nümunə ünvandır — dərsdəki bütün cavablar illüstrativdir.
MetodMənasıNümunə
GETməlumatı oxumaqGET /v1/tasks
POSTyeni obyekt yaratmaqPOST /v1/tasks
PUT / PATCHobyekti tam / qismən yeniləməkPATCH /v1/tasks/42
DELETEobyekti silməkDELETE /v1/tasks/42
KodMənası
200, 201, 204uğurlu: OK, yaradıldı, məzmun yoxdur
301, 302yönləndirmə — başqa ünvana bax
400, 401, 403, 404müştəri xətası: səhv sorğu, giriş yoxdur, icazə yoxdur, tapılmadı
429çox sorğu — limit aşılıb, gözlə
500, 503server xətası, server əlçatan deyil

requests ilə sorğular

Kitabxananı kompüterində quraşdır: pip install requests. Brauzerdəki Python şəbəkə sorğuları göndərə bilmir, ona görə bu dərsin kodu işə salınmır — onu öz kompüterində sına. requests.get cavab obyekti qaytarır: status_code, headers, text, json(). Parametrləri URL-ə əl ilə yapışdırma: params lüğəti onları düzgün kodlaşdırır, məsələn, «Sumqayıt» Sumqay%C4%B1t olur.

Python
import requests

url = 'https://api.example.com/v1/weather'
params = {'city': 'Baku', 'units': 'metric'}
headers = {'Accept': 'application/json'}

response = requests.get(url, params=params, headers=headers, timeout=10)
print(response.status_code)
print(response.url)
print(response.headers['Content-Type'])
data = response.json()
print(data['city'], data['temp'])
Gözlənilən nəticə
200
https://api.example.com/v1/weather?city=Baku&units=metric
application/json
Baku 24.5
response.json() JSON gövdəsini Python lüğətinə çevirir. Çıxış nümunədir: real API-də temperatur fərqli olacaq.

Yeni obyekt yaratmaq üçün POST göndəririk. json= arqumenti lüğəti JSON-a çevirir və Content-Type: application/json başlığını özü əlavə edir. Uğurlu yaratmada server adətən 201 kodu və yeni obyekti (identifikatoru ilə) qaytarır.

Python
import requests

new_task = {'title': 'Finish the pandas lesson', 'done': False}
r = requests.post('https://api.example.com/v1/tasks', json=new_task, timeout=10)
print(r.status_code)
print(r.json())
print(r.request.headers['Content-Type'])
Gözlənilən nəticə
201
{'id': 42, 'title': 'Finish the pandas lesson', 'done': False}
application/json

Xətalar, vaxt limiti və raise_for_status

Diqqət: 404 və ya 500 cavabı requests üçün xəta deyil — kod sakitcə davam edir. raise_for_status() 4xx və 5xx kodlarında HTTPError qaldırır. Şəbəkə problemləri isə ayrıca istisnalardır: Timeout, ConnectionError; hamısı requests.exceptions.RequestException sinfindən törəyir.

Python
import requests

def get_json(url, **params):
    try:
        r = requests.get(url, params=params, timeout=5)
        r.raise_for_status()
        return r.json()
    except requests.exceptions.Timeout:
        print('The server did not answer in time')
    except requests.exceptions.HTTPError as e:
        print('HTTP error:', e.response.status_code)
    except requests.exceptions.RequestException as e:
        print('Network problem:', type(e).__name__)
    return None

print(get_json('https://api.example.com/v1/weather', city='Atlantis'))
Gözlənilən nəticə
HTTP error: 404
None
Xüsusi istisnalar ümumidən (RequestException) əvvəl yazılır, əks halda onlara heç vaxt növbə çatmaz.

API açarlarının təhlükəsizliyi

Əksər API-lər səni açar (API key, token) ilə tanıyır. Açar parol kimidir: onu bilən sənin adından sorğu göndərə, limitini xərcləyə və hətta sənin hesabına pul xərcləyə bilər. Qaydalar:

  • Açarı heç vaxt kodun içinə yazma və Git-ə commit etmə — onu mühit dəyişənində saxla.
  • .env faylı işlədirsənsə, onu .gitignore-a əlavə et.
  • API imkan verirsə, açarı URL-də yox, başlıqda göndər: URL-lər jurnallarda və brauzer tarixçəsində qalır.
  • Gizli açarı brauzer və ya mobil tətbiq koduna qoyma — onu istənilən istifadəçi çıxara bilər; belə sorğuları öz serverin vasitəsilə göndər.
  • Açar sızıbsa, dərhal onu ləğv et və yenisini yarat.
Terminal
# Linux / macOS
export WEATHER_API_KEY='paste-your-key-here'

# Windows PowerShell
$env:WEATHER_API_KEY = 'paste-your-key-here'
Dəyişən yalnız cari terminal sessiyasında yaşayır; daimi saxlamaq üçün əməliyyat sisteminin parametrlərindən və ya .env faylından istifadə et.
Python
import os
import requests

api_key = os.environ.get('WEATHER_API_KEY')
if not api_key:
    raise SystemExit('Set the WEATHER_API_KEY environment variable first')

session = requests.Session()
session.headers.update({'Authorization': f'Bearer {api_key}'})
r = session.get('https://api.example.com/v1/weather', params={'city': 'Baku'}, timeout=10)
r.raise_for_status()
print(r.json()['description'])
Gözlənilən nəticə
sunny
Açar koddan kənarda qalır, Session isə onu hər sorğunun başlığına özü əlavə edir. Başlığın dəqiq adı (Authorization, X-API-Key və s.) API-nin sənədlərində yazılır.

Əsas fikirlər

  • HTTP sorğusu: metod, URL, başlıqlar, gövdə; cavab: status kodu, başlıqlar, gövdə (çox vaxt JSON).
  • GET oxuyur, POST yaradır, PUT/PATCH yeniləyir, DELETE silir; 2xx uğur, 4xx müştəri, 5xx server xətasıdır.
  • requests.get(url, params=..., headers=..., timeout=...) və requests.post(url, json=...); nəticə r.json() ilə alınır.
  • Həmişə timeout ver və raise_for_status() çağır; istisnaları xüsusidən ümumiyə doğru tut.
  • API açarı mühit dəyişənində saxlanır, başlıqda göndərilir və heç vaxt Git-ə düşmür; sızıbsa, ləğv olunur.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Server 404 qaytardı. requests.get(...) nə edəcək?