CodeGym /Kurslar /Python SELF AZ /HttpClient-dən istifadə edirik

HttpClient-dən istifadə edirik

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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.

1
Опрос
Seriyalizasiya,  23 уровень,  4 лекция
недоступен
Seriyalizasiya
Seriyalizasiya
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION