class: center, middle # Module requests --- # Module requests
Le module
requests
permet d'interagir avec une API (
Application Programming Interface
).
Site Web dédié au module : https://fr.python-requests.org/.
Import du module
```python >>> import requests ``` --- # Création d'une requête Essayons de créer une requête afin de récupérer la
timeline
publique de GitHub : ```python >>> r = requests.get('https://github.com/timeline.json') ``` **Remarque :** on récupère alors un objet
Response
appelé
r
. Celui-ci contient toutes les informations dont nous avons besoin. ```python >>> r.status_code 200 >>> r.headers['content-type'] 'application/json; charset=utf8' >>> r.encoding 'utf-8' >>> r.text u'{"type":"User"...' >>> r.json {u'private_gists': 419, u'total_private_repos': 77, ...} ``` --- # Types de requête L’API de
requests
permet d’effectuer tous types de requête HTTP très simplement. * GET ```python >>> r = requests.get('https://github.com/timeline.json') ``` * POST ```python >>> r = requests.post("http://httpbin.org/post") ``` * PUT, DELETE, HEAD, OPTIONS ```python >>> r = requests.put("http://httpbin.org/put") >>> r = requests.delete("http://httpbin.org/delete") >>> r = requests.head("http://httpbin.org/get") >>> r = requests.options("http://httpbin.org/get") ``` --- # Passer des paramètres dans les URLs Le passage des paramètres se fait via un dictionnaire avec l'argument
params
. Pour l'URL `http://httpbin.org/get?key1=value1&key2=value2`, on passerait les paramètres de la manière suivante : ```python >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get("http://httpbin.org/get", params=payload) ``` **Vérification de l'encodage de l'URL** ```python >>> print r.url u'http://httpbin.org/get?key2=value2&key1=value1' ``` --- # Contenu de la réponse Il est possible de lire le contenu de la réponse du serveur. ```python >>> import requests >>> r = requests.get('https://github.com/timeline.json') >>> r.text '[{"repository":{"open_issues":0,"url":"https://github.com/... ```
Remarque :
requests
devine l’
encodage
de la réponse en fonction des en-têtes HTTP. Le texte décodé selon cet encodage est alors accesible via `r.text`. On peut consulter l'encodage utilisé par
requests
. ```python >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' ``` --- # Réponse JSON
Requests
dispose dun décodeur intégré pour les données JSON. ```python >>> import requests >>> r = requests.get('https://github.com/timeline.json') >>> r.json [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/... ``` **Remarque :** si le décodage échoue, `r.json` renverra simplement
None
. On peut aussi accéder aux réponses binaires ... ```python >>> r.content b'[{"repository":{"open_issues":0,"url":"https://github.com/... ``` ... mais aussi aux réponses brutes ```python >>> r.raw
``` --- # Requêtes POST avancées Si l'on souhaite envoyer des
données encodées
(ex. : un formulaire HTML), on peut passer un dictionnaire avec l'argument `data`. Le dictionnaire de données sera automatique encodé comme un formulaire au moment de la requête. ```python >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print r.text { // ... // "form": { "key2": "value2", "key1": "value1" }, // ... // } ``` **Remarque :** si on ne souhaite pas que les données soient encodées, on peut passer une chaîne de caractères à la place d'un dictionnaire. Ainsi les données seront postées directement, sans encodage. --- # Codes de retour des réponses (status) On peut facilement vérifier le code de retour d'une réponse. ```python >>> r = requests.get('http://httpbin.org/get') >>> r.status_code 200 ``` **Remarque :** en cas de mauvaise requête (code de retour autre que 200), il est possible de lever une
exception
avec `Response.raise_for_status()`. ```python >>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error ``` --- # Authentification L'authentification la plus commune est l’authentification HTTP basique mais il en existe d'autres (Digest, OAuth, ...). Voici un exemple pour l'authentification basique ... ```python >>> from requests.auth import HTTPBasicAuth >>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
``` et un raccourci également. ```python >>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
```