Retour au cours

projet : consommer une api http, transformer, enregistrer

ce mini-projet combine HTTP, JSON et fichiers : vous appelez une API, transformez les données et enregistrez un résultat.

objectifs

  • envoyer une requête GET avec requests
  • gérer les erreurs réseau/HTTP
  • transformer et sauvegarder les données

explication détaillée

exemple d’API : https://jsonplaceholder.typicode.com/posts (fictive pour démo).
vous allez récupérer une liste d’objets, ne garder que certaines colonnes, et écrire posts.csv.

exemples exécutables

import requests, csv

URL = "https://jsonplaceholder.typicode.com/posts"

def fetch(url: str, timeout: float = 10.0):
    r = requests.get(url, timeout=timeout)
    r.raise_for_status()
    return r.json()

def transform(rows):
    # garder id, userId, title (premiers 60 chars)
    out = []
    for r in rows:
        out.append({
            "id": r.get("id"),
            "user_id": r.get("userId"),
            "title": (r.get("title") or "").strip()[:60],
        })
    return out

def save_csv(rows, path: str):
    with open(path, "w", newline="", encoding="utf-8") as f:
        w = csv.DictWriter(f, fieldnames=["id", "user_id", "title"])
        w.writeheader()
        w.writerows(rows)

def main():
    try:
        rows = fetch(URL)
    except requests.RequestException as e:
        print("erreur réseau/http:", e)
        return
    cleaned = transform(rows)
    save_csv(cleaned, "posts.csv")
    print("ok:", len(cleaned), "lignes")

if __name__ == "__main__":
    main()

bonnes pratiques

  • toujours définir timeout=
  • vérifier le schéma minimal attendu et ignorer les champs absents
  • logguer les erreurs et retourner un code ≠ 0 si c’est un outil CLI

pièges courants

  • se fier au format sans le valider
  • ne pas traiter les erreurs 4xx/5xx

exercices

  1. ajouter un argument --limit N pour ne garder que N éléments.
  2. écrire aussi un fichier posts.json avec ensure_ascii=False et indent=2.
  3. normaliser les titres (titlecase) et filtrer ceux vides.