Как построить RESTful API? - PullRequest
73 голосов
/ 13 января 2011

Проблема заключается в следующем: У меня есть веб-приложение, которое работает на сервере PHP. Я хотел бы создать REST API для этого.
Я провел некоторое исследование и выяснил, что REST API использует методы HTTP (GET, POST ...) для определенных URI с ключом аутентификации (необязательно), и информация представляется в виде ответа HTTP с информацией в виде XML или JSON. (Я бы предпочел JSON).

Мой вопрос:

  1. Как мне, как разработчику приложения, создать эти URI? Нужно ли писать код PHP на этот URI?
  2. Как мне построить объекты JSON для возврата в качестве ответа?

Ответы [ 7 ]

67 голосов
/ 18 января 2011

Вот очень простой пример простого php.

Есть 2 файла client.php & api.php .Я поместил оба файла на один и тот же URL: http://localhost:8888/, поэтому вам придется изменить ссылку на свой собственный URL.(файл может находиться на двух разных серверах).

Это всего лишь пример, он очень быстрый и грязный, к тому же, я давно занимался php.Но это идея 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));

?>

Я не звонилбаза данных для этого примера, но обычно это то, что вы должны сделать.Вам также следует заменить функцию «file_get_contents» на «curl».

34 голосов
/ 18 марта 2013

В 2013 году вы должны использовать что-то вроде Silex или Slim

Пример Silex:

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

Тонкий пример:

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name";
});
$app->run();
10 голосов
/ 13 января 2011

Это почти то же самое, что и создание обычного веб-сайта.

Обычный шаблон для веб-сайта php:

  1. Пользователь вводит URL
  2. Сервер получает URL-адрес, анализирует его и выполняет действие
  3. . В этом действии вы получаете / генерируете всю необходимую вам информацию для страницы
  4. Вы создаете страницу html / php с информацией изaction
  5. Сервер сгенерирует полностью HTML-страницу и отправит ее обратно пользователю

С помощью API вы просто добавляете новый шаг между 3 и 4. После 3 создайтемассив со всей необходимой информациейКодируйте этот массив в json и выходите или возвращайте это значение.

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

Это все для API.Для клиентской стороны вы можете вызвать API по URL.Если API работает только с get call, я думаю, что это можно сделать просто (для проверки я обычно использую curl).

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

Но более распространенным является использование библиотеки curl для выполнения get и postвызов.Вы можете спросить меня, нужна ли вам помощь с curl.

Как только вы получите информацию из API, вы можете выполнить шаги 4 и 5.

Посмотрите php doc для функции json и file_get_contents.

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


EDIT

Нет, подождите, я не понимаю."php API page" что вы подразумеваете под этим?

API - это только создание / восстановление вашего проекта.Вы НИКОГДА не отправляете напрямую результат html (если вы создаете веб-сайт).Вы вызываете API с URL-адресом, информацией о возврате API, вы используете эту информацию для создания окончательного результата.

ex: вы хотите написать html-страницу, которая скажет привет xxx.Но чтобы получить имя пользователя, вы должны получить информацию из API.

Итак, предположим, что в вашем API есть функция, в которой аргумент user_id имеет значение и возвращает имя этого пользователя (скажем, getUserNameById (user_id)), и вы вызываете эту функцию только по URL, такому как ваш / 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.
}

Со стороны на стороне клиента вы делаете

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

Таким образом, клиент никогда не обращается напрямую к базам данных, что роль API.

Это понятнее?

6 голосов
/ 05 апреля 2015

(1) Как ... построить эти URI? Нужно ли писать код PHP для этого URI?

Стандартов нетдля того, как должна быть настроена схема API URI, но обычно есть значения, разделенные косой чертой.Для этого вы можете использовать ...

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

..., чтобы получить массив значений, разделенных косой чертой в URI после имени файла.

Пример. Предполагается, что в вашем приложении где-то есть файл API api.php и вы выполняете запрос на api.php/members/3, тогда $apiArgArray будет массивом, содержащим ['members', '3'].Затем вы можете использовать эти значения для запроса к вашей базе данных или для другой обработки.

(2) Как построить объекты JSON для возврата в качестве ответа?

Вы можете взять любой объект PHP и превратить его в JSON с помощью json_encode .Вы также захотите установить соответствующий заголовок.

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

Все это хорошо для API, который возвращает JSON, но следующий вопрос, который вы должны задать:

(3) Как мне сделать мой API RESTful?

Для этого мы будем использовать $_SERVER['REQUEST_METHOD'], чтобы получить используемый метод, а затем делать разные вещи, основываясь на этом.Таким образом, окончательный результат выглядит примерно так: *

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

Источники: https://stackoverflow.com/a/897311/1766230 и http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services

2 голосов
/ 05 сентября 2013

Я знаю, что этот вопрос принят и немного устарел, но это может быть полезно для некоторых людей, которые все еще считают его актуальным. Хотя результатом является не полный API RESTful, мини-библиотека API Builder для PHP позволяет легко преобразовывать базы данных MySQL в доступные через Интернет JSON API.

2 голосов
/ 03 июля 2013

Еще один фреймворк, который до сих пор не упомянут, - Laravel .Он отлично подходит для создания приложений PHP в целом, но благодаря отличному маршрутизатору действительно удобно и просто создавать богатые API.Возможно, он не такой тонкий, как Slim или Sliex, но дает вам прочную структуру.

См. Аарон Куземчак - Простая разработка API с Laravel на YouTube и

Laravel 4: начало работы с RESTful API в NetTuts +

0 голосов
/ 14 января 2011

Как сказал Саймон Марк, процесс такой же, как и для вас, или я просматриваю веб-сайт. Если вы знакомы с использованием Zend Framework, есть несколько простых руководств, которые упрощают настройку жизни. Самая сложная часть построения успокоительного API - это разработка и создание действительно спокойного, думайте CRUD в терминах базы данных.

Возможно, вам действительно нужен интерфейс xmlrpc или что-то подобное. Что вы хотите, чтобы этот интерфейс позволял вам делать?

- EDIT

Вот где я начал работать с restful api и Zend Framework. Пример Zend Framework

Короче говоря, не используйте Zend rest server, он устарел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...