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.
GO TO FULL VERSION