163 lines
5.5 KiB
Markdown
163 lines
5.5 KiB
Markdown
---
|
||
title: Consommer des services REST
|
||
author: Steve Kossouho
|
||
---
|
||
|
||
# Consommer des services web REST
|
||
|
||
---
|
||
|
||
## Une API REST, c'est quoi ?
|
||
|
||
Une API REST proposée par un service web, c'est quoi, et à quoi ça sert ?
|
||
Voyons le scénario suivant : vous écrivez une application dans laquelle vous avez besoin
|
||
de données géographiques. Quelles sont les solutions possibles ?
|
||
|
||
1. Ajouter les données manuellement en les récupérant depuis des sources diverses brutes
|
||
2. Exporter une source complète vers une base de données pour la réutiliser
|
||
3. Les fameux services web
|
||
|
||
---
|
||
|
||
### Principe général d'un service web
|
||
|
||
L'avantage du web, c'est que de nos jours, c'est facilement accessible. Accéder à un document
|
||
consiste généralement à taper dans un navigateur son URL. L'idée d'un service web est de proposer
|
||
sous forme de documents accessibles via un site, un ensemble de données qu'un développeur aurait du
|
||
mal à obtenir de façon organisée par ses propres moyens.
|
||
|
||
C'est comme si vous aviez une base de données accessible depuis le web, que vous n'avez pas à maintenir,
|
||
et qu'en plus vous ne risquez pas de casser.
|
||
|
||
---
|
||
|
||
### Principe d'une API REST
|
||
|
||

|
||
|
||
---
|
||
|
||
## Bibliothèques Python
|
||
|
||
Il existe plusieurs bibliothèques Python pour consommer des API REST. Parmi les plus populaires, on trouve `requests` et `uplink`.
|
||
|
||
La bibliothèque `requests` est une bibliothèque HTTP simple, capable de consommer une API REST.
|
||
Elle est extrêmement facile à utiliser et prend en charge toutes les méthodes HTTP (GET, POST, PUT, DELETE, etc.)
|
||
|
||
Par exemple, pour faire une requête GET sur une API :
|
||
|
||
```{.python .numberLines}
|
||
import requests
|
||
|
||
response = requests.get('https://api.example.com/resources')
|
||
print(response.json())
|
||
```
|
||
|
||
---
|
||
|
||
`uplink` est une bibliothèque qui vous permet de "transformer" une API REST en une classe Python.
|
||
Vous pouvez définir une interface qui correspond à l'API et `uplink` se charge de générer les requêtes HTTP pour vous.
|
||
|
||
Voici un exemple d'utilisation de `uplink` :
|
||
|
||
```{.python .numberLines}
|
||
from uplink import Consumer, get, Path
|
||
|
||
class GitHubAPI(Consumer):
|
||
@get("/users/{username}")
|
||
def get_user(self, username: Path):
|
||
pass
|
||
|
||
github = GitHubAPI(base_url="https://api.github.com")
|
||
user = github.get_user(username="example")
|
||
print(user)
|
||
```
|
||
|
||
---
|
||
|
||
## Consommer une API REST en Python
|
||
|
||
Pour consommer une API REST en Python, on utilisera souvent la bibliothèque `requests`.
|
||
Supposons que nous voulons accéder à une API qui nous donne des informations sur des utilisateurs à partir de leur nom d'utilisateur.
|
||
|
||
```{.python .numberLines}
|
||
import requests
|
||
|
||
username = 'example'
|
||
response = requests.get(f'https://api.example.com/users/{username}')
|
||
|
||
# Vérifier le statut de la requête
|
||
if response.status_code == 200:
|
||
user_data = response.json() # Convertir la réponse en JSON
|
||
print(user_data)
|
||
else:
|
||
print(f'Requête échouée avec le statut: {response.status_code}')
|
||
```
|
||
|
||
---
|
||
|
||
## Authentification pour les API REST
|
||
|
||
De nombreuses API nécessitent une forme d'authentification pour accéder aux ressources.
|
||
Il existe plusieurs mécanismes d'authentification, mais l'un des plus courants est l'authentification basée sur les tokens.
|
||
|
||
L'authentification basée sur les tokens signifie que vous devez envoyer un token spécial dans l'en-tête de votre requête HTTP.
|
||
Ce token est généralement généré lorsque vous vous connectez à l'API.
|
||
|
||
---
|
||
|
||
### Jetons d'authentification
|
||
|
||
La récupération d'un token d'authentification dépend beaucoup de l'API spécifique que vous utilisez. Toutefois, pour de nombreuses API, cela implique généralement d'envoyer une requête POST à un point de terminaison d'authentification, avec vos identifiants (par exemple, votre nom d'utilisateur et votre mot de passe).
|
||
|
||
Voici un exemple général :
|
||
|
||
```{.python .numberLines}
|
||
import requests
|
||
import json
|
||
|
||
# URL du point de terminaison d'authentification
|
||
url = "https://api.example.com/auth"
|
||
|
||
# Vos identifiants
|
||
credentials = { 'username': 'your-username', 'password': 'your-password'}
|
||
|
||
# Envoi de la requête POST
|
||
response = requests.post(url, data=json.dumps(credentials))
|
||
|
||
# Vérification du statut de la requête
|
||
if response.status_code == 200:
|
||
data = response.json() # Convertir la réponse en JSON
|
||
token = data.get('token') # Extraction du token
|
||
print(token)
|
||
else:
|
||
print(f"Échec de l'authentification, statut: {response.status_code}")
|
||
```
|
||
|
||
---
|
||
|
||
N'oubliez pas de remplacer 'your-username', 'your-password' et l'URL par vos propres informations. Notez également que cet exemple suppose que l'API renvoie le token d'authentification sous forme de JSON avec la clé 'token'. Certaines API peuvent utiliser un schéma différent, vous devrez donc consulter la documentation de l'API pour les détails précis.
|
||
|
||
Faites également attention à ne pas exposer vos identifiants en dur dans votre code, notamment si celui-ci est partagé ou stocké dans un dépôt de versionnement public. Envisagez plutôt l'utilisation de variables d'environnement ou de fichiers de configuration sécurisés pour stocker ces informations sensibles.
|
||
|
||
---
|
||
|
||
### Utiliser une API avec jeton d'authentification
|
||
|
||
Voici comment vous pouvez envoyer un token d'authentification avec `requests` :
|
||
|
||
```{.python .numberLines}
|
||
headers = {'Authorization': 'Bearer <your-token>'}
|
||
|
||
response = requests.get('https://api.example.com/resources', headers=headers)
|
||
print(response.json())
|
||
```
|
||
|
||
N'oubliez pas de remplacer 'your-token' par votre véritable jeton d'authentification.
|
||
|
||
---
|
||
|
||
## Ressources pour s'entraîner
|
||
|
||
- [DummyJSON](https://dummyjson.com/docs)
|