web-dev-qa-db-fra.com

Comment construire une API RESTful?

Le problème est le suivant: j'ai une application Web qui s'exécute sur un serveur PHP. J'aimerais créer une API REST pour cela.
J'ai fait quelques recherches et j'ai découvert que REST api utilise des méthodes HTTP (GET, POST ...) pour certains URI avec une clé d'authentification (pas nécessairement) et les informations est présenté comme une réponse HTTP avec les informations en XML ou JSON (JSON plutôt).

Ma question est:

  1. Comment puis-je, en tant que développeur de l'application, construire ces adresses URI? Dois-je écrire un PHP code à cet URI?)
  2. Comment créer les objets JSON à renvoyer en réponse?
73
Sharon Haim Pour

Voici un exemple très simple en php simple.

Il y a 2 fichiers client.php & api.php. Je mets les deux fichiers sur la même URL: http://localhost:8888/, vous devrez donc modifier le lien vers votre propre URL. (le fichier peut être sur deux serveurs différents).

Ceci est juste un exemple, c'est très rapide et sale, en plus cela fait longtemps que je n'ai pas php. Mais c'est l'idée d'une api.

client.php

<?php

/*** this is the client ***/


if (isset($_GET["action"]) && isset($_GET["id"]) && $_GET["action"] == "get_user") // if the get parameter action is get_user and if the id is set, call the api to get the user information
{
  $user_info = file_get_contents('http://localhost:8888/api.php?action=get_user&id=' . $_GET["id"]);
  $user_info = json_decode($user_info, true);

  // THAT IS VERY QUICK AND DIRTY !!!!!
  ?>
    <table>
      <tr>
        <td>Name: </td><td> <?php echo $user_info["last_name"] ?></td>
      </tr>
      <tr>
        <td>First Name: </td><td> <?php echo $user_info["first_name"] ?></td>
      </tr>
      <tr>
        <td>Age: </td><td> <?php echo $user_info["age"] ?></td>
      </tr>
    </table>
    <a href="http://localhost:8888/client.php?action=get_userlist" alt="user list">Return to the user list</a>
  <?php
}
else // else take the user list
{
  $user_list = file_get_contents('http://localhost:8888/api.php?action=get_user_list');
  $user_list = json_decode($user_list, true);
  // THAT IS VERY QUICK AND DIRTY !!!!!
  ?>
    <ul>
    <?php foreach ($user_list as $user): ?>
      <li>
        <a href=<?php echo "http://localhost:8888/client.php?action=get_user&id=" . $user["id"]  ?> alt=<?php echo "user_" . $user_["id"] ?>><?php echo $user["name"] ?></a>
    </li>
    <?php endforeach; ?>
    </ul>
  <?php
}

?>

api.php

<?php

// This is the API to possibility show the user list, and show a specific user by action.

function get_user_by_id($id)
{
  $user_info = array();

  // make a call in db.
  switch ($id){
    case 1:
      $user_info = array("first_name" => "Marc", "last_name" => "Simon", "age" => 21); // let's say first_name, last_name, age
      break;
    case 2:
      $user_info = array("first_name" => "Frederic", "last_name" => "Zannetie", "age" => 24);
      break;
    case 3:
      $user_info = array("first_name" => "Laure", "last_name" => "Carbonnel", "age" => 45);
      break;
  }

  return $user_info;
}

function get_user_list()
{
  $user_list = array(array("id" => 1, "name" => "Simon"), array("id" => 2, "name" => "Zannetie"), array("id" => 3, "name" => "Carbonnel")); // call in db, here I make a list of 3 users.

  return $user_list;
}

$possible_url = array("get_user_list", "get_user");

$value = "An error has occurred";

if (isset($_GET["action"]) && in_array($_GET["action"], $possible_url))
{
  switch ($_GET["action"])
    {
      case "get_user_list":
        $value = get_user_list();
        break;
      case "get_user":
        if (isset($_GET["id"]))
          $value = get_user_by_id($_GET["id"]);
        else
          $value = "Missing argument";
        break;
    }
}

exit(json_encode($value));

?>

Je n’ai appelé la base de données pour cet exemple, mais c’est normalement ce que vous devriez faire. Vous devez également remplacer la fonction "file_get_contents" par "curl".

67
Simon marc

En 2013, vous devriez utiliser quelque chose comme Silex ou Slim

Silex exemple:

require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application(); 

$app->get('/hello/{name}', function($name) use($app) { 
    return 'Hello '.$app->escape($name); 
}); 

$app->run(); 

Exemple Slim:

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name";
});
$app->run();
34

C'est à peu près la même chose que de créer un site Web normal.

Le schéma normal pour un site web php est:

  1. L'utilisateur entre une url
  2. Le serveur récupère l’URL, l’analyse et exécute une action
  3. Dans cette action, vous obtenez/générez toutes les informations dont vous avez besoin pour la page.
  4. Vous créez la page html/php avec les informations de l'action
  5. Le serveur génère une page HTML complète et la renvoie à l'utilisateur.

Avec une api, vous ajoutez simplement une nouvelle étape entre 3 et 4. Après 3, créez un tableau avec toutes les informations dont vous avez besoin. Encodez ce tableau en json et quittez ou retournez cette valeur.

$info = array("info_1" => 1; "info_2" => "info_2" ... "info_n" => array(1,2,3));
exit(json_encode($info));

