Api demo in php

Пример как создать простое REST API на PHP

В этом руководстве я научу вас, как создать простой REST API с помощью PHP и MySQL.

REST стал стандартом де-факто, когда дело доходит до предоставления данных через API и создания веб-сервисов. На самом деле, большинство веб-приложений в наши дни получают доступ к данным и предоставляют их через REST API. Учитывая популярность интерфейсных фреймворков, которые могут без особых усилий использовать REST API, для вас всегда будет плюсом, если ваше веб-приложение предоставляет REST API.

В этой статье мы создадим простое демонстрационное приложение, которое позволяет вам извлекать список пользователей из базы данных MySQL через REST API.

Скелет приложения

В этом разделе мы кратко рассмотрим структуру проекта.

├── Controller │ └── Api │ ├── BaseController.php │ └── UserController.php ├── inc │ ├── bootstrap.php │ └── config.php ├── index.php └── Model ├── Database.php 

Попробуем разобраться в структуре проекта.

  • index.php: точка входа нашего приложения. Он будет действовать как фронт-контроллер нашего приложения.
  • inc/config.php: содержит информацию о конфигурации нашего приложения. В основном, он будет содержать учетные данные базы данных.
  • inc/bootstrap.php: используется для начальной загрузки нашего приложения путем включения необходимых файлов.
  • Model/Database.php: уровень доступа к базе данных, который будет использоваться для взаимодействия с базовой базой данных MySQL.
  • Model/UserModel.php: файл модели пользователя, который реализует необходимые методы для взаимодействия с таблицей пользователей в базе данных MySQL.
  • Controller/Api/BaseController.php: базовый файл контроллера, который содержит общие служебные методы.
  • Controller/Api/UserController.php: файл контроллера модели User, который содержит необходимый код приложения для обработки вызовов REST API.
Читайте также:  Ubuntu java web start

База данных и классы модели

В этом разделе мы создадим базу данных и таблицу пользователей. Мы также создадим необходимые классы моделей, которые будут использоваться для извлечения пользователей из базы данных.

Таблица пользователей

Cоздайте базу данных rest_api_demo, выполнив следующую команду в своем терминале MySQL. Вы также можете использовать такой инструмент, как phpMyAdmin.

CREATE DATABASE rest_api_demo; 

После создания базы данных rest_api_demo создайте таблицу пользователей, выполнив следующие команды.

USE rest_api_demo; CREATE TABLE `users` ( `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `user_email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `user_status` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

Это должно создать таблицу пользователей в базе данных rest_api_demo. Вы также захотите заполнить эту таблицу несколькими фиктивными записями для целей тестирования. Вставьте несколько записей, и все готово!

Модель User

В этом разделе мы создадим необходимые классы модели.

Создайте файл Model/Database.php со следующим содержимым.

connection = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE_NAME); if ( mysqli_connect_errno()) < throw new Exception("Could not connect to database."); >> catch (Exception $e) < throw new Exception($e->getMessage()); > > public function select($query = "" , $params = []) < try < $stmt = $this->executeStatement( $query , $params ); $result = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); $stmt->close(); return $result; > catch(Exception $e) < throw New Exception( $e->getMessage() ); > return false; > private function executeStatement($query = "" , $params = []) < try < $stmt = $this->connection->prepare( $query ); if($stmt === false) < throw New Exception("Unable to do prepared statement: " . $query); >if( $params ) < $stmt->bind_param($params[0], $params[1]); > $stmt->execute(); return $stmt; > catch(Exception $e) < throw New Exception( $e->getMessage() ); > > > 

Database — это класс уровня доступа к базе данных, который позволяет нам установить соединение с базой данных MySQL. Помимо настройки подключения, он содержит общие методы, такие как select и executeStatement, которые позволяют нам выбирать записи из базы данных. Мы не будем использовать класс Database напрямую; вместо этого мы создадим соответствующие классы моделей, которые расширяют класс Database для доступа к базовой базе данных MySQL.

Далее создадим класс Model/UserModel.php со следующим содержимым.

select("SELECT * FROM users ORDER BY user_id ASC LIMIT ?", ["i", $limit]); > > 

Важно отметить, что класс UserModel расширяет класс Database.

Кроме того, он содержит метод getUsers, который позволяет нам выбирать пользователей из базы данных MySQL. Обязательно передать параметр $limit, который гарантирует, что он не будет выбирать все записи сразу.

Конечно, вы можете определить больше методов в классе UserModel в соответствии с вашими требованиями. В контексте этого урока мы будем упрощать.

Итак, теперь у нас есть база данных и классы моделей. В следующем разделе мы увидим, как создавать контроллеры и остальные файлы в нашем приложении.

Уровень приложения

В этом разделе мы создадим остальные файлы, необходимые для работы нашего приложения REST API.

Папка inc

Для начала создадим необходимые файлы конфигурации.

Создайте файл inc/config.php со следующим содержимым.

Обязательно обновите все значения фактическими значениями доступа к вашей БД в MySQL.

Затем создайте файл inc/bootstrap.php со следующим содержимым.

Во-первых, мы инициализировали константу PROJECT_ROOT_PATH корневым каталогом нашего приложения. Таким образом, мы могли бы использовать константу PROJECT_ROOT_PATH для подготовки абсолютных путей в нашем приложении. Затем мы включили файл config.php, в котором содержится информация о подключении к базе данных. Наконец, мы включили файлы контроллера и модели.

Вот и все, что нужно для настройки общих файлов в нашем приложении.

Папка Controller

В этом разделе мы реализуем контроллеры, которые содержат большую часть логики нашего приложения.

Файл BaseController.php

Создайте файл Controller/Api/BaseController.php со следующим содержимым. Класс BaseController содержит служебные методы, используемые другими контроллерами.

