Як створити RESTful API?


77

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

Моє запитання:

  1. Як мені, як розробнику програми, створювати ці URI? Чи потрібно писати PHP-код на цьому URI?
  2. Як побудувати об’єкти JSON, які повертатимуться як відповідь?


Я написав цю публікацію в блозі, яка містить приклад коду та інструкції щодо цього.
мевдшее

Відповіді:


68

Ось дуже простий приклад у простому 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".


Саймоне, дякую тобі за приклад. Я просто хочу бути впевненим: припустимо, у мене є ресурс під назвою User, тоді мені потрібно помістити файл API у: mydomain.com/api/user Правильно?
Sharon Haim Pour

Ви можете назвати файл як завгодно. Але так, набагато краще назвати файл із чітким іменем. Подивіться в моєму файлі api, я перевіряю параметр get і викликаю функцію завдяки цьому значенню. Ви можете зробити включення user.php і викликати функцію, яка знаходиться в цьому файлі, або ви можете помістити файл в api / user і обробляти параметри звідси.
Саймон Марк

Отже, в основному, мені потрібно оновити таблицю маршрутизації сервера, щоб зіставити певні URL-адреси з певним файлом PHP на сервері. Правильно?
Sharon Haim Pour

1
Так, але те саме, що і створення звичайного веб-сайту, - це лише та інформація, яку ви відправляєте назад і яку змінюєте.
Саймон Марк

6
Тут використовується лише "GET" і ніколи не розглядається метод запиту, тому це не RESTful . Див stackoverflow.com/a/897311/1766230 для прикладу, і en.wikipedia.org/wiki / ...
Лука

34

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

1
Дякую. Я використовував Slim, і у мене голий API пробігся за кілька хвилин.
user12345

Що б ви порадили для більш складного (детального) apis? Slim зручний, але всі функції містяться в одному файлі, тому читабельність досить важка.
Ilker Baltaci

2
@IlkerBaltaci За допомогою Silex ви можете витягати контролери у класи. Ось хороший опис цього, а також деякі плюси і мінуси використання мікрофреймворку порівняно з повнофункціональним фреймворком igor.io/2012/11/09/scaling-silex.html . Я особисто віддаю перевагу Silex, оскільки він дає мені найважливіші речі і дозволяє вибрати решту мого стека.
голографічний принцип

10

Це майже те саме, що створили звичайний веб-сайт.

Звичайним шаблоном для веб-сайту 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 для здійснення викликів та отримання дзвінків. Ви можете запитати мене, чи потрібна вам допомога з завиванням.

Отримавши інформацію з API, ви можете виконати 4 та 5 кроки.

Шукайте php doc для функції json та file_get_contents.

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


РЕДАГУВАТИ

Ні, почекай, я не розумію. "сторінка API php", що ви маєте на увазі під цим?

API - це лише створення / відновлення вашого проекту. Ви НІКОЛИ не надсилаєте безпосередньо результат html (якщо ви робите веб-сайт), кидаючи api. Ви викликаєте api з URL-адресою, API повертає інформацію, ви використовуєте цю інформацію для створення кінцевого результату.

приклад: ви хочете написати 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. Також зазначимо, що API повинен встановити правильний тип вмісту для відповіді. Щодо json, див. Stackoverflow.com/questions/477816/the-right-json-content-type
Бен

Тож я повинен мати на сервері одну сторінку API php, яка управляє всіма запитами?
Sharon Haim Pour

Ні, почекай, я не розумію. "сторінка API php", що ви маєте на увазі під цим?
Simon marc

Моє питання полягає в тому, куди слід вказувати запити API? До якого файлу на сервері?
Sharon Haim Pour

Які файли ви хочете, це точно так само, як і створений веб-сайт, за винятком того, що ви викликаєте api від клієнта, а не від браузера. Але для api нічого не зміниться. Отримавши URL-адресу на serveur, ви вирішуєте, що з цим робити, завдяки параметру get і post. Ви вже створили веб-сайт? Чи використовували ви такий фреймворк, як торт, симфонія чи дзенд?
Саймон Марк

7

(1) Як мені ... побудувати ці URI? Чи потрібно писати PHP-код на цьому URI?

Не існує стандарту, як слід налаштовувати схему API URI, але загальноприйнятим є значення, розділені косою рисою. Для цього ви можете використовувати ...

$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


2

Інший фреймворк, про який досі не згадувалося, - Laravel . Це чудово для створення PHP-додатків загалом, але завдяки чудовому маршрутизатору дуже зручно і просто створювати багаті API. Це може бути не так тонко, як Slim або Sliex, але це дає вам міцну структуру.

Див. Аарон Куземчак - Проста розробка API за допомогою Laravel на YouTube та

Laravel 4: Початок з RESTful API на NetTuts +


2

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


0

Як сказав Сімон Марк, процес майже такий самий, як і для вас, або для перегляду веб-сайту. Якщо вам зручно користуватися фреймворком Zend, є кілька простих підручників, які полегшують життя. Найскладніша частина побудови спокійного API - це дизайн його, і зробити його по-справжньому спокійним, думайте CRUD з точки зору бази даних.

Можливо, ви дійсно хочете інтерфейс xmlrpc або щось інше подібне. Що ви хочете, щоб цей інтерфейс дозволяв вам робити?

- РЕДАКТУВАТИ

Ось тут я розпочав роботу зі спокійним API та Zend Framework. Приклад фреймворку Zend

Коротше не використовуйте сервер відпочинку Zend, він застарів.


Якщо вам цікаво, я розміщу щось у своєму блозі про початок роботи з веб-службами ZF та RESTful із повним робочим прикладом.
James Butler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.