Лучшие статьи и кейсы стартапов
Включить уведомления
Дадим сигнал, когда появится
что-то суперстоящее.
Спасибо, не надо
Вопросы Проекты Вакансии
GML +55
Сервис организации ваших интернет линков
Рекомендуем
Продвинуть свой проект
Лучшие проекты за неделю
28
Эбиа

Эбиа

www.ebia.ru

15
Amarket

Amarket

amarket.io

13
likearea

likearea

smm.li

12
RockinRobin

RockinRobin

www.rockinrobin.co

10
Битрикс24

Битрикс24

www.bitrix24.ru

10
KEPLER LEADS

KEPLER LEADS

keplerleads.com

10
Cookiezz

Cookiezz

cookiezz.com.ua

10
Megagroup

Megagroup

Создаем сайты и помогаем им зарабатывать

9
Tados

Tados

tados.ru

Показать следующие
Рейтинг проектов
Подписывайтесь на Спарк в Facebook

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

4 735 7 В избранное Сохранено
Авторизуйтесь
Вход с паролем
Продолжаем разбирать устройство 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
Оформление сообществ ВКонтакте за бесплатно! Новый день — новый дизайн.
andrew.nefedov
Полезно
Ответить
Perecel
автоматический отбор целевой аудитории (реклама в соц сетях)
Дмитрий Кубитский
да точно, надо написать свой вебсервер внутри вебсервера. Инновации к модернизации.
Ответить
GML
Сервис организации ваших интернет линков
GM2mars
Напишите свое решение, я с радостью почитаю. Ну или скиньте ссылку на ваш личный проект, может что-то новое я для себя почерпну. Спасибо за ваш емкий комментарий.
Ответить
Perecel
автоматический отбор целевой аудитории (реклама в соц сетях)
Дмитрий Кубитский
я уже говорил, просто попробуйте любой толковый фреймворк. Джанго, рейлс, экспресс, плей, уверен после этого вы не вернетесь к прежнему стилю костылирования.
Ответить
GML
Сервис организации ваших интернет линков
GM2mars
Уметь работать с фреймворком это одно, а знать как он работает — это другое.
Ответить
MpaK
Ну вы просто плохой пример тут подаете, apache + php костыли….
Ответить
GML
Сервис организации ваших интернет линков
GM2mars
Пример на самых популярных веб-технологиях. А что php и Apache это плохо, решает каждый для себя сам.
Ответить
Выбрать файл
Читайте далее
Загружаем…
Блог проекта
Расскажите историю о создании или развитии проекта, поиске команды, проблемах и решениях
Написать
Личный блог
Продвигайте свои услуги или личный бренд через интересные кейсы и статьи
Написать