C'est tout pour l'api. Pour le côté client, vous pouvez appeler l’API par l’URL. Si l'API fonctionne uniquement avec get call, je pense qu'il est possible de faire simplement (pour vérifier, j'utilise normalement curl).

$info = file_get_contents(url);
$info = json_decode($info);

Mais il est plus courant d'utiliser la bibliothèque curl pour effectuer des appels successifs. Vous pouvez me demander si vous avez besoin d'aide avec curl.

Une fois que vous obtenez les informations de l’API, vous pouvez effectuer les étapes 4 et 5.

Recherchez dans la documentation php les fonctions json et file_get_contents.

curl: http://fr.php.net/manual/fr/ref.curl.php


MODIFIER

Non, attends, je ne comprends pas. "page API PHP" qu'entendez-vous par là?

L'API n'est que la création/récupération de votre projet. Vous ne envoyez JAMAIS directement le résultat HTML (si vous créez un site Web) lancez une api. Vous appelez l'API avec l'URL, les informations de retour de l'API, vous utilisez ces informations pour créer le résultat final.

ex: vous voulez écrire une page html qui dit bonjour xxx. Mais pour obtenir le nom de l'utilisateur, vous devez obtenir les informations de l'API.

Supposons donc que votre API ait une fonction qui a user_id en tant qu'argument et renvoie le nom de cet utilisateur (disons getUserNameById (user_id)) et que vous appelez cette fonction uniquement sur une URL telle que/api/ulr/getUser/id.

Function getUserNameById(user_id)
{
  $userName = // call in db to get the user
  exit(json_encode($userName)); // maybe return work as well.
}

Du côté client vous faites

    $username = file_get_contents(your/api/url/getUser/15); // You should normally use curl, but it simpler for the example
// So this function to this specifique url will call the api, and trigger the getUserNameById(user_id), whom give you the user name.
    <html>
    <body>
    <p>hello <?php echo $username ?> </p>
    </body>
    </html>

Ainsi, le client n'accède jamais directement aux bases de données, c'est le rôle de l'API.

Est-ce plus clair?

10
Simon marc

(1) Comment puis-je ... construire ces URI? Dois-je écrire un PHP à ce moment-là)? URI?

Il n'y a pas de standard pour la configuration d'un schéma d'URI d'API, mais il est courant d'avoir des valeurs séparées par des barres obliques. Pour cela, vous pouvez utiliser ...

$apiArgArray = explode("/", substr(@$_SERVER['PATH_INFO'], 1));

... pour obtenir un tableau de valeurs séparées par des barres obliques dans l'URI après le nom du fichier.

Exemple: en supposant que vous ayez un fichier API api.php dans votre application quelque part et vous faites une demande pour api.php/members/3, puis $apiArgArray sera un tableau contenant ['members', '3']. Vous pouvez ensuite utiliser ces valeurs pour interroger votre base de données ou effectuer un autre traitement.

(2) Comment créer les objets JSON à renvoyer en réponse?

Vous pouvez prendre n'importe quel objet PHP et le transformer en JSON avec json_encode . Vous voudrez également définir l'en-tête approprié.

header('Content-Type: application/json');
$myObject = (object) array( 'property' => 'value' ); // example
echo json_encode($myObject); // outputs JSON text

Tout cela est bon pour une API qui renvoie JSON, mais la prochaine question à poser est la suivante:

(3) Comment rendre mon API RESTful?

Pour cela, nous utiliserons $_SERVER['REQUEST_METHOD'] pour obtenir la méthode utilisée, puis faire différentes choses en fonction de cela. Donc, le résultat final est quelque chose comme ...

header('Content-Type: application/json');
$apiArgArray = explode("/", substr(@$_SERVER['PATH_INFO'], 1));
$returnObject = (object) array();
/* Based on the method, use the arguments to figure out
   whether you're working with an individual or a collection, 
   then do your processing, and ultimately set $returnObject */
switch ($_SERVER['REQUEST_METHOD']) {
  case 'GET':
    // List entire collection or retrieve individual member
    break;
  case 'PUT':       
    // Replace entire collection or member
    break;  
  case 'POST':      
    // Create new member
    break;
  case 'DELETE':    
    // Delete collection or member
    break;
}
echo json_encode($returnObject);

Sources: https://stackoverflow.com/a/897311/17662 et http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services

6
Luke

Je sais que cette question est acceptée et a un peu d’âge, mais cela pourrait être utile pour certaines personnes qui la trouvent encore pertinente. Bien que le résultat ne soit pas une API RESTful complète, API Builder mini lib pour PHP vous permet de transformer facilement des bases de données MySQL en API JSON accessibles sur le Web.

2
Brannon

Un autre cadre qui n’a pas encore été mentionné est Laravel . C'est génial pour la construction d'applications PHP en général, mais grâce au grand routeur, il est vraiment simple et confortable de créer des API riches. Ce n'est peut-être pas aussi mince que Slim ou Sliex, mais cela vous donne une structure solide .

Voir Aaron Kuzemchak - Développement d’API simple avec Laravel sur YouTube et

Laravel 4: Un début avec une API RESTful sur NetTuts +

2
zimt28

Comme Simon Marc l'a dit, le processus est sensiblement le même que pour vous ou pour la navigation sur un site Web. Si vous êtes à l'aise avec l'utilisation du framework Zend, il existe des tutoriels faciles à suivre pour vous simplifier la vie. La partie la plus difficile de la création d’une API reposante est la conception de celle-ci, et la rendant vraiment reposante, pensez à CRUD en termes de base de données.

Il se peut que vous souhaitiez vraiment une interface xmlrpc ou autre chose similaire. Que voulez-vous que cette interface vous permette de faire?

--MODIFIER

Voici où j'ai commencé avec api reposant et Zend Framework. Exemple de Zend Framework

En bref, n'utilisez pas le serveur Zend Rest, il est obsolète.

0
James Butler