Tuto : appeler une API en PHP (réponses en JSON)

Dans ce petit tutoriel, je vais vous montrer comment développer une application en PHP appelant une API qui va récupérer le résultat de la requête en JSON (JavaScript Object Notation) pour l’afficher sur votre site web.

Les API sur Internet

Les API sont un moyen d’accéder aux données d’un site sans avoir l’autorisation d’accéder directement à la base de données. Il y a beaucoup de portails sécurisés permettant à vos applications web de manipuler les données renvoyées par ces sites.

L’exemple parfait est Twitter, c’est d’ailleurs l’API de Twitter que nous allons utiliser dans ce tuto. Elle permet de lire la timeline d’une personne en particulier, de rechercher des statuts à partir d’un mot clé, de modifier les paramètres de votre compte, etc. Nous nous limiterons à la partie la plus simple et facile à mettre en place pour introduire les API.

Pourquoi choisir JSON ?

Vous pouvez utiliser les API avec de nombreux langages et retourner les données de plusieurs façons. L’une d’elles est le JSON (JavaScript Object Notation). C’est un format de données léger, facile à lire et à écrire et compatible avec pas mal de langages de développement. Sa structure est composée d’objets et de tableaux. Sa flexibilité fait de JSON le parfait candidat pour retourner des données.

Structure du projet

Notre application web va afficher les Tweets contenant le mot clé de votre choix. La limite est de 10 tweets mais elle est paramétrable lors de l’appel de l’API.

Le projet va tourner autour de 2 fichiers : index.php dans lequel il y aura le formulaire de recherche et resultat.php dans lequel plusieurs actions seront effectuées. Nous y reviendrons un peu plus tard. Il y a également un dossier nommé cache qui contiendra les fichiers .json contenant les résultats des recherches. C’est un système de cache très simple basé sur des fichiers. Il existe bien d’autres méthodes de mise en cache (base de données). A vous de voir ce qui vous convient le mieux.

Première étape : le formulaire de recherche

Tout ce qu’il nous faut est un formulaire pour envoyer votre recherche en POST sur resultat.php :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Tuto PHP API</title></head>
<body>
    <form action="resultat.php" method="post"><label for="mot">Mot recherch&eacute;</label> <input type="text" name="mot" /> <input type="submit" value="Rechercher" /></form>
</body>
</html>

Récupérer et mise en cache des résultats

La prochaine étape va permettre de nettoyer la recherche, récupérer le retour de l’API, de le mettre en cache et de l’afficher. Je vais passer à travers le fichier à l’aide de bouts de code.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Tuto PHP API</title>
</head>
<body>
<?php

    function cleanString($string)
    {
        // on supprime : majuscules ; / ? : @ & = + $ , . ! ~ * ( ) les espaces multiples et les underscore
        $string = strtolower($string);
        $string = preg_replace("/[^a-z0-9_'\s-]/", "", $string);
        $string = preg_replace("/[\s-]+/", " ", $string);
        $string = preg_replace("/[\s_]/", " ", $string);
        return $string;
    }

La fonction cleanString assure que la recherche effectuées ne comporte que des minuscules et sans ponctuations inutiles. Modifiez la à votre sauce si vous avez besoin de tel ou tel caractère.

if (isset($_POST['mot']) && !empty($_POST['mot'])) {
    $motRecherche = urlencode(cleanString($_POST['mot']));
    $dir = 'cache';
    $match = '';
    foreach (glob($dir . '/*.json') as $fichier) {
        if (basename($fichier, '.json') == $motRecherche) {
            $match = $fichier;
        }
    }
}

Nous vérifions que les données reçues du formulaire ne sont pas vides. Puis nous passons ces données dans la fonction vue précédemment. Enfin, nous allons vérifier la présence du fichier de cache de la requête. Pour cela, nous utilisons la fonction basename. Elle permet de récupérer uniquement le nom du fichier (sans le .json). Nous utilisons aussi la fonction blog qui permet de rechercher des fichiers qui répondent à une certaine recherche. Glob ne peut rechercher des fichiers que localement. Si jamais le fichier de cache est trouvé, le nom du fichier est assigné à la variable $match.

if ($match != '' && (time() - filemtime($match) < 60)) {
    $raw = file_get_contents($match);
    $json = json_decode($raw);
} else {
    $url = "http://search.twitter.com/search.json?q=" . $motRecherche . "&rpp=10&include_entities=true&result_type=recent&lang=fr&locale=fr";
    $raw = file_get_contents($url);
    file_put_contents($dir . '/' . $motRecherche . '.json', $raw);
    $json = json_decode($raw);
}

Voici concrètement l’appel de l’API. Dans un premier temps, si $match contient le nom d’un fichier et que ce fichier n’est pas plus vieux de 60 secondes (en gros, nous avons un système de cache de 60 secondes), nous allons lire le contenu du fichier et l’assigner à la variable $json. Si par contre aucun fichier n’a été trouvé ou que le fichier trouvé a été modifié il y a plus de 60 secondes, nous appelons l’API de Twitter pour lui envoyer plusieurs paramètres :

  • le mot recherché
  • le nombre de résultats (rpp)
  • le type de résultat (les plus récents)
  • la langue du tweet (lang)
  • les meta données du tweet (include entities)

Une fois le résultat récupéré, nous l’assignons à $json.

if(!empty($json->results)) {
foreach($json->results as $msg) {
    echo "<u>" . $msg->from_user_name ."</u> : ". $msg->text;
    echo "<br />";
}
}else {
    echo "Rien n'a &eacute;t&eacute; trou&eacute;.";
}
}else {
    echo "Aucune recherche effectu&eacute;e.";
}

?>
</body>
</html>

Enfin, nous affichons le résultat de notre recherche. $json->results corresponds à chacun des résultats, c’est pourquoi nous bouclons dessus pour en récupérer les données.

Voici par exemple le résultat de la recherche de « l’avion » :

php api json

Pour télécharger cette application, cliquez ici.

Les possibilités n’ont pas de limite. Voici une liste de quelques APIs compatibles avec JSON :

Ajouter un onglet dans l'admin de WordPress
Bookmarklets SEO en Javascript

6 Comments on “Tuto : appeler une API en PHP (réponses en JSON)”

  1. Attention, il est à noter que l’API Twitter 1.0 (utilisée dans cet article) est dépréciée et qu’il faut maintenant utiliser la version 1.1 (ouais, super ! merci Twitter :-( ).

    Doc de la recherche 1.0 : https://dev.twitter.com/docs/api/1/get/search
    Doc de la recherche 1.1 : https://dev.twitter.com/docs/api/1.1/get/search/tweets

    Deux posts du blog de Twitter qui parlent de la version 1.1 de leur API :
    https://dev.twitter.com/blog/changes-coming-to-twitter-api
    https://dev.twitter.com/blog/current-status-api-v1.1

  2. merci pour le tuto, mais en réalité je suis débutant en ce qui concerne les API, je voudrais vraiment que l’on me dise à quoi ca sert? comment on les utilise? et comment on les developpe en php? je ne sais pas si ma question a un sens mais je pense que vous pourrez m’aider dans ce sens

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *