|
Навигация
|
Главная » Xml Удобное встраивание RESTful API в проектИсточник: habrahabr volovikov Ни для кого не секрет, что наличие API идет на пользу любому проекту. Но часто, при ошибке в архитектуре системы или же добавлении его к готовому проекту, накладные расходы на поддержку и тестирование отнимают достаточно много времени. Я хочу представить сообществу нашу реализацию RESTful архитектуры, без дублирования кода и с минимальными изменениями существующей бизнес-логики. Или Как добавить в проект API за пять минут?Для реализации данного подхода, нами было написано расширение для Yii Framework, но сам подход может быть использован в любой MVC архитектуре. Давайте представим, что у нас есть контроллер RestUserController с методами:
Также у нас есть модель RestUser , которая представляет из себя ActvieRecord таблицы rest_users . Рассмотрим метод actionCreate , задача которого, создание нового пользователя RestUser ,
Тут все понятно - еcли просто запрашиваем /restUser/create - отображается html-форма добавления нового пользователя, если отправляем POST-запрос на этот адрес, то отрабатывает логика валидации и добавления, затем либо перенаправляет нас на просмотр пользователя, либо отображает html-форму c ошибками. Теперь, допустим, мы хотим сделать мобильное приложение которое будет иметь возможность из своего интерфейса создавать новых пользователей. Правильный путь - создать серверное API. Т.к. мы говорим о RESTful стиле, то взаимодействие серверного и мобильного приложения, на примере запроса через curl , будет выглядеть примерно так: Запрос
Ответ
Здесь происходит авторизация через HTTP basic auth логина demo с паролем demo, и передаются обязательные параметры email и password, в ответ, если все правильно, получаем JSON-объект нового пользователя. Вся идея нашего подхода заключается в том, чтобы добавить action-ам возможность правильно отвечать на API-запросы, только изменением методов redirect и render , а также добавлением правил рендеринга моделей.Конечно, необходима также реализовать перехват ошибок и эксепшенов приложения, а также ошибок при создании самой модели, для корректного ответа API-клиенту, но для этого не потребуется изменения самой бизнес-логики action-ов контроллера. В нашем расширении мы реализовали предложенный подход перехватом событий onException и onError , а также добавлением дополнительной функциональности к базовой модели CActiveRecord и контроллеруCController при помощи поведений.В результате, код, возвращающий нужный ответ, при запросе через API, и html-форму при обычном запросе, будет выглядеть так:
Важное отличие нового кода от предидущего - это передача в метод redirect в качестве параметра id не $model->id , а объекта $model , для того чтобы созданный объект был возвращен клиенту. Также, третьим параметром добавлен код ответа 201 - это необходимо для соответсвия стандарту, т.к. вместе с ответом передается заголовок Location , содержащий адрес созданного объекта. HTTP-коды 3xx в ответе не позволяются.Ещё одним отличием является добавленный четвертый параметр в методе render , в нем содержится перечисление полей из массива $data , передаваемых в ответе клиенту. Если праметр null то возвращается весь массив $data . Теперь при неверном запросе, данные, которые в обычном режиме отобразились бы в html-форме, вернутся в следующем формате: Запрос
Ответ
Отлично, теперь нужно как-то защитить чувствительные данные модели - у нашего RestUser это полеpassword . Для этого определим в правиле список возвращаемых полей.Правило отображения для модели будет находится в методе rules
Это правило затем будет учтено в методе getRenderAttributes , добавленном в модель, который будет возвращать массивом все доступные для отображения атрибуты, рекурсивно проходя по связям объекта, если они указаны в правиле. В заключении хочу рассказать немного о возможностях аутентификации и отображения.Ядро расширения построено вокруг компонента (сервиса) \rest\Service , который занимается основной обработкой событий и правильным отображением данных. У данного сервиса есть две группы адаптеровauth и renderer . В auth находятся адаптеры, осуществляющие аутентификацию - по умолчанию доступен адаптер HTTP basic auth .В renderer находятся адаптеры, осуществляющие отображение данных - по умолчанию доступны два адаптера JSON и XML . РасширениеКоротко о настройкахПример конфигурационного файла main.php
Добавим в контроллер поведение и переопределим методы
Все эти методы можно и нужно добавить в родительский контроллер, чтобы не имплементировать в каждом контроллере по отдельности. Добавим поведение в модель для того, чтобы заработали правила рендеринга СсылкиGitHub репозиторий - github.com/paysio/yii-rest-apiОписание установки и настройки - github.com/paysio/yii-rest-api#installation Весь код, приведенный выше - github.com/paysio/yii-rest-api/tree/master/demo BusinessObjects XI Release 2 - средство обеспечения точной информации. IBM Worklight. ИСПОЛЬЗОВАНИЕ КОМПЬЮТЕРНЫХ ОНТОЛОГИЙ В ПОСТРОЕНИИ ОТКРЫТЫХ СИСТЕМ ОБРАЗОВАНИЯ ВЗРОСЛЫХ. Borland JBuilder 2006. Кибер-преступники не спят!. Главная » Xml |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |