4.1 Przetwarzanie odpowiedzi
Moduł requests
oferuje wygodne metody do pracy z odpowiedziami serwera.
Kody statusu
Oprócz odpowiedzi, serwer przesyła również status przetwarzania żądania. Informacje o statusie znajdują się w polach status_code
i reason
. Przykład poniżej:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Wyświetla kod statusu odpowiedzi
print(response.reason) # Wyświetla opis tekstowy statusu
print(response.ok) # Zwraca True, jeśli kod statusu jest mniejszy niż 400
Nagłówki
Czym byłoby żądanie HTTP bez nagłówków, prawda? Jeśli potrzebujesz nagłówków żądania lub odpowiedzi, możesz się do nich odwołać przez pole headers
:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Wyświetla nagłówki odpowiedzi
print(response.headers['Content-Type']) # Wyświetla wartość konkretnego nagłówka
Ciało odpowiedzi
Odpowiedź serwera może zawierać zestaw bajtów, tekst, json
lub xml
. Jeśli wiesz, czego konkretnie potrzebujesz od serwera, możesz od razu otrzymać obiekt odpowiedniego typu, używając jednego z metod/pól:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Wyświetla ciało odpowiedzi jako tekst
print(response.json()) # Wyświetla ciało odpowiedzi w formacie JSON
print(response.content) # Wyświetla ciało odpowiedzi jako bajty
Więcej o nagłówkach (headers)
i statusach odpowiedzi dowiesz się z wykładów o działaniu sieci.
4.2 Przetwarzanie błędów
Moduł requests
zapewnia wyjątki do przetwarzania błędów.
Standard HTTP nie przewiduje wyjątków, zamiast tego operuje kodami błędów (status_code)
. Jeśli chcesz, aby w wyniku nieudanego żądania został wygenerowany wyjątek Pythona, musisz jawnie wywołać funkcję raise_for_status()
.
Przykład:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Generuje wyjątek dla kodów statusu 4xx i 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Więcej o kodach błędów dowiesz się z wykładów o działaniu sieci.
4.3 Wysyłanie danych
Przed wynalezieniem JSON duże ilości danych wysyłano za pomocą "formularzy". Formularz to specjalny obiekt strony przeglądarki (i standard danych w HTTP). Jeśli chcesz wysłać dane "za pomocą formularza", musisz po prostu przekazać parametr data
z żądaniem.
Ważne!
Żądania GET nie obsługują formularzy, ponieważ nie mają ciała żądania. Wszystkie ich dane przekazywane są tylko w URL.
Wysyłanie danych w GET-requests
W GET-requests
dane przekazywane są przez parametry URL. Oto przykład:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Wyświetli URL z dodanymi parametrami
Wysyłanie danych formularzy
Użyjemy POST-request
, aby wysłać dane na serwer.
Przykład:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Wysyłanie plików
Jeśli chcesz wysłać przez internet dane binarne, na przykład, przesłać obraz, musisz przekazać swój plik lub pliki w żądaniu za pomocą parametru files
.
Przykład:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Prosto jak drut. Jeśli chcesz wysłać kilka plików, to wymień je pod dowolnymi nazwami w zmiennej files
.
Ważne!
Nie zapomnij zamknąć pliku po wysłaniu, aby uniknąć wycieków zasobów. Najlepiej używać konstrukcji with
, która automatycznie zamknie plik po zakończeniu operacji:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Logowanie i autoryzacja
API (Application Programming Interface) to zbiór zasad i protokołów, które umożliwiają różnym programom współpracę ze sobą. Wiele stron i serwisów pozwala wysyłać im żądania i pracować z ich API tylko po zalogowaniu się.
Po pomyślnym zalogowaniu otrzymujesz specjalny obiekt – sesję (session)
, która zawiera unikalny numer twojej „autoryzowanej sesji z serwerem”. Do dalszych żądań musisz używać tego obiektu.
Uwierzytelnianie
Aby zalogować się na serwer, trzeba przejść przez proces uwierzytelniania (logowania), w tym celu należy przekazać z żądaniem dane uwierzytelniające.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
Tak wygląda proces autoryzacji, ale zazwyczaj używa się go razem z sesją.
Używanie sesji
Sesje pozwalają zachować parametry pomiędzy żądaniami, takie jak cookies
czy informacje o autoryzacji użytkownika.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Tworzenie sesji
session = requests.Session()
# Logowanie do strony
login_response = session.post('https://example.com/login', data = payload)
# Dalsza praca w ramach sesji zalogowanego użytkownika
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION