Пишемо свій API для сайту з використанням Apache, PHP та MySQL

З чого все почалося

І тут мені захотілося написати свій API для взаємодії з серверною стороною — переважно для практичного інтересу.

Вхідні дані

У своєму розпорядженні я мав: Сервер - Apache, PHP 5.0, MySQL 5.0 Клієнт - Android, iOS пристрої, будь-який браузер

Я вирішив, що для запитів до сервера та відповідей від нього використовуватиму JSON формат даних — за його простоту та нативну підтримку в PHP та Android. Тут мене засмутила iOS — вона не має нативної підтримки JSON (тут довелося використовувати сторонню розробку).

Також було прийнято рішення, що запити можна буде відсилати як через GET так і через запити POST (тут допоміг $_REQUEST в PHP). Таке рішення дозволило проводити тестування API через GET запити у будь-якому доступному браузері.

Шлях до папки api - каталог на який потрібно робити запити, в корені якого лежить файл index.php - він і відповідає за виклик функцій та обробку помилок Назва api - для зручності я вирішив розділити API групи - користувач, база даних, конент і т.д. У такому разі кожен api отримав свою назву Назва методу — ім'я методу, який потрібно викликати у вказаному api JSON — рядкове подання JSON об'єкта для параметрів методу

Скелет API

Скелет API на серверній стороні складається з декількох базових класів: index.php — індексний файл каталогу в Apache на нього припадають усі виклики API, він здійснює парсинг параметрів та виклик API методів MySQLiWorker — клас-одиначка для роботи з базою MySQL через MySQLi apiBaseCalss.php - батьківський клас для всіх API в системі - кожен API повинен бути успадкований від цього класу для коректної роботи apiEngine.php - основний клас системи - здійснює розбір переданих параметрів(після їх попереднього парсингу в index.php) підключення потрібного класу api (через require_once метод), виклик у ньому потрібного методу та повернення результату в JSON форматі apiConstants.php - клас з константами для api викликів та передачі помилок apitest.php — тестовий api для тестування нових методів перед їх включенням до продакшн-версії

Весь механізм має такий вигляд: Ми робимо запит на сервер — наприклад www.example.com/api/?apitest.helloWorld=<> На серверній стороні файл index.php - робить парсинг переданих параметрів. Index.php бере завжди тільки перший елемент зі списку переданих параметрів $_REQUEST — це означає, що конструкція виду www.example.com/api/?apitest.helloWorld=<>&apitest.helloWorld2 — здійснить виклик лише методу helloWorld в apitest . Виклику ж методу helloWorld2 не відбудеться

Тепер детальніше про кожного

Як вже говорив раніше це вхідний індексний файл для Apache, а значить всі виклики виду www.example.com/api/ прийматиме він.

Насамперед встановлюємо тип контенту - text/html (потім можна змінити в самих методах) і кодування - UTF-8. Далі перевіряємо, що в нас щось запитують. Якщо ні, то виводимо JSON з помилкою. Якщо є параметри запиту, підключаємо файл движка API - apiEngine.php і створюємо клас движка з переданими параметрами і робимо виклик api методу. Виходимо з циклу, тому що ми вирішили, що будемо обробляти тільки один виклик.

apiEngine.php

Другим за важливістю є клас apiEngine - він є двигуном для виклику api та їх методів.

apiConstants.php

Цей клас використовується тільки для зберігання констант.

MySQLiWorker.php

Клас-одиначка для роботи з базою. В іншому це звичайний одинак ​​- такихприкладів у мережі дуже багато.

apiBaseClass.php

Ну ось ми підійшли до одного з найважливіших класів системи – базовий клас для всіх API у системі.

Як видно даний клас містить у собі кілька «утилітних» методів, таких як: конструктор в якому здійснюється з'єднання з базою, якщо поточне API збирається працювати з базою; деструктор - стежить за звільненням ресурсів - розрив встановленого з'єднання з базою createDefaultJson - створює дефолтний JSON для відповіді методу fillJSON - якщо мається на увазі, що запит поверне лише один запис, то даний метод заповнить JSON для відповіді даними з першої рядки відповіді від БД

Створимо свій API

Ось, власне, і весь кістяк цього API. Тепер розглянемо як це все використовувати на прикладі створення першого API під назвою apitest. І напишемо в ньому пару простих функцій: одну без параметрів одну з параметрами і їх же вона нам і поверне, щоб було видно, що вона їх прочитала одну яка поверне нам бінарні дані

І так створюємо клас apitest.php наступного змісту

І так у нас три методи

Результатом виконання буде ось така сторінка (у браузері)

використанням

helloAPIWithParams

Цей метод приймає параметри. Обов'язковим є TestParamOne, для нього зробимо перевірку. Його його не передати, то буде видано JSON з помилкою

mysql

helloAPIRresponseBinary

І останній метод helloAPIResponseBinary - поверне бінарні дані - картинку хабра про неіснуючу сторінку (як приклад)

Як видно, тут є заміна заголовка для виведення графічного контенту. Результат буде такий

apache

Є над чим працювати