4.1 Gestione delle risposte
Il modulo requests offre metodi comodi per lavorare con le risposte del server.
Status codes
Oltre alla risposta, il server invia anche lo stato dell'elaborazione della richiesta. L'informazione sullo stato si trova nei campi status_code e reason. Ecco un esempio:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Mostra lo status code della risposta
print(response.reason) # Mostra la descrizione testuale dello status
print(response.ok) # Restituisce True se lo status code è inferiore a 400
Headers
Beh, naturalmente, quale richiesta HTTP senza headers? Se ti servono gli headers della richiesta o quelli della risposta, puoi accedervi tramite il campo headers:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Mostra gli headers della risposta
print(response.headers['Content-Type']) # Mostra il valore di un header specifico
Body della risposta
La risposta del server può contenere un set di byte, testo, json o xml. Se sai esattamente cosa stai richiedendo al server, puoi ottenere subito un oggetto del tipo necessario utilizzando uno dei metodi/campi:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Mostra il corpo della risposta come testo
print(response.json()) # Mostra il corpo della risposta come JSON
print(response.content) # Mostra il corpo della risposta come byte
Scoprirai di più sugli headers (headers) e gli status delle risposte nelle lezioni su come funziona la rete.
4.2 Gestione degli errori
Il modulo requests offre eccezioni per la gestione degli errori.
Lo standard HTTP non prevede eccezioni, funziona invece con codici di errore (status_code). Se vuoi che un fallimento nella richiesta generi un'eccezione in Python, devi chiamare esplicitamente la funzione raise_for_status().
Esempio:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Genera un'eccezione per status codes 4xx e 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!")
Puoi saperne di più sui codici di errore nelle lezioni su come funziona la rete.
4.3 Invio dei dati
Prima dell'invenzione del JSON, grandi quantità di dati venivano inviate tramite "forma". La forma è un oggetto speciale di una pagina del browser (e standard dei dati in HTTP). Se vuoi inviare dati "tramite forma", devi semplicemente includere il parametro data nella richiesta.
Importante! Le richieste GET non supportano le forme, poiché non contengono un body di richiesta. Tutti i loro dati vengono trasmessi solo nell'URL.
Invio dati in GET-request
In un GET-request i dati vengono trasmessi attraverso i parametri dell'URL. Ecco un esempio:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Mostra l'URL con i parametri aggiunti
Invio di dati tramite forma
Utilizziamo un POST-request per inviare dati al server.
Esempio:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Invio di file
Se vuoi inviare su internet dati binari, per esempio, caricare un'immagine, devi includere il tuo file o file nella richiesta usando il parametro files.
Esempio:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
È semplice come due per due. Se vuoi inviare più file, devi elencarli con qualsiasi nome nella variabile files.
Importante! Non dimenticare di chiudere il file dopo l'invio, per evitare perdite di risorse. È meglio usare la costruzione with, che chiuderà automaticamente il file al termine dell'operazione:
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 Login e autorizzazione
L'API (Application Programming Interface) è un insieme di regole e protocolli che permettono a diversi programmi di interagire tra loro. Molti siti e servizi consentono di inviare loro richieste e lavorare con la loro API solo dopo il login.
Dopo un login riuscito, ottieni un oggetto speciale, una sessione (session), che contiene un numero unico della tua "sessione autorizzata con il server". Per le richieste successive dovrai usare questo oggetto.
Autenticazione
Per loggarti su un server, devi passare attraverso l'autenticazione (processo di login), per cui devi trasmettere i dati dell'account con la richiesta.
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)
Così appare il processo di autorizzazione, ma di solito viene utilizzato insieme a una sessione.
Utilizzo delle sessioni
Le sessioni permettono di mantenere i parametri tra le richieste, come i cookies o le informazioni di autorizzazione dell'utente.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Creazione di una sessione
session = requests.Session()
# Login al sito
login_response = session.post('https://example.com/login', data = payload)
# Operazioni successive utilizzando la sessione dell'utente loggato
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION