REST(Representational State Transfer) является архитектурным стилем. Веб-службы, которые придерживаются принципов REST называются RESTful веб-службами. URI в них служат для доступа к ресурсам. В RESTful-терминологии данные и функции называются ресурсами. Поэтому в конечном итоге данные и функции - это то, к чему мы будем обращаться через службы.
В этом руководстве по RESTful веб-службам автор расскажет о том, как создать такой веб-сервис. Весь код будет написан на «чистом» PHP без применения какого-либо фреймворка. В большинстве случаев автор статьи предпочитает писать свой код без использования фреймворков, в чем есть свои преимущества.
В Интернете можно найти учебные пособия по веб-сервисам, но в большинстве случаев они оказываются неполными или содержат ошибки. Процесс тестирования упомянутых веб-сервисов с помощью REST-клиента часто заканчивался неудачей.
ДЕМО
Целями разработки RESTful веб-службы, создание которой описано в этой статье, являются:
Создание RESTful веб-сервиса;
Написание его на чистом PHP без использования фреймворков;
Обеспечение соответствия шаблонов URI принципам REST;
RESTful веб-служба должна отвечать на запросы в таких форматах, как JSON и XML;
Возвращение разных кодов состояния HTTP при разных сценариях работы;
Демонстрация использования заголовков запроса;
Обеспечение возможности тестирования веб-службы с помощью REST-клиента;
Пример RESTful веб-сервиса
Приведем пример класса домена, используемого для демонстрации RESTful веб-служб.
PHP
<?php
/*
Класс домена, используемого для демонстрации RESTful веб-служб
*/
Class Mobile {
private $mobiles = array(
1 => 'Apple iPhone 6S',
2 => 'Samsung Galaxy S6',
3 => 'Apple iPhone 6S Plus',
4 => 'LG G4',
5 => 'Samsung Galaxy S6 edge',
6 => 'OnePlus 2');
/*
здесь вы должны подключить Data Access Object (DAO)
*/
public function getAllMobile(){
return $this->mobiles;
}
public function getMobile($id){
$mobile = array($id => ($this->mobiles[$id]) ? $this->mobiles[$id] : $this->mobiles[1]);
return $mobile;
}
}
?>
Преобразование URI в RESTful веб-службах
RESTful веб-службы должны иметь чистые унифицированные URI. Для сопоставления URL-адресов между запросом и реальным файлом используется файл .htaccess. В нашем примере мы используем 2 URI.
Чтобы получить список мобильных устройств: http://localhost/restexample/mobile/list/
Чтобы получить детальную информацию о конкретном устройстве URI должен содержать его ID. Например, “2” в следующем примере – как раз ID устройства: http://localhost/restexample/mobile/list/2/
Ниже приведен файл .htaccess, который получает URL-адрес запроса и перенаправляет запрос в PHP- файл.
.htaccess
# активируем преобразование URL
Options +FollowSymlinks
RewriteEngine on
# прописываем соответствие URL и файла, который будет его обрабатывать
RewriteRule ^mobile/list/$ RestController.php?view=all [nc,qsa]
RewriteRule ^mobile/list/([0-9]+)/$ RestController.php?view=single&id=$1 [nc,qsa]
Контроллер RESTful веб-службы
В файле .htaccess.htaccess мы перенаправили все запросы на файл RestController.php с параметром view. Этот параметр идентифицирует действие, которое должен выполнить скрипт. Файл RestController.php содержит код, который описывает действия, передаваемые в параметре URL.
PHP
<?php
require_once("MobileRestHandler.php");
$view = "";
if(isset($_GET["view"]))
$view = $_GET["view"];
/*
соответствие URL и методов RESTful веб-службы
*/
switch($view){
case "all":
// обрабатывает REST Url /mobile/list/
$mobileRestHandler = new MobileRestHandler();
$mobileRestHandler->getAllMobiles();
break;
case "single":
// обрабатывает REST Url /mobile/show/<id>/
$mobileRestHandler = new MobileRestHandler();
$mobileRestHandler->getMobile($_GET["id"]);
break;
case "" :
//404 – не найден;
break;
}
?>
Простой базовый класс RESTful
Следующий класс имеет несколько методов, которые могут быть широко использованы во всех обработчиках веб-сервиса REStful. Один метод используется для построения ответа, а другие методы - содержат обработчики HTTP-кодов состояния и возвращают соответствующие им сообщения. Методы, содержащиеся в классе являются общими для всех веб-служб, поэтому этот класс можно считать базовым для всех классов REStful веб-сервиса. Сохраним этот код в файле SimpleRest.php
Это класс, который обрабатывает REST запрос. Вы должны обратить внимание на несколько вещей. Во-первых, как обработчик REST решает, какой формат ответа следует отправить назад. Это определяется на основе параметра заголовка запроса “Accept”. По протоколу при отправке запроса должен быть установлен и отправлен заголовок “Accept”. Его значения могут быть следующими: “application/json”, “application/xml” или “text/html”. Во-вторых, вы должны использовать коды состояния. При успешном результате работы скрипта, вместе с ответом от сервера вы должны отправить статус с кодом 200. Существуют разные коды состояния и их следует использовать аналогично упомянутому коду 200 в соответствии с ситуацией.
Чтобы протестировать RESTful веб-сервис, вам нужно написать скрипт REST-клиента и воспользоваться им. Альтернативным решением может быть использование уже готового REST-клиента. В сети существует множество автономных REST –клиентов. Автор статьи обычно использует в качестве REST-клиента плагин для браузера Google Chrome. Расширение для Google Chrome под названием “Advance Rest Client” является достойным REST-клиентом. Вам необходимо добавить расширение и использовать его, как показано ниже. Ниже приведены скриншоты тестирования вышеупомянутого RESTful веб-сервиса.
Скачать архив с кодом из статьи
Демо-страница
В следующих уроках автор подробнее расскажет о RESTful веб-сервисах, таких как проверка REST, REST CRUD и многое другое. Эта руководство было опубликовано 18 октября 2015 года.