API
Jusqu'à présent, nous avons utilisé notre serveur pour servir des pages HTML ou des fichiers statiques. Cependant, nous pouvons aussi l'utiliser pour créer une API (Application Programming Interface) qui permet de communiquer différemment avec le client. Selon le type renvoyé par la route, Bottle peut aussi renvoyer des données sous d'autres formats. Par exemple, si on renvoie un dictionnaire, le contenu du dictionnaire est renvoyé au format JSON. Plus de détails dans la note 1.
Exemple
Dans cette partie, nous allons :
- côté serveur, créer une API qui renvoie des données au format JSON
- côté client, utiliser JavaScript pour faire des requêtes à cette API et afficher les données reçues dans la page HTML
Côté serveur
Nous allons créer un point d'entrée /api/pwgen qui renvoie une liste de
caractères aléatoires.
@route('/api/pwgen')
def api_pwgen():
"""
Renvoie une liste de caractères aléatoires.
"""
# On génère une liste de 10 caractères aléatoires
import random
import string
chars = [random.choice(string.ascii_letters + string.digits) for _ in range(10)]
# On renvoie un dictionnaire pour que Bottle le convertisse en JSON
return {'password': ''.join(chars)}
Côté client
Le point d'entréé /api/pwgen peut être appelé en javascript dans une page,
et être utilisé pour afficher le mot de passe généré dans la page HTML, sans
rechargement de la page.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Exemple API</title>
<script>
const fetchPassword = async () => {
const response = await fetch('/api/pwgen');
const data = await response.json();
document.getElementById('password').innerText = data.password;
}
</script>
</head>
<body>
<h1>Générateur de mot de passe</h1>
<button onclick="fetchPassword()">Générer un mot de passe</button>
<code id="password"></code`>
</body>
</html>
Dans ce code, nous avons ajouté un bouton qui, lorsqu'il est cliqué, appelle la
fonction fetchPassword(). Cette fonction utilise l'API Fetch pour faire une
requête GET à notre point d'entrée /api/pwgen. La réponse est ensuite
convertie en JSON et le mot de passe généré est affiché dans la page.
- NSI 1ère : intéraction client/serveur, requêtes HTTP, réponses du serveur
- NSI 1ère : évènements
- NSI 1ère : intéraction avec l'utilisateur dans une page web
Si la fonction renvoie :
- un dictionnaire, Bottle le convertit automatiquement en JSON et le renvoie
au client avec le
Content-Typeapproprié (application/json) - une chaîne de caractères vide,
False,None: réponse vide (204 No Content) - une lise de chaînes de caractères : elles sont concaténées et renvoyées comme une seule chaîne de caractères
- une chaîne de caractères unicode : elle encodée avec le codec approprié
spécifié dans l'en-tête
Content-Typede la réponse (utf-8par défaut) et traitéee ensuite comme une liste d'octets (byte string). - un liste d'octets (byte string) : elle est renvoyée telle quelle, sans traitement.
- une instance de
HTTPErrorouHTTPResponse: elle est utilisée directement pour générer la réponse, en ignorant les modifications faites surresponse - un fichier ou un objet de type fichier (n'importe quel objet qui a une
méthode
read()) : il est envoyé en listant les octets viaread();Content-TypeetContent-Lengthne sont pas générés automatiquement. Pour plus de sécurité, il est recommandé d'utiliserstatic_file()pour servir des fichiers. - un iterable ou un générateur : le contenu est envoyé au fur et à mesure
qu'il est produit, en mode
streaming. LeContent-Lengthn'est pas généré dans ce cas.
Référence : https://bottlepy.org/docs/dev/tutorial.html#generating-content.