Skip to content

Instantly share code, notes, and snippets.

@tomsihap
Last active November 6, 2019 08:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tomsihap/930cd94463ced8539b9ca7fe7a1e2434 to your computer and use it in GitHub Desktop.
Save tomsihap/930cd94463ced8539b9ca7fe7a1e2434 to your computer and use it in GitHub Desktop.
Cours API : Ajax

Utiliser une API avec AJAX et jQuery

Nous allons faire un moteur de recherche en HTML et JS qui ira requêter une API de films, et afficher dynamiquement les films "en direct", en fonction de ce que nous tapons dans l'input de recherche.

Création du projet

  1. Créer un fichier index.html en important jQuery
  2. Créer un fichier app.js, en l'important dans le fichier html.

TRÈS IMPORTANT : Attention à ne PAS utiliser jquery.slim mais bien jquery !!! Si jamais vous utilisez le code de jquery.slim dans un projet comme suit, avec l'extension b4 par exemple :

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

Il vous suffit de changer la ligne ainsi :

<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>

Récap des modifications:

  1. On supprime la portion integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
  2. On supprime la portion .slim du nom du fichier Javascript

Préparation des étapes du projet

index.html

Créez un fichier basique contenant un input#search.

app.js

Voici la liste des étapes à prévoir :

  1. Mettre un listener sur input#search de sorte à déclancher la requête lors de la saisie
  2. Fonction du listener : lancer la requête
  3. Récupérer la réponse de la requête
  4. Afficher dans le HTML le contenu de la réponse

Ajout du Listener

app.js

$(function() {

    $('#search').on('input', function() {
        console.log( $(this).val() );
    });
});

À chaque changement de valeur dans l'input, on doit voir apparaître dans la console la valeur de l'input.

Lancer la requête

On va maintenant lancer la requête Ajax au serveur fournissant l'API de films !

Inscription à l'API de films

Nous allons utiliser l'Open Movie Database (OMDB API) http://www.omdbapi.com/

Créez un compte gratuit en cliquant sur l'onglet API Key. La clé d'API permet aux APIs de savoir quel usage est fait par qui de leurs API et de limiter l'usage (1000 requêtes gratuites par jour pour OMDB par exemple).

Conservez la clé d'API reçue par email dans une constante :

const omdbApiKey = 'abcdef';
Création de la requête Ajax

