77 votes

Comment construire une API RESTful?

La question est:est-ce J'ai une application web qui s'exécute sur un serveur PHP. J'aimerais construire une api REST.
J'ai fait quelques recherches et j'ai compris que le RESTE de l'api utilise les méthodes HTTP (GET, POST,...) pour certains d'URI avec une clé d'authentification (pas nécessairement) et les informations sont présentées comme une réponse HTTP avec l'info comme XML ou JSON (je préfère JSON).

Ma question est:

  1. Comment puis-je, en tant que le développeur de l'application, de construire, de ceux d'URI? Dois-je écrire un bout de code PHP à l'URI?
  2. Comment puis-je construire les objets JSON pour revenir comme réponse?

69voto

Simon marc Points 633

Voici un très simple exemple en php simple.

Il y a 2 fichiers client.php et api.php. J'ai mis les deux fichiers sur la même url : http://localhost:8888/, de sorte que vous aurez à changer le lien vers l'url de votre propre. (le fichier peut être sur deux serveurs différents).

C'est juste un exemple, il est très rapide et sale, et en plus il a été un long temps depuis que je l'ai fait en 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 pas fait appel à la base de données pour cet exemple, mais normalement c'est ce que vous devriez faire. Vous devez également remplacer le "file_get_contents" fonction par "curl".

34voto

finishingmove Points 7927

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();
 

11voto

Simon marc Points 633

C'est à peu près la même créé un site web normal.

Normal pour un site de php est:

  1. À l'utilisateur d'entrer une url
  2. Le serveur obtenir l'url, l'analyser et exécuter une action
  3. Dans cette action, vous obtenez/générer toutes les informations dont vous avez besoin pour la page
  4. Vous créez le code html/php de la page avec les infos de l'action
  5. Le serveur génère un pleinement de la page html et l'envoyer à l'utilisateur

Avec une api, il suffit d'ajouter une nouvelle étape entre le 3 et le 4. Au bout de 3, de créer un tableau avec toutes les informations dont vous avez besoin. Coder ce tableau json et de sortie ou de retour de cette valeur.

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

Que tous pour l'api. Pour le côté client, vous pouvez appeler l'api par l'url. Si l'api de travailler uniquement avec les obtenir de l'appel, je pense que c'est possible de le faire simplement (À vérifier, j'ai l'habitude d'utiliser curl).

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

Mais il est plus courant d'utiliser la boucle de la bibliothèque pour effectuer des get et post-appel. Vous pouvez me demander si vous avez besoin d'aide avec curl.

Une fois que le obtenir de l'information à partir de l'api, vous pouvez faire les 4 & 5 étapes.

Regarde la doc php pour json fonction et file_get_contents.

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


MODIFIER

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

L'api est seulement à la création/récupération de votre projet. Vous n'envoyez JAMAIS directement le code html de résultat (si vous faites un site web) de jeter un api. Vous appelez l'api avec l'url, l'api retour d'informations, vous utiliser cette information pour créer le résultat final.

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

Donc, disons que votre api ont une fonction qui ont user_id comme argument et retourne le nom de cet utilisateur (disons getUserNameById(user_id)), et que vous appelez cette fonction uniquement sur une url de votre/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 ne

    $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 ne jamais accéder directement aux bases de données, que l'api de rôle.

Est plus clair ?

5voto

Atul Goyal Points 1433

Codeigniter-restserver semble être une bonne bibliothèque pour Codeigniter que je vais juste essayer.

2voto

zimt28 Points 78

Un autre cadre qui n'a pas été mentionné jusqu'à présent est de Laravel. Il est idéal pour la construction d'applications PHP en général, mais grâce à la grande routeur, il est vraiment confortable et simple à construire riche Api. Il pourrait ne pas être que slim Mince ou Sliex mais il vous donne une structure solide.

Voir Aaron Kuzemchak - Simple API de Développement Avec Laravel sur YouTube et

Laravel 4: Un Début à une API RESTful sur NetTuts+

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X