it-swarm.com.de

Wie erstelle ich eine RESTful-API?

Das Problem ist: Ich habe eine Webanwendung, die auf einem PHP Server läuft. Ich würde gerne eine REST api dafür erstellen.
Ich habe einige Nachforschungen angestellt und herausgefunden, dass REST api HTTP-Methoden (GET, POST ...) für bestimmte URIs mit einem Authentifizierungsschlüssel (nicht unbedingt) und den Informationen verwendet wird als HTTP-Antwort mit den Informationen als XML oder JSON zurückgegeben (ich würde lieber JSON).

Meine Frage ist:

  1. Wie erstelle ich als Entwickler der App diese URIs? Muss ich an dieser URI einen PHP Code schreiben?
  2. Wie erstelle ich die JSON-Objekte, die als Antwort zurückgegeben werden sollen?
73

Hier ist ein sehr einfaches Beispiel in einfachem PHP.

Es gibt 2 Dateien client.php & api.php. Ich habe beide Dateien auf die gleiche URL gestellt: http://localhost:8888/, also musst du den Link zu deiner eigenen URL ändern. (Die Datei kann sich auf zwei verschiedenen Servern befinden.).

Dies ist nur ein Beispiel, es ist sehr schnell und schmutzig und es ist lange her, seit ich PHP gemacht habe. Aber das ist die Idee einer 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));

?>

Ich habe die Datenbank für dieses Beispiel nicht aufgerufen, aber normalerweise sollten Sie dies tun. Sie sollten auch die Funktion "file_get_contents" durch "curl" ersetzen.

67
Simon marc

Im Jahr 2013 sollten Sie so etwas wie Silex oder Slim verwenden

Silex-Beispiel:

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

Schlankes Beispiel:

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

Das ist so ziemlich das gleiche wie bei einer normalen Website.

Normales Muster für eine PHP-Website ist:

  1. Der Benutzer gibt eine URL ein
  2. Der Server erhält die URL, analysiert sie und führt eine Aktion aus
  3. In dieser Aktion erhalten/generieren Sie alle Informationen, die Sie für die Seite benötigen
  4. Sie erstellen die HTML/PHP-Seite mit den Informationen aus der Aktion
  5. Der Server generiert eine vollständige HTML-Seite und sendet sie an den Benutzer zurück

Mit einem API fügen Sie einfach einen neuen Schritt zwischen 3 und 4 hinzu. Erstellen Sie nach 3 ein Array mit allen benötigten Informationen. Codiere dieses Array in json und beende oder gib diesen Wert zurück.

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

Das alles für die API. Für die Client-Seite können Sie die API über die URL aufrufen. Wenn die API nur mit get call funktioniert, denke ich, ist es möglich, einfach einen zu machen (zur Kontrolle benutze ich normalerweise curl).

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

Es ist jedoch üblicher, die Curl-Bibliothek zu verwenden, um get- und post-call auszuführen. Sie können mich fragen, ob Sie Hilfe bei Locken brauchen.

Sobald Sie die Informationen von der API erhalten haben, können Sie die 4 und 5 Schritte ausführen.

Suchen Sie im PHP-Dokument nach json function und file_get_contents.

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


BEARBEITEN

Nein, warte, ich verstehe es nicht. "PHP-API-Seite" Was meinst du damit?

Die API ist nur die Erstellung/Wiederherstellung Ihres Projekts. Du sendest NIEMALS direkt das HTML-Ergebnis (wenn du eine Website erstellst) und wirfst eine API. Sie rufen die API mit der URL auf, die API gibt Informationen zurück, und Sie verwenden diese Informationen, um das Endergebnis zu erstellen.

beispiel: Sie möchten eine HTML-Seite schreiben, die Hallo xxx sagt. Aber um den Namen des Benutzers zu erhalten, müssen Sie die Informationen von der API abrufen.

Nehmen wir also an, Ihre API hat eine Funktion mit user_id als Argument und gibt den Namen dieses Benutzers zurück (sagen wir getUserNameById (user_id)), und Sie rufen diese Funktion nur für eine URL wie Ihre/api/ulr/getUser/id auf.

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

Von der Client-Seite , die Sie tun

    $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>

Der Client greift also nie direkt auf die Datenbanken zu, die die API-Rolle spielen.

Ist das klarer?

10
Simon marc

(1) Wie erstelle ich ... diese URIs? Muss ich dazu einen PHP= Code schreiben? URI?

Es gibt keinen Standard für das Einrichten eines API-URI-Schemas, aber häufig werden durch Schrägstriche getrennte Werte verwendet. Hierfür können Sie ...

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

... um ein Array von durch Schrägstriche getrennten Werten im URI after des Dateinamens zu erhalten.

Beispiel: Angenommen, Sie haben eine API-Datei api.php in Ihrer Bewerbung irgendwo und Sie machen eine Anfrage für api.php/members/3, dann $apiArgArray ist ein Array mit ['members', '3']. Sie können diese Werte dann verwenden, um Ihre Datenbank abzufragen oder eine andere Verarbeitung durchzuführen.

(2) Wie erstelle ich die JSON-Objekte, die als Antwort zurückgegeben werden sollen?

Sie können jedes PHP Objekt nehmen und mit json_encode in JSON verwandeln. Sie möchten auch den entsprechenden Header setzen.

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

All dies ist gut für eine API, die JSON zurückgibt, aber die nächste Frage, die Sie stellen sollten, ist:

(3) Wie mache ich mein API RESTful?

Dafür verwenden wir $_SERVER['REQUEST_METHOD'], um die verwendete Methode zu ermitteln und darauf basierend verschiedene Aktionen auszuführen. Das Endergebnis ist also so etwas wie ...

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

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

6
Luke

Ich weiß, dass diese Frage akzeptiert wird und ein bisschen alt ist, aber dies könnte für einige Leute hilfreich sein, die sie immer noch relevant finden. Obwohl das Ergebnis keine vollständige RESTful-API ist, können Sie mit API Builder mini lib for PHP) MySQL-Datenbanken auf einfache Weise in über das Web zugängliche JSON-APIs umwandeln.

2
Brannon

Ein anderes Framework, das bisher nicht erwähnt wurde, ist Laravel . Es ist großartig für das Erstellen von PHP Apps im Allgemeinen, aber dank des großartigen Routers ist es wirklich komfortabel und einfach, umfangreiche APIs zu erstellen. Es ist vielleicht nicht so schlank wie Slim oder Sliex, aber es gibt Ihnen eine solide Struktur .

Siehe Aaron Kuzemchak - Einfache API-Entwicklung mit Laravel auf YouTube und

Laravel 4: A Start at a RESTful API auf NetTuts +

2
zimt28

Wie Simon Marc schon sagte, ist der Prozess fast der gleiche wie für Sie oder mich beim Surfen auf einer Website. Wenn Sie mit der Verwendung des Zend-Frameworks vertraut sind, gibt es einige leicht zu befolgende Tutorials, die das Einrichten des Lebens recht einfach machen. Der schwierigste Teil beim Erstellen einer erholsamen API ist das Design der API, und damit sie wirklich erholsam ist, denken Sie CRUD in Datenbankbegriffen.

Es könnte sein, dass Sie wirklich eine xmlrpc-Schnittstelle oder ähnliches wollen. Was soll diese Schnittstelle für Sie tun?

--BEARBEITEN

Hier habe ich mit ruhigem API und Zend Framework angefangen. Zend Framework Example

Kurz gesagt, verwenden Sie Zend Rest Server nicht, es ist veraltet.

0
James Butler