La requête Ajax (doc : https://api.jquery.com/jquery.ajax/) se compose ainsi :

$.ajax({
    url : 'https://www.example.com/resource', // La ressource ciblée
    type : 'GET', // Le type de la requête HTTP
    data : { val1: 'hello', val2: 'hello2'},

    success : function(result, status, error) {
        // Fonction en cas de success de la requête
    },

    error : function(result, status, error) {
        // Fonction en cas d'erreur
    },

    complete: function(result, status) {
        // Fonction à executer une fois l'appel Ajax effectué (par exemple, retirer le spinner de chargement)
    }
});

On va adapter la requête à nos besoins :

$(function() {

    $('#search').on('input', function() {
        console.log( $(this).val() );

        $.ajax({
            url : 'https://www.example.com/resource', // La ressource ciblée
            type : 'GET', // Le type de la requête HTTP
            data : {
                apiKey: 'VOTRE_API_KEY',
                s: $(this).val()
            },

            success : function(result) {
                // Fonction en cas de success de la requête
            },

            error : function(result) {
                // Fonction en cas d'erreur
            },

            complete: function(result) {
                // Fonction à executer une fois l'appel Ajax effectué (par exemple, retirer le spinner de chargement)
            }
        });
    });
});

Récupération de la réponse : vérification des données retournées par la requête

On voit que les clés success, error, complete prennent 3 paramètres : ce sont les paramètres que rempliront la fonction Ajax.

C'est dans la fonction de success que nous allons traiter les données :

success : function(result) {
    // Fonction en cas de success de la requête

    console.log(result);
},

Afficher les données

À partir de ce point, le code va varier selon votre projet, selon l'API utilisée... Il faudra comprendre le format de la réponse, grâce au console.log, afin de faire les traitements voulus : faire un foreach des données qui arrivent pour les insérer dans du HTML, faire des validations sur les données reçues...

Par exemple ici, nous allons afficher tous les films dans des Bootstrap Cards, contenus dans un div#results.

Grâce aux console.log, on comprend que les films sont dans un objet Search, on peut donc y accéder dans la fonction success grâce à result.Search.

Nous lançons la requête uniquement si l'utilsateur a tapé plus de 3 caractères, et nous n'affichons les résultats que si des résultats sont affichables (result.Search.length > 0).

success : function(response) {

    // Si l'utilisateur a saisi plus de 3 caractères
    if (search.val().length >= 3 ) {

        // On vide la div d'affichage des résultats
        $('#results').html('');

        // Si le résultat nous retourne des films
        if (response.Search && response.Search.length > 0) {


            // On fait un foreach des films
            response.Search.forEach(function (movie) {
                // L'équivalent de cette boucle en PHP serait : foreach ($response['Search'] as $movie)

                // On créée le HTML d'un film (une bootstrap card)
                let movieHtml = '<div class="card">' +
                    '<div class="card-header">' + movie.Title + '</div>' +
                    '<div class="card-body"><img src="' + movie.Poster + '" height="100"></div>' +
                    '</div>';

                // On l'ajoute au div de résultats
                $('#results').append(movieHtml);
            });
        }
    }
},

Code final

index.html :

<!doctype html>
<html lang="en">
 <head>
   <title>Title</title>
   <!-- Required meta tags -->
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

   <!-- Bootstrap CSS -->
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
 </head>
 <body>

   <!-- div.container>div.row.mt-3>div.col-12>form>input.form-control -->
   <div class="container">
       <div class="row mt-3">
           <div class="col-12">
               <input id="search" type="text" class="form-control">

               <hr>

               <div id="results"></div>
           </div>
       </div>
   </div>

   <!-- Optional JavaScript -->
   <!-- jQuery first, then Popper.js, then Bootstrap JS -->
   <script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
   <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
   <script src="app.js"></script>
 </body>
</html>

app.js :

$(function() {

   const search = $('#search');
   const omdbApiKey = 'VOTRE_API_KEY';

   search.on('input', function() {
       console.log( $(this).val() );

       $.ajax({
           url: 'http://www.omdbapi.com/',
           type : 'GET',
           data : {
               'apikey': omdbApiKey,
               's' : $(this).val()
           },

           success : function(result) {

               if (search.val().length >= 3 ) {

                   $('#results').html('');

                   if (result.Search && result.Search.length > 0) {


                       // comme en PHP : foreach ($result['Search'] as $movie)
                       result.Search.forEach(function (movie) {

                           console.log(movie);

                           let movieHtml = '<div class="card">' +
                               '<div class="card-header">' + movie.Title + '</div>' +
                               '<div class="card-body"><img src="' + movie.Poster + '" height="100"></div>' +
                               '</div>';

                           $('#results').append(movieHtml);
                       });
                   }
               }
           },

           // error : function(result) {
           //     console.log('erreur réseau !');
           // },

           // complete: function(result) {
           //     console.log('fini !');
           // }
       });
   });
});

Exercices

1. Potter API

Vous utiliserez la Potter API qui retourne des données issues de Harry Potter : https://www.potterapi.com

Pensez à vous enregistrer pour avoir une clé d'API (voir la doc section Authentication)

Exercice 1

En utilisant la route /characters de la Potter API, vous créérez un moteur de recherche de personnages. Vous afficherez les résultats sous l'input de recherche, tout comme l'exercice sur l'OMDB API du cours.

**Améliorations possibles : **

  • Ajouter des checkbox pour ajouter des paramètres de recherche pour les paramètres booléens : deathEater, dumbledoresArmy, orderOfThePhoenix, ministryOfMagic
  • Ajouter un select pour ajouter des paramètres de recherche pour les paramètres à choix fermé : bloodStatus, house

Exercice 2

En utilisant la route /sortingHat qui retourne une maison au hasard entre 'Gryffindor', 'Ravenclaw', 'Slytherin', 'Hufflepuff', vous créérez un bouton Choisir une maison qui, en le cliquant, appelle l'API et retourne la maison choisie au hasard par l'API.

**Améliorations possibles : **

  • Comme on nous retourne une maison, et que les personnages de l'API /characters ont un paramètre house, essayez d'afficher tous les personnages de la maison choisie au hasard en appelant donc successivement : 1. /sortingHat pour choisir une maison, puis 2. /characters pour trouver les personnages filtrés par la maison.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment