CodeGym /Kursy /Python SELF PL /Używamy HttpClient

Używamy HttpClient

Python SELF PL
Poziom 23 , Lekcja 4
Dostępny

5.1 Wprowadzenie do HttpClient

W Python, podobnie jak w wielu językach programowania, jest standardowy HttpClient. W Python nazywa się http.client i pozwala wykonywać niskopoziomowe żądania HTTP i pracować z odpowiedziami HTTP. Pozwala tworzyć połączenia do serwerów HTTP i współdziałać z nimi.

Niskopoziomowy moduł, taki jak http.client, zapewnia bardziej szczegółową kontrolę nad operacjami HTTP, ale wymaga więcej kodu do wykonania zadań. W przeciwieństwie do niego, moduły wysokopoziomowe, jak requests, oferują prostszy interfejs, ukrywając wiele szczegółów implementacji.

Podstawowe możliwości http.client

Moduł http.client oferuje następujące podstawowe możliwości:

  • Tworzenie połączeń HTTP.
  • Wysyłanie żądań HTTP.
  • Odczytywanie odpowiedzi HTTP.
  • Obsługa nagłówków i treści żądań oraz odpowiedzi.

W przeciwieństwie do modułu requests, moduł http.client jest bardziej niskopoziomowy i tam zwraca się uwagę na szczegóły działania żądania http.

Podstawowe klasy i metody http.client

Klasa/Metoda Opis
HTTPConnection Tworzenie połączenia HTTP.
HTTPSConnection Tworzenie połączenia HTTPS.
request(method, url, ...) Wysyłanie żądania HTTP.
getresponse() Odebranie odpowiedzi na żądanie.
response.status Kod statusu odpowiedzi.
response.reason Opisowy tekst statusu odpowiedzi.
response.read() Odczytywanie danych z odpowiedzi.
response.getheaders() Otrzymanie wszystkich nagłówków odpowiedzi.
response.getheader(name) Otrzymanie wartości konkretnego nagłówka.

Poniżej przyjrzymy się niektórym z nich bliżej.

5.2 Wykonanie GET-zapytania

Aby wykonać żądania przy użyciu biblioteki http.client, należy wykonać następujące czynności:


Nawiąż połączenie
Wyślij żądanie
Otrzymaj odpowiedź
Zamknij połączenie

Ważne jest, aby zamknąć połączenie po użyciu, aby zwolnić zasoby i zapobiec wyciekom pamięci. Jest to szczególnie ważne przy pracy z dużą liczbą żądań lub w długo działających aplikacjach.

Przykład użycia HTTPConnection dla zwykłego żądania HTTP:


import http.client

# Tworzenie połączenia HTTP
conn = http.client.HTTPConnection("example.com")
            
# Wysyłanie GET-zapytania
conn.request("GET", "/")
            
# Odebranie odpowiedzi
response = conn.getresponse()
print(response.status, response.reason)
            
# Zamknięcie połączenia
conn.close()
        

Przykład użycia HTTPSConnection:


import http.client

# Tworzenie połączenia
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
            
# Wysyłanie GET-zapytania
conn.request("GET", "/posts/1")
            
# Odebranie odpowiedzi
response = conn.getresponse()
print(response.status, response.reason)
            
# Czytanie i dekodowanie danych odpowiedzi
data = response.read().decode('utf-8')
print(data)
            
# Otrzymanie wszystkich nagłówków odpowiedzi
headers = response.getheaders()
for header in headers:
    print(f"{header[0]}: {header[1]}")
            
# Zamknięcie połączenia
conn.close()
        

Trochę dłuższe niż przy użyciu requests, prawda?

5.3 Wykonanie POST-zapytania

POST-zapytanie przy użyciu http.client wykonuje się podobnie do GET-zapytania, tylko dane musisz zapakować w json-string samodzielnie, a także musisz ręcznie określić typ przesyłanych danych — dodać nagłówek Content-Type.

Przykład:


import http.client
import json

# Wysyłanie POST-zapytania
conn.request("POST", "/posts", body=payload, headers=headers)
        

Jako body należy przesłać json-obiekt, zserializowany do struny, a jako headers — słownik, zawierający informacje o typie danych.

Mogą one wyglądać na przykład tak:


# Dane do wysłania
payload = json.dumps({
    "title": "foo",
    "body": "bar",
    "userId": 1
})
            
# Nagłówki – typ przesyłanego kontentu
headers = {
    'Content-Type': 'application/json'
}
        

Wtedy pełny kod POST-zapytania będzie wyglądać tak:


import http.client
import json

# Dane do wysłania
payload = json.dumps({
    "title": "foo",
    "body": "bar",
    "userId": 1
})
            
# Nagłówki
headers = {
    'Content-Type': 'application/json'
}
            
# Tworzenie połączenia
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
            
# Wysyłanie POST-zapytania
conn.request("POST", "/posts", body=payload, headers=headers)
            
# Odebranie odpowiedzi
response = conn.getresponse()
print(response.status, response.reason)
            
# Czytanie i dekodowanie danych odpowiedzi
data = response.read().decode('utf-8')
print(data)
            
# Zamknięcie połączenia
conn.close()
        

5.4 Obsługa błędów przy wykonywaniu zapytań

Myślę, że warto również pokazać przykład obsługi błędów, ponieważ różni się to od zachowania requests. W module http.client wyjątek jest rzucany automatycznie, jeśli były problemy z połączeniem lub inne błędy HTTP.

Przykład:


import http.client

try:
    # Tworzenie połączenia
    conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
            
    # Wysyłanie GET-zapytania
    conn.request("GET", "/posts/1")
            
    # Odebranie odpowiedzi
    response = conn.getresponse()
    print(response.status, response.reason)
            
    # Czytanie i dekodowanie danych odpowiedzi
    data = response.read().decode('utf-8')
    print(data)
            
except http.client.HTTPException as e:
    print("Wystąpił błąd HTTP:", e)
except Exception as e:
    print("Wystąpił błąd:", e)
finally:
    # Zamknięcie połączenia
    conn.close()
        

Co tu dużo mówić? Użycie modułu requests będzie oczywiście łatwiejsze. Ale! Wiele modułów i frameworków używa pod maską właśnie niskopoziomowego http.client. Musisz wiedzieć, jak z nim pracować, aby móc prawidłowo konfigurować ich działanie.

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