Как построить RESTful API?



проблема вот в чем:
У меня есть веб-приложение, которое работает на PHP сервер. Я хотел бы построить REST api для него.

Я провел некоторое исследование и выяснил, что REST api использует методы HTTP (GET, POST...) для некоторых URI с ключом аутентификации (не обязательно), и информация представляется обратно в виде ответа HTTP с информацией в виде XML или JSON (я бы предпочел JSON).



мой вопрос:




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

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

1239   7  

7 ответов:

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

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

Это просто пример, это очень быстро и грязно, плюс это было долгое время, так как я сделал php. Но это идея api.

клиент.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".

в 2013 году, вы должны использовать что-то вроде Силекс или тонкий

пример 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();

Это почти то же самое, что создал нормальный сайт.

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

  1. пользователь вводит url
  2. сервер получает url, анализирует его и выполняет действие
  3. в этом действии вы получаете / генерируете всю необходимую информацию для страницы
  4. вы создаете html / php страницу с информацией из действия
  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 и почтовый звонок. Вы можете спросить меня, если вам нужна помощь с curl.

после получения информации из api, вы можете сделать 4 и 5 шагов.

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

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


EDIT

Нет, подожди, я не понимаю. "страница PHP API" что вы имеете в виду ?

api-это только создание / восстановление вашего проекта. Ты никогда ... отправить непосредственно результат html (если вы делаете веб-сайт) бросить api. Вы вызываете api с url, api возвращает информацию, вы используете эту информацию для создания конечного результата.

пример: вы хотите написать HTML-страницы, которые говорят Привет, ХХХ. Но чтобы получить имя пользователя, вы должны получить информацию из 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.

это яснее ?

(1 )Как это сделать... построить эти Ури? нужно ли писать PHP-код на этом URI?

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

$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

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

посмотреть Аарон Куземчак-простая разработка API с Laravel на YouTube

Laravel 4: Начало в RESTful API на NetTuts+

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

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

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

--EDIT

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

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

Comments

    Ничего не найдено.