10 API REST & JSON
Qu'est-ce qu'une API ?
Une API (Application Programming Interface) est une interface pour les applications; elle permet la manipulations de données, méthodes, fonctions etc. C'est un mécanisme à la base de tout génie logiciel complexe.
Une API REST
Nous allons voir dans cette partie comment développer une API en PHP qui retournera un résultat sous la forme d'une réponse au format JSON (JavaScript Object Notation).
REST (Representational State Transfer) est un standard créé en 2000 par Roy Fielding dans sa thèse "Architectural Styles and the Design of Network-based Software Architectures".
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. 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.
Ou encore l'API proposer par votre professeur durant ce cours à savoir allosaurus.delahayeyourself.info
REST et HTTP
Les API REST sont basées sur HTTP (Hypertext Transfer Protocol) le protocole au cœur du web ! Bien sûr, toutes les API ne sont pas basées sur HTTP, mais en choisissant une API REST, vous simplifiez l'intégration et l'utilisation de votre API en utilisant un protocole ouvert, standardisé et simple d'utilisation.
Les critères REST
Les API REST imitent la façon dont le web lui-même marche dans les échanges entre un client et un serveur. Une API REST est donc:
- Sans état (aucune idée de l'état du client entre deux requêtes, donc aucune liaison entre elles),
- Cacheable (avec cache = mémoire),
- Orienté client-serveur.
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.
Une API avec PHP & Flight
Pour créer une api rien de bien complexe, il suffit de:
- Définir une route (par exemple /api/helloworld),
- Retourner des données au format JSON depuis cette route.
Notre première API
Nous souhaitons créer une API associé à la route /api/helloworld
qui nous retourne un résultat équivalent à:
{"data":"Hello World!"}
Mise en place d'un test d'intégration
Nous allons créer une nouvelle classe de test (donc un nouveau fichier php dans le répertoire tests
) ApiTest qui servira à .. tester notre api !
<?php
require_once 'vendor/autoload.php';
class ApiTest extends IntegrationTest{
public function test_api_helloworld()
{
$response = $this->make_request("GET", "/api/helloworld");
$this->assertEquals(200, $response->getStatusCode());
$this->assertContains("application/json", $response->getHeader('Content-Type')[0]);
$body = $response->getBody()->getContents();
$json_result = json_encode(['data' => 'Hello World!']);
$this->assertEquals($json_result, $body);
}
}
Le test test_api_helloworld
effectue une requête sur /api/helloworld
et vérifie les assertions suivantes:
- Le code statut de la requête est égale à 200,
- Le type de réponse est bien
application/json
et nontext/html
, - Le contenu de la réponse est égale à la conversion en JSON d'un tableau associatif contenant une clé
data
avec la valeurHello World
.
Création de notre api
Voici le code de notre route:
<?php
Flight::route('/api/helloworld', function(){
$data = [
'data' => 'Hello World!',
];
Flight::json($data);
});
Flight nous permet de retourner directement des données au format JSON via la méthode Flight::json
.
À vous de jouer
- Créer une route (et les tests associés)
/api/helloworld/@name
qui retourneHello $name
, - Créer une route (et les tests associés)
/api/users
qui retourne l'ensemble des utilisateurs de la base de données tweets. - Créer une route
/api/user/@username
qui retourne un utilisateur selon son nom d'utilisateur et l'ensemble de ses tweets.