- PVSM.RU - https://www.pvsm.ru -
В InterSystems Caché появилась поддержка REST. О том, что такое REST на Хабре уже писали [1] и не раз [2]. Если кратко — это паттерн построения RESTful web API, и ему присущи следующие свойства:
Типичное REST-приложение выглядит примерно так: есть корневой URL (http://example.com/resources/) и дочерние URL (http://example.com/resources/item17), к которым мы обращаемся по HTTP, с помощью с методов GET, PUT, POST, DELETE. Ниже таблица методов и действий с одним элементом и коллекциями:
Метод | Запросы к коллекции элементов example.com/resources [3] |
Запросы к одному элементу example.com/resources/itemID [4] |
GET | Получить список URI элементов коллекции, возможно доп. информацию | Получить всю информацию об элементе |
PUT | Заменить существующую коллекцию на новую | Заменить существующий элемент на новый |
POST | Создать новый элемент коллекции | Как правило не используется |
DELETE | Удалить всю коллекцию | Удалить элемент коллекции |
В СУБД Caché поддержка REST появляется начиная с версии 2014.1 — эта версия пока доступна в виде филд-тест версии [5] для партнеров и вузов InterSystems Campus. Чтобы создать REST приложение, нужно в настройках веб-приложения Caché определить класс-брокер, в котором указываются возможные расширения базового URL и соответствующие действия приложения при запросе этих расширений.
Класс-брокер создается как наследник класса %CSP.REST. Далее в нем прописывается карта путей URL приложения (например example.com/resources/ID [6] — GET ), причем каждому URL в соответствие ставится метод класса Caché, который будет выполнять всю работу.
Карта путей — это перечисление всех возможных URL для обращения к приложению для получения данных или для изменения данных на сервере.
В карте путей XData UrlMap при доступе к URL /test происходит вызов метода Test класса REST.Broker. В случае вызова методов других классов, в Call нужно также указывать имя класса
По адресу http://<адрес сервера>/rest/test должна выводиться надпись «Работает!» Пример [7]
Простейшее RESTful web API готово.
POPSPEC = "Company()" — сообщаем генератору тестовых данных, чего мы от него хотим, а то он бы нам имена людей выдавал тут.
Заполним класс тестовыми данными с помощью команды в терминале: w ##class(Data.Company).Populate(10)
Для демонстрации CRUD операции Return (HTTP — GET) мы создадим новый класс REST.JSON для задач генерации JSON ответов на запросы к RESTful сервису.
Интересен здесь разве что метод класса jsonSQLProvider — он выводит на текущее устройство результат SQL запроса в формате JSON. Обратите внимание на запятую в списке параметров, она обязательна, т.к. первый параметр – опциональное имя javascript переменной на стороне клиента.
Отдавать данные в JSON мы научились, однако брокер об этом не знает.
Готово! Теперь по адресу http://<адрес сервера>/rest/json/companies вас ждёт список компаний в JSON, пример [8].
А на стороне клиента мы будем превращать JSON, во что-нибудь, приятное глазу. Для этого используем MVC [9] JS-фреймворк AngularJS [10].
Компилируем страницу, переходим по адресу http://<адрес сервера>/csp/user/rest.csp и смотрим на полный список компаний. Как и раньше, пример [12].
Реализуем серверную бизнес-логику для оставшихся 3 операций CRUD: добавление, изменение и удаление компании.
На этом завершается создание CRUD-полного RESTful web API в Caché.
<!doctype html>
<html ng-app>
<head>
<title>REST Academy</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"></script>
<script language="javascript">
function ctrl($scope,$http) {
// Запрос GET к RESTful web API
$scope.getCompanies=function() {
$http.get("/rest/json/companies").success(function(data) {
// Помещаем ответ сервера в переменную companies
$scope.companies=data.children;
}).error(function(data, status) {
// Вывод информации об ошибке, если таковая возникнет
alert("["+status+"] Ошибка при загрузке компаний! ["+data+"]");
});
};
// Создать новую компанию
$scope.create = function (company){
$http.post("/rest/json/company",company)
.success(function(data){$scope.getCompanies();$scope.alertzone="Добавили компанию "+company.Name;}).error(function(data,status){
$scope.alertzone="["+status+"] Ошибка добавления компании :( ["+data+"]"; });
}
// Обновить существующую компанию
$scope.update = function (company){
$http.put("/rest/json/company/"+company.ID,company)
.success(function(data){$scope.alertzone="Обновили компанию "+company.Name;}).error(function(data,status){ // поменял alert(....); на alertzone
$scope.alertzone="["+status+"] Ошибка обновления имени компании :( ["+data+"]"; });
}
// Удалить компанию
$scope.delete = function (company){
$http.delete("/rest/json/company/"+company.ID)
.success(function(data){$scope.getCompanies();$scope.alertzone="Удалили компанию "+company.Name;}).error(function(data,status){
$scope.alertzone="["+status+"] Ошибка удаления компании :( ["+data+"]"; });
}
};
</script>
</head>
<body ng-controller="ctrl" ng-init="getCompanies();">
<h4 ng-model="alertzone"><font color=red>{{alertzone}}</font></h4>
<form name="compCreateForm" ng-model="company" ng-submit="create(company); company='';">
Добавить компанию <input type="text" ng-model="company.Name"/>
<input type="submit" value="Добавить"/>
</form>
<br>
<div ng-repeat="company in companies">
<form name="compForm" ng-submit="update(company); compForm.$setPristine();">
<input type="text" ng-model="company.Name"/>
<input type="submit" value="Сохранить" ng-show="compForm.$dirty"/>
<input type="button" value="X" ng-click="delete(company);"/>
</form>
</div>
</body>
</html>
В результате готов фронтэнд к web API по адресу http://<адрес сервера>/csp/user/rest.csp. Пример [13].
В рамках данной статьи мы научились строить и настраивать RESTful web API на сервере Caché. Построение клиентской части также возможно на основе сервера Caché.
Если кому-то интересно могу рассказать про обеспечение безопасности, разделение прав, и другие полезности для разработки RESTful web API на базе Caché.
Скачать RESTful web API, построенное в этом туториале [14]
Пример RESTful web API [13]
Глоссарий по технологиям InterSystems — так же RESTful web API [15]
JSON экспорт — класс [16] — класс2(SQL) [17]
%request [18] — класс [19]
%response [20] — класс [21]
XML экспорт [22] — класс [23]
Автор: eduard93
Источник [24]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/49922
Ссылки в тексте:
[1] писали: http://habrahabr.ru/post/38730/
[2] не раз: http://habrahabr.ru/post/144011/
[3] example.com/resources: http://example.com/resources
[4] example.com/resources/itemID: http://example.com/resources/itemID
[5] филд-тест версии: https://wrc.intersystems.com/wrc/BetaPortal.csp
[6] example.com/resources/ID: http://example.com/resources/ID
[7] Пример: http://37.139.6.156/rest/test
[8] пример: http://37.139.6.156/rest/json/companies
[9] MVC: https://ru.wikipedia.org/wiki/Model-View-Controller
[10] AngularJS: http://angularjs.org/
[11] ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js": https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"
[12] пример: http://37.139.6.156/csp/rest/rest0.csp
[13] Пример: http://37.139.6.156/csp/rest/rest.csp
[14] Скачать RESTful web API, построенное в этом туториале: https://www.mediafire.com/?g0463zbgyop6bm3
[15] Глоссарий по технологиям InterSystems — так же RESTful web API : http://glossary.intersystems.ru/glossary/terms
[16] JSON экспорт — класс: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25ZEN.Auxiliary.jsonProvider
[17] класс2(SQL): http://www.google.com/url?q=http%3A%2F%2Fdocs.intersystems.com%2Fcache20131%2Fcsp%2Fdocumatic%2F%2525CSP.Documatic.cls%3FPAGE%3DCLASS%26LIBRARY%3D%2525SYS%26CLASSNAME%3D%2525ZEN.Auxiliary.jsonSQLProvider&sa=D&sntz=1&usg=AFQjCNHlJ8Jka0zos5ERDlUY1o8EL0B-Ow
[18] %request : http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GCSP_httpreq
[19] класс: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=%25SYS&CLASSNAME=%25CSP.Request
[20] %response: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GCGI_oper_config#GCGI_http
[21] класс: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25CSP.Response
[22] XML экспорт: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GXML_export
[23] класс : http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25XML.DataSet
[24] Источник: http://habrahabr.ru/post/204576/
Нажмите здесь для печати.