Пример за REST API с PHP от нулата, без употреба на фреймуърк

Публикувано на 04.09.2018
Пример за REST API с PHP от нулата, без употреба на фреймуърк

Въведение

Преди да преминем към практическата част, нека обясним по разбираем начин какво представлява REST API и защо е толкова важно в съвременната уеб разработка.


Какво е REST API

REST (Representational State Transfer) е архитектурен стил за изграждане на уеб услуги. Най-общо казано, това е концепция за достъп и промяна на ресурси въз основа на взаимодействие между клиент и сървър. Клиентът изпраща заявка, сървърът я обработва и връща отговор, съобразен със заявката.

REST архитектурата има шест основни принципа, а когато едно приложение ги покрива, то може да се нарече RESTful.

API (Application Programming Interface) е набор от правила и методи, които позволяват на различни софтуерни компоненти да комуникират помежду си.

RESTful API е уеб приложение, което следва принципите на REST и HTTP. Обикновено използва JSON за обмен на данни, но може да работи и с други формати. Основните методи, които поддържа, са GET, POST, PUT и DELETE.


За какво се използва REST API

Пример 1: Имаме онлайн бизнес и искаме да следим месечните посещения. Вместо да отваряме Google Analytics всеки път, можем да използваме неговото API чрез Google Developers. Така данните за посещенията ще се показват директно в таблото на нашето собствено приложение.

Пример 2: Работим с библиотечен софтуер, който управлява книги и читатели. Приложението е качено на lib.example.com и съдържа пълна база с библиографски данни. Благодарение на REST API архитектурата, данните могат да се споделят между сайта на библиотеката и сайтовете на училищата.

Така няколко приложения използват обща база данни, като всяко от тях спазва правилата за достъп, зададени от библиотечния софтуер.


Задачата

Да си представим, че клиент иска да извежда статистика за посетителите на своя сайт. Данните се съхраняват в отделно приложение или база, а API-то трябва да ги върне във формат JSON.

Примерен JSON отговор:

{
  "error": false,
  "message": "",
  "data": {
    "Google Analytics": 150,
    "Positive Guys": 5000
  }
}

Задължителни изисквания

  • Да поддържа няколко източника и лесно да се добавят нови

  • Да обработва различни типове заявки

  • Да прихваща грешни данни

  • Да връща резултат в JSON формат

  • Да не използва фреймуърк


Решение

Първо ще създадем приложението, от което клиентът ще получава данните. В нашия случай това е PHP скрипт, който връща JSON отговори. Проектът ще разделим на две части — API приложение и клиент.


1. Изграждане на API приложението

Създаваме папка api_project и в нея файл index.php:

<?php
header("Content-Type:application/json");
if (!empty($_GET['month'])) {
    $numberOfMonth = $_GET['month'];
    $monthData = get_month($numberOfMonth);
    if (empty($monthData)) {
        response(true, "Out of Range", null);
    } else {
        response(false, "", $monthData);
    }
} else {
    response(400, "Invalid Request", null);
}

function response($status, $status_message, $data) {
    header("HTTP/1.1 " . $status);
    $response['error'] = $status;
    $response['message'] = $status_message;
    $response['data'] = $data;
    echo json_encode($response);
}

function get_month($numberOfMonth) {
    $monthlyStats = [
        "january" => ['Google Analytics' => 50, 'Positive Guys' => 500],
        "february" => ['Google Analytics' => 150, 'Positive Guys' => 5000],
    ];
    return $monthlyStats[$numberOfMonth] ?? null;
}
?>

След това създаваме .htaccess файл в същата папка:

RewriteEngine On
RewriteRule ^([a-zA-Z_-]*)\.(html|json|xml)?$ index.php?month=$1 [NC,L]

Сега API-то вече е достъпно на адрес:

http://localhost/api_project/?month=february

2. Изграждане на клиентската част

Създаваме папка api_client и в нея файл index.php със следното съдържание:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Monthly Website Statistics</title>
  </head>
  <body>
    <h2>Monthly Website Statistics</h2>
    <form method="POST">
      <select name="month">
        <option>Select Month</option>
        <option value="january">January</option>
        <option value="february">February</option>
      </select>
      <button type="submit" name="submit">Submit</button>
    </form>

    <h3>
    <?php
      if (isset($_POST['submit'])) {
          $name = $_POST['month'];
          $url = "http://localhost/api_project/?month=" . $name;
          $client = curl_init($url);
          curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
          $response = curl_exec($client);
          $result = json_decode($response);
          if (!empty($result)) {
              foreach ($result->data as $key => $value) {
                  echo $key . ': ' . $value . '<br>';
              }
          }
      }
    ?>
    </h3>
  </body>
</html>

Можем да тестваме приложението директно в браузъра на:

http://localhost/api_client/

или през Postman, като направим заявка към:

localhost/api_project?month=february

Заключение

Този пример не използва най-добрите практики, но дава ясна представа за структурата и логиката на REST API с PHP.
Той е чудесна отправна точка за изграждане на по-мащабни системи, включително бъдещия проект LibraryMS.