Главное Авторские колонки Вакансии Образование
Выбор редакции:
14 718 7 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Взгляд на REST архитектуру со стороны сервера (PHP версия)

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

Вступление

В предыдущей статье я немного рассказал о REST архитектуре, её основных принципах, особенностях со стороны клиента и взгляде со стороны пользователя. Не смотря на то, что данный подход не новый, особой популярностью он стал пользоваться относительно недавно (не путать с ЧПУ (человеко-понятными урлами)). Как уже говорилось ранее, REST это не какая-то конкретная реализация, а совокупность некоторых принципов, которые учитываются при разработке.

Основная идея REST - это работа с ресурсами приложения как с отдельно взятыми объектами.

Принципы при разработке:

  1. URL адреса как уникальные пути к объектам (site.ru/caterogy/1)
  2. Действия над объектами определяет тип запроса (GET, POST, PUT, DELETE)
  3. Использование кодов ответов от сервера (список кодов с википедии)

Из [gml.link/users/1] в [index.php?source=users&id=1]

Для преобразования запросов, нам понадобится модуль RewriteEngine сервера Apache. Включение и конфигурация происходит в файле .htaccess (не знаю тонкостей настройки, но ниже написанные выражения исправно работают)

  1. RewriteEngine On
  2. RewriteBase /gml
  3. RewriteRule ^index.php$ / [QSA,L]
  4. RewriteRule ^([a-z]*)$ index.php?source=$1 [QSA,L]
  5. RewriteRule ^([a-z]*)/([0-9]*)$ index.php?source=$1&id=$2 [QSA,L]

Данная конфигурация включает RewriteEngine и задает некоторые правила для замены. Напомню, что это актуально только для Apache серверов. На NGINX серверах другая магия (ngx_http_rewrite_module).

Взгляд изнутри

Вернемся к нашей архитектуре и рассмотрим как подготовить бекэнд. Для начала вспомним идеологию REST: "URL адреса как пути к объектам (site.ru/caterogy/1)" и "Действия над объектами определяет тип запроса (GET, POST, PUT, DELETE)". Из этого следует что нам нужно знать адрес запроса, тип запроса и соответственно данные, которые передает запрос. Для получения этой информации, я написал небольшой класс роутинга: (я не мастер нейминга переменных, поэтому не судите строго)

Напомню что запрос приходит в виде index.php?source=users&id=1

  1. class RequestInfo {
  2. public $method;
  3. public $query=[];
  4. public $request=[];
  5. public $ajax;
  6. public function __construct($server) {
  7. //получаем метод запроса (PUT, GET, POST, DELETE)
  8. $this->method=$server['REQUEST_METHOD'];
  9. //если запрос ajax то true, иначе false
  10. $this->ajax=($server['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') ? true : false;
  11. //вытаскиваем данные из запроса
  12. $this->request=$this->get_request();
  13. //парсим стороку запроса (то что идет после index.php?) в ассоциативный массив
  14. parse_str($server['QUERY_STRING'], $this->query);
  15. }
  16. //вытаскиваем данные из запроса
  17. private function get_request() {
  18. $request=false;
  19. //небольшой хинт, если запрос PUT то данные получаем из php://input
  20. if ($this->method=='PUT') parse_str(file_get_contents('php://input'), $request);
  21. else if ($this->method=='POST') $request=$_POST;
  22. return $request;
  23. }
  24. }
  25. //создаем наш объект и передаем ему переменную $_SERVER в которой содержится вся информация о запросе
  26. $RInfo=new RequestInfo($_SERVER);
  27. //передаем обработанные данные запроса нашему контроллеру
  28. $app=new App($RInfo);

b_547e0f6d9b3bd.jpg

--------------------------------------------------

Пример запроса регистрации нового пользователя:

POST gml.link/users (gml.link/index.php?source=users), {email: 'alex@mail.ru', username: 'George', password: 'c69572f946edd2560d6c97eee2172d90'}

В итоге получаем следующий объект:

  • object(RequestInfo)
    • 'method' =>'POST'
    • 'query' =>
      • 'source' =>'users'
      • 'id' =>''
    • 'request' =>
      • 'email' =>'alex@mail.ru'
      • 'username' =>'George'
      • 'password' =>'c69572f946edd2560d6c97eee2172d90'
    • 'ajax' =>true

(выглядит код конечно странно, но тут нет нормального форматирования)

Имея всю необходимую информацию, мы передаем полученные данные из запроса в главный контроллер нашего приложения, который уже определяет дальнейшие действия и вызывает нужный обработчик. Так же не забываем для ответа выставлять правильные заголовки с кодами (ссылка на коды вначале статьи), а не только OK 200.

Заключение

Вот таким нехитрым способом устроена архитектура REST на сервере. Конечно реализации могут отличаться, но суть одна: нужно знать тип запроса, и адрес запроса (тип ресурса и его идентификатор, в случае необходимости).

В следующей статье поговорим о "сборниках" на проекте Get My Link, какие виды и зачем они вообще нужны. Так же если успею, то будет первое публичное видео работы нового интерфейса.

+3
В избр. Сохранено
Авторизуйтесь
Вход с паролем
Комментарии
365 Days of SMD
Оформление сообществ ВКонтакте за бесплатно! Новый день — новый дизайн.
ADZY
Ассистент для ведения рекламных компаний
Дмитрий Кубитский
да точно, надо написать свой вебсервер внутри вебсервера. Инновации к модернизации.
Ответить
GML
Сервис организации ваших интернет линков
GM2mars 10790
Напишите свое решение, я с радостью почитаю. Ну или скиньте ссылку на ваш личный проект, может что-то новое я для себя почерпну. Спасибо за ваш емкий комментарий.
Ответить
ADZY
Ассистент для ведения рекламных компаний
Дмитрий Кубитский
я уже говорил, просто попробуйте любой толковый фреймворк. Джанго, рейлс, экспресс, плей, уверен после этого вы не вернетесь к прежнему стилю костылирования.
Ответить
GML
Сервис организации ваших интернет линков
GM2mars 10790
Уметь работать с фреймворком это одно, а знать как он работает — это другое.
Ответить
MpaK 12595
Ну вы просто плохой пример тут подаете, apache + php костыли….
Ответить
GML
Сервис организации ваших интернет линков
GM2mars 10790
Пример на самых популярных веб-технологиях. А что php и Apache это плохо, решает каждый для себя сам.
Ответить
Выбрать файл
Блог проекта
Расскажите историю о создании или развитии проекта, поиске команды, проблемах и решениях
Написать
Личный блог
Продвигайте свои услуги или личный бренд через интересные кейсы и статьи
Написать

Spark использует cookie-файлы. С их помощью мы улучшаем работу нашего сайта и ваше взаимодействие с ним.