Как создать RESTful API?

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

Мой вопрос:

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

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

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

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

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».

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

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

Обычный шаблон для веб-сайта 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 по URL-адресу. Если api работает только с вызовом, я думаю, что можно сделать просто (чтобы проверить, я обычно использую завиток).

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

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

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

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

завиток: http://fr.php.net/manual/fr/ref.curl.php


РЕДАКТИРОВАТЬ

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

Апи – это только создание / восстановление вашего проекта. Вы НИКОГДА не отправляете напрямую результат html (если вы делаете сайт), бросаете api. Вы вызываете 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.

Это яснее?

(1) Как я … создаю эти URI? Нужно ли мне писать PHP-код в этом URI?

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

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

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

Пример. Предполагая, что в вашем приложении есть файл api.php API, и вы делаете запрос для 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, но это дает вам прочную структуру.

См. Aaron Kuzemchak – Простая разработка API с Laravel на YouTube и

Laravel 4: запуск в RESTful API на NetTuts +

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

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

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

–РЕДАКТИРОВАТЬ

Здесь я начал с спокойного api и Zend Framework. Пример Zend Framework

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