sendOutput('', array('HTTP/1.1 404 Not Found')); > /** * Получить части URI. * * @return array */ protected function getUriSegments() < $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $uri = explode( '/', $uri ); return $uri; >/** * Получить querystring параметры. * * @return array */ protected function getQueryStringParams() < return parse_str($_SERVER['QUERY_STRING'], $query); >/** * Отправить API вывод. * * @param mixed $data * @param string $httpHeader */ protected function sendOutput($data, $httpHeaders=array()) < header_remove('Set-Cookie'); if (is_array($httpHeaders) && count($httpHeaders)) < foreach ($httpHeaders as $httpHeader) < header($httpHeader); >> echo $data; > > 

Давайте быстро пройдемся по всем методам класса BaseController.

Метод __call() — это магический метод, и он вызывается, когда вы пытаетесь вызвать несуществующий метод. Мы используем эту возможность, чтобы выдать ошибку HTTP/1.1 404 Not Found, когда кто-то пытается вызвать метод, который мы не реализовали. Если это звучит для вас запутанно, не волнуйтесь — это будет иметь больше смысла, когда мы будем тестировать наше приложение в следующем разделе.

Далее идет метод getUriSegments(), который возвращает массив сегментов URI. Это полезно, когда мы пытаемся проверить конечную точку REST, вызываемую пользователем.

Далее следует метод getQueryStringParams(), который возвращает массив строковых переменных запроса, которые передаются вместе с входящим запросом.

Наконец, есть метод sendOutput(), который используется для отправки ответа API. Мы будем вызывать этот метод, когда захотим отправить ответ API пользователю.

Файл UserController.php

Затем создайте файл Controller/Api/UserController.php со следующим содержимым.

getQueryStringParams(); if (strtoupper($requestMethod) == 'GET') < try < $userModel = new UserModel(); $intLimit = 10; if (isset($arrQueryStringParams['limit']) && $arrQueryStringParams['limit']) < $intLimit = $arrQueryStringParams['limit']; >$arrUsers = $userModel->getUsers($intLimit); $responseData = json_encode($arrUsers); > catch (Error $e) < $strErrorDesc = $e->getMessage().'Something went wrong! Please contact support.'; $strErrorHeader = 'HTTP/1.1 500 Internal Server Error'; > > else < $strErrorDesc = 'Method not supported'; $strErrorHeader = 'HTTP/1.1 422 Unprocessable Entity'; >// вывод if (!$strErrorDesc) < $this->sendOutput( $responseData, array('Content-Type: application/json', 'HTTP/1.1 200 OK') ); > else < $this->sendOutput(json_encode(array('error' => $strErrorDesc)), array('Content-Type: application/json', $strErrorHeader) ); > > > 

Важно отметить, что класс UserController расширяет класс BaseController. В идеале этот класс должен содержать методы действий, связанные с методами REST API, определенными для пользовательского объекта. В нашем случае, например, метод REST API /user/list соответствует методу listAction. Таким образом, вы также можете определить другие методы для других методов REST.

Метод listAction используется для получения списка пользователей из базы данных MySQL. Он содержит всю логику метода /user/list REST API.

В методе listAction мы в первую очередь инициализировали пару переменных, таких как $requestMethod и $arrQueryStringParams. Затем мы проверяем, вызвал ли пользователь метод API /user/list списка с помощью метода GET; в противном случае мы не будем обрабатывать дальше. Наконец, мы создаем объект UserModel и вызываем метод getUsers для получения списка пользователей из базы данных. Мы также использовали функцию json_encode для преобразования массива в объект JSON перед его отправкой пользователю.

Наконец, мы использовали метод sendOutput для отправки ответа JSON пользователю. Важно отметить, что значение заголовка типа содержимого ответа установлено как application/json, поскольку мы отправляем ответ JSON.

Точно так же вы можете определить другие методы REST API.

Точка входа. Файл index.php

Файл index.php является точкой входа нашего приложения. Посмотрим, как это выглядит.

 require PROJECT_ROOT_PATH . "/Controller/Api/UserController.php"; $objFeedController = new UserController(); $strMethodName = $uri[3] . 'Action'; $objFeedController->(); ?> 

Во-первых, мы использовали функции parse_url и explode для инициализации сегментов URI в переменной массива $uri. Далее мы проверяем сегменты URI. Наконец, мы инициализировали контроллер UserController и вызвали соответствующий метод действия.

Таким образом, мы создали все необходимые файлы в нашем демонстрационном REST-приложении. В следующем разделе мы увидим, как вызывать его с точки зрения конечного пользователя.

Как вызвать наш REST API?

Как вызвать наше приложение? В нашем приложении мы создали конечную точку REST для получения списка пользователей.

Давайте посмотрим, как выглядит URL-адрес нашей конечной точки:

// https://localhost/index.php//?limit= http://localhost/index.php/user/list?limit=20 

Если вы помните файл index.php, мы проверили, установлено ли значение переменной $uri[2] для пользователя. Кроме того, значение переменной $uri[3] будет действовать как имя метода. В приведенном выше случае переменная $uri[3] имеет значение list. Таким образом, в конечном итоге вызовет метод listAction класса UserController.

В результате вызова, мы получим приблизительно такой ответ, со списком пользователей хранящихся в нашей БД.

Как видите, он возвращает список пользователей в виде объекта JSON. Кроме того, если есть какая-либо ошибка приложения, она будет возвращена как объект JSON в качестве информации для отладки.

Заключение

В демонстрационных целях мы создали демонстрационное приложение, которое позволяет получать список пользователей из базы данных MySQL через REST API. Такой простой код подходит для небольших API приложений, а так же для создания микросервисов.

Источник

Оцените статью