Как построить RESTful API?
проблема вот в чем:
У меня есть веб-приложение, которое работает на PHP сервер. Я хотел бы построить REST api для него.
Я провел некоторое исследование и выяснил, что REST api использует методы HTTP (GET, POST...) для некоторых URI с ключом аутентификации (не обязательно), и информация представляется обратно в виде ответа HTTP с информацией в виде XML или JSON (я бы предпочел JSON).
мой вопрос:
- как мне, как разработчику приложения, построить эти URI? Нужно ли мне писать PHP-код на этом URI?
- как построить объекты JSON для возврата в качестве ответа?
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:
- пользователь вводит url
- сервер получает url, анализирует его и выполняет действие
- в этом действии вы получаете / генерируете всю необходимую информацию для страницы
- вы создаете html / php страницу с информацией из действия
- сервер генерирует полностью 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