5.1 HttpClient ilə tanışlıq
Python-da, bir çox proqramlaşdırma dillərində olduğu kimi, standart HttpClient var. Python-da o, http.client adlanır və aşağı səviyyəli HTTP-sorğuları yerinə yetirməyə və HTTP-cavablarla işləməyə imkan verir. O, HTTP serverlərinə bağlantılar yaratmağa və onlarla qarşılıqlı əlaqə qurmağa imkan verir.
http.client kimi aşağı səviyyəli modul, HTTP əməliyyatlarına daha ətraflı nəzarət imkanı verir, lakin vəzifələri yerinə yetirmək üçün daha çox kod yazmağı tələb edir. Bunun əksinə olaraq, requests kimi yüksək səviyyəli modullar daha sadə interfeys təqdim edir və bir çox həyata keçirmə detallarını gizlədir.
http.client modulunun əsas imkanları
http.client modulu aşağıdakı əsas imkanları təqdim edir:
- HTTP bağlantılar yaratmaq.
- HTTP-sorğuları göndərmək.
- HTTP-cavablarını oxumaq.
- Sorğuların və cavabların başlıqları və mətnlərini işləmək.
requests modulundan fərqli olaraq, http.client modulu daha aşağı səviyyəlidir və burada http-sorğunun iş prinsiplərinə böyük diqqət yetirilir.
http.client modulunun əsas sinifləri və metodları
| Sinif/Metod | Təsvir |
|---|---|
HTTPConnection |
HTTP bağlantısının yaradılması. |
HTTPSConnection |
HTTPS bağlantısının yaradılması. |
request(method, url, ...) |
HTTP-sorğusunun göndərilməsi. |
getresponse() |
Sorğuya cavabın alınması. |
response.status |
Cavabın status-kodu. |
response.reason |
Cavab statusunun mətn təsviri. |
response.read() |
Cavab məlumatlarının oxunması. |
response.getheaders() |
Bütün cavab başlıqlarının alınması. |
response.getheader(name) |
Müəyyən bir başlığın dəyərinin alınması. |
Aşağıda biz onların bəzilərinə daha ətraflı baxacağıq.
5.2 GET sorğusu yerinə yetirmək
http.client kitabxanasından istifadə edərək sorğular yerinə yetirmək üçün belə bir sıra əməliyyatlar edilməlidir:
Bağlantı qurmaq
Sorğu göndərmək
Cavabı almaq
Bağlantını bağlamaq
Qeyd etmək lazımdır ki, istifadədən sonra bağlantını bağlamaq resursları azad etmək və yaddaş sızıntısının qarşısını almaq üçün vacibdir. Bu, xüsusilə çoxlu sayda sorğularla işləyərkən və ya uzun ömürlü tətbiqlərdə əhəmiyyətlidir.
Normal HTTP sorğusu üçün HTTPConnection istifadə nümunəsi:
import http.client
# HTTP bağlantısının yaradılması
conn = http.client.HTTPConnection("example.com")
# GET sorğusunun göndərilməsi
conn.request("GET", "/")
# Cavabın alınması
response = conn.getresponse()
print(response.status, response.reason)
# Bağlantının bağlanması
conn.close()
HTTPSConnection istifadə nümunəsi:
import http.client
# Bağlantının yaradılması
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# GET sorğusunun göndərilməsi
conn.request("GET", "/posts/1")
# Cavabın alınması
response = conn.getresponse()
print(response.status, response.reason)
# Cavab məlumatlarının oxunması və dekodlaşdırılması
data = response.read().decode('utf-8')
print(data)
# Cavab başlıqlarının hamısının alınması
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Bağlantının bağlanması
conn.close()
requests istifadə edərkən bir az qısadır, düzdür?
5.3 POST-sorğusu yerinə yetirilməsi
POST-sorğusu http.client istifadə edərək yerinə yetirilir, bu çox oxşardır GET-sorğusu, sadəcə məlumatları json-sətir şəklində özünüz paketləşdirməli və ötürülən məlumatların tipini əl ilə göstərməli – başlıq Content-Type əlavə etməlisiniz.
Nümunə:
import http.client
import json
# POST-sorğusunun göndərilməsi
conn.request("POST", "/posts", body=payload, headers=headers)
body olaraq sətirə seriyalaşdırılmış json-obyekt ötürmək lazımdır, headers olaraq – məlumatların tipinə dair informasiya ehtiva edən dictionary göndərmək lazımdır.
Onlar məsələn belə görünə bilər:
# Göndəriləcək məlumatlar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Header-lər – ötürülən kontentin tipi
headers = {
'Content-Type': 'application/json'
}
Onda tam POST-sorğusu kodu belə görünəcək:
import http.client
import json
# Göndəriləcək məlumatlar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Header-lər
headers = {
'Content-Type': 'application/json'
}
# Bağlantının yaradılması
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# POST-sorğusunun göndərilməsi
conn.request("POST", "/posts", body=payload, headers=headers)
# Cavabın alınması
response = conn.getresponse()
print(response.status, response.reason)
# Cavab məlumatlarının oxunması və kodlaşdırılması
data = response.read().decode('utf-8')
print(data)
# Bağlantının bağlanması
conn.close()
5.4 Sorğuların icrası zamanı səhvlərin işlənməsi
Fikrimcə, səhvlərin necə işlənəcəyinə dair nümunə göstərmək də faydalı olar, çünki bu, requests-dən fərqli davranır. http.client modulunda istisna avtomatik atılır, əgər əlaqə ilə bağlı problem varsa və ya digər HTTP səhvləri baş verib.
Nümunə:
import http.client
try:
# Bağlantının yaradılması
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# GET sorğusunun göndərilməsi
conn.request("GET", "/posts/1")
# Cavabın alınması
response = conn.getresponse()
print(response.status, response.reason)
# Cavab məlumatlarının oxunması və deşifr edilməsi
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("HTTP xətası baş verdi:", e)
except Exception as e:
print("Səhv baş verdi:", e)
finally:
# Bağlantının bağlanması
conn.close()
Nə deyim? requests modulundan istifadə daha sadə olacaq, əlbəttə. Amma! Bir çox modullar və framework-lər məhz aşağı səviyyəli http.client-dən istifadə edir. Onunla necə işlənəcəyini bilməlisiniz ki, onların işlərini düzgün tənzimləyə biləsiniz.
GO TO FULL VERSION