Retour au cours

projet : client pour une api web

Objectif du Projet

Mettre en pratique plusieurs concepts appris : la gestion des dépendances avec Bundler, la réalisation de requêtes HTTP, le parsing de JSON, et la structure d’un script CLI simple. Nous allons créer un outil en ligne de commande pour interroger l’API publique de GitHub.

Le Scénario

Nous allons créer un script github_user.rb qui prend un nom d’utilisateur GitHub en argument. Ce script interrogera l’API GitHub pour récupérer les informations publiques de cet utilisateur (nom, bio, localisation, nombre de followers) et les affichera dans un format lisible sur le terminal.

Utilisation attendue :

./github_user.rb torvalds

Résultat attendu (exemple) :

Recherche des informations pour 'torvalds'...

--- Profil de torvalds ---
Nom: Linus Torvalds
Bio: "I'm not a visionary. I'm an engineer."
Localisation: Portland, OR
Followers: 190000+
Following: 0
URL du profil: https://github.com/torvalds
-------------------------

Les Outils

  • Bundler : Pour gérer notre dépendance à la gem httparty.
  • httparty : Une gem qui simplifie énormément les requêtes HTTP. Elle gère automatiquement la conversion JSON, les en-têtes, etc.
  • La librairie json : Bien que httparty parse le JSON pour nous, il est bon de savoir que cette librairie standard existe pour des usages plus avancés.

Les Étapes

1. Initialisation du projet avec Bundler

Comme pour tout projet Ruby un peu sérieux, nous utilisons Bundler pour gérer les dépendances.

# Créez un nouveau dossier pour le projet et déplacez-vous dedans
mkdir github_client
cd github_client

# Initialise Bundler : crée le Gemfile et le Gemfile.lock
bundle init

# Ajoutez la gem 'httparty' à votre Gemfile
echo "gem 'httparty'" >> Gemfile

# Installez la gem et ses dépendances
bundle install

Maintenant, vous avez un environnement prêt pour utiliser httparty.

2. Le Script github_user.rb

Voici le script complet. Il est bien structuré avec une fonction main et une gestion basique des erreurs.

Fichier github_user.rb :

#!/usr/bin/env ruby

# Charge Bundler pour gérer nos gems
require 'bundler/setup'
# Charge la gem HTTParty pour faire des requêtes HTTP
require 'httparty'

# --- Constantes et Validation ---
# Vérifie si un argument (le nom d'utilisateur) a été passé au script
unless ARGV.length == 1
  puts "Usage: #{$0} <nom_utilisateur_github>"
  exit(1) # Quitte le script avec un code d'erreur
end

USERNAME = ARGV[0]
API_URL = "https://api.github.com/users/#{USERNAME}"

puts "Recherche des informations pour '#{USERNAME}'..."

# --- Gestion des erreurs et requête ---
begin
  # Fait une requête GET à l'API GitHub
  # On ajoute un User-Agent, ce qui est une bonne pratique pour les APIs
  response = HTTParty.get(API_URL, headers: { "User-Agent" => "Mon-App-Ruby-CLI" })

  # --- Analyse de la réponse ---
  # Vérifie le code de statut HTTP de la réponse
  if response.code == 200
    # HTTParty parse automatiquement le JSON en Hash Ruby
    user_data = response.parsed_response
    
    puts "\n--- Profil de #{user_data['login']} ---"
    # On utilise || '...' pour afficher une valeur par défaut si la clé n'existe pas ou est nil
    puts "Nom: #{user_data['name'] || 'Non spécifié'}"
    puts "Bio: #{user_data['bio'] || 'Non spécifiée'}"
    puts "Localisation: #{user_data['location'] || 'Non spécifiée'}"
    puts "Followers: #{user_data['followers']}"
    puts "Following: #{user_data['following']}"
    puts "URL du profil: #{user_data['html_url']}"
    puts "-------------------------"

  elsif response.code == 404
    # Cas spécifique : l'utilisateur n'a pas été trouvé
    puts "Erreur : L'utilisateur GitHub '#{USERNAME}' n'a pas été trouvé."
  else
    # Pour les autres codes d'erreur HTTP
    puts "Erreur inattendue de l'API. Code de statut : #{response.code}"
    puts "Réponse brute : #{response.body}"
  end

rescue HTTParty::Error, SocketError => e
  # Gère les erreurs réseau (ex: pas de connexion internet)
  puts "Erreur de connexion : Impossible de joindre l'API GitHub."
  puts "Détail : #{e.message}"
end

3. Exécution

Pour exécuter le script :

# Il faut lancer les commandes via 'bundle exec' pour utiliser les gems installées
bundle exec ruby github_user.rb octocat 

Essayez avec votre propre nom d’utilisateur GitHub, ou celui de quelqu’un que vous connaissez !

Bonnes Pratiques Mises en Œuvre

  • Gestion des dépendances : Le projet est clair grâce à Gemfile et Gemfile.lock. N’importe qui peut recréer le même environnement.
  • Code organisé : Le script est simple, mais on voit comment il pourrait être structuré en méthodes ou en classe pour plus de complexité.
  • Requêtes HTTP simplifiées : HTTParty rend les appels réseau très lisibles.
  • Gestion des erreurs : Le bloc begin...rescue permet de gérer les problèmes de connexion ou les réponses inattendues de l’API.
  • Valeurs par défaut : L’utilisation de || '...' évite les erreurs si l’API renvoie nil pour certains champs.

Exercices et améliorations possibles

  1. Afficher les dépôts publics :

    • L’API GitHub renvoie aussi l’URL des dépôts de l’utilisateur (repos_url).
    • Modifiez le script pour faire une deuxième requête HTTP à cette URL et afficher les noms des 5 premiers dépôts publics. (Indice : Vous devrez parser la nouvelle réponse JSON).
  2. Créer une classe GitHubClient :

    • Pour une meilleure encapsulation, déplacez la logique d’appel à l’API dans une classe dédiée.
    • Créez une classe GitHubClient avec une méthode get_user(username) qui retourne le hash des données utilisateur. Le script principal deviendrait alors beaucoup plus simple.
  3. Gérer le Rate Limiting :

    • L’API GitHub a des limites de requêtes. Si vous en faites trop sans authentification, elle répondra avec un code d’erreur 403 Forbidden.
    • Recherchez comment passer un “Personal Access Token” dans les en-têtes de la requête HTTParty pour augmenter cette limite. (Si c’était un vrai projet, ce token serait stocké dans les secrets GitHub Actions, pas en clair !)