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