- PVSM.RU - https://www.pvsm.ru -

Прямой доступ к классам Caché через REST, на примере DHTMLX Grid

С выходом новой версии Intersystems Caché появилась возможность использовать технологию REST и строить приложения, с помощью различных Javascript UI библиотек, в то время как сервер Caché выступает в роли сервера данных. В данной статье будет рассмотрен очень простой пример доступа к хранимым классам Caché с помощью технологии REST.

Если упростить, то схема такого приложения выглядит следующим образом:

Прямой доступ к классам Caché через REST, на примере DHTMLX Grid

Как видно из схемы, обмен данными производится с помощью REST брокера, используя формат JSON. Таким образом, Caché используется только для получения данных в формате json, которые обрабатываются любой Javascript UI библиотекой. Это позволяет полностью разделить серверную бизнес-логику и пользовательский интерфейс. При желании интерфейс пользователя можно расположить в статических html страницах, что повысит производительность приложения. Также данный подход дает большое преимущество при проектировании интерфейсов, разработчику интерфейса нет необходимости знать Caché, ему достаточно JSON данных, которые приходят с сервера.

Перейдем к простейшей реализации данного подхода. Для этого необходимо создать простейший REST брокер. Создаем новый класс и наследуем его от %CSP.REST:

Class User.DataGateway Extends %CSP.REST
{
    
XData UrlMap
    {
        <
Routes>
            <
Route Url="/get" Method="GET" Call="GetData"/>
        </
Routes>
    }
    
ClassMethod GetData() As %Status
    
{
        
"hello"
        
quit $$$OK
    

}

Для того чтобы брокер заработал, необходимо выполнить настройку веб приложения. В портале управления необходимо зайти в «Администрирование системы > Безопасность > Приложения > Веб приложения», после чего изменить приложение (в данном примере это «/csp/user»). В поле класс-обработчик указываем только что созданный класс User.DataGateway.

Прямой доступ к классам Caché через REST, на примере DHTMLX Grid

Если все настроено правильно, то перейдя по адресу http://localhost:57772/csp/user/get [1] мы должны увидеть текст «hello». Теперь модифицируем метод таким образом, чтобы можно было обратиться к любому статическому методу класса. Для этого воспользуемся функцией $CLASSMETHOD.

ClassMethod GetData() As %Status
{
        
// Необходимо для примера, чтобы работали кросс-доменные запросы
        
%response.SetHeader("Access-Control-Allow-Origin""*")
        
// Получаем имя класса и имя метода
        
class %request.Get("class"""
        
if (class '= ""{
                
set method %request.Get("method""")
                
if (method '= ""{
                        
try {
                                
// Выполняем метод класса
                                
d $CLASSMETHOD(classmethod)
                        
catch err {
                                
err.AsSystemError()
                        
}
                }
        }                  
        
quit $$$OK
}

Чтобы протестировать работу REST брокера, создадим простой класс описывающий организацию.

Class User.GridDemo Extends %Persistent
{
    
Property Code As %String;
    
Property NameFull As %String;
    
Property NameShort As %String;
    
ClassMethod InitDemoData()
    {
            
##class(User.GridDemo).%New()
            
o.Code "001"
            
o.NameFull "Organization One"
            
o.NameShort "Org 1"
            
o.%Save()
            
##class(User.GridDemo).%New()
            
o.Code "002"
            
o.NameFull "Organization Two"
            
o.NameShort "Org 2"
            
o.%Save()
            
            
"Done"
    
}
}

Перейдя по ссылке http://localhost:57772/csp/user/get?class=GridDemo&method=InitDemoData [2], увидим «Done». Таким образом, мы вызвали метод InitDemoData класса GridDemo. Теперь добавим метод, который будет формировать json для грида(в данном случае рассмотрен формат, который использует dhtmlx grid).

ClassMethod GetGridData()
    {
         
// Выбираем все данные
         
sql ##class(%SQL.Statement).%New()
         
st sql.%Prepare("select * from GridDemo")
         
if (st '= 1) 
                 
"%Prepare failed",$System.Status.DisplayError(st
                 
q
         
}
         
rset sql.%Execute()
           
if (rset.%SQLCODE '= 0) 
                    
"query error: "rset.%SQLCODE" "rset.%Message
                    q
           
}                     
          
// Строим json
          
json "{ ""rows"": [ "        
          
while rset.%Next() {
                
json json "{ ""id"": " rset.Id ", ""data"": [ "                  
                 
json json """" rset.Code ""","""  rset.NameFull """"
                  
json json " ] },"
        
}     
        
// Убираем запятую в конце, если она есть
        
len $l(json)
        
if ($e(jsonlenlen) = ","json $E(json, 1, len - 1)
        
json json " ] }"    
        
json
    
}

После чего, по адресу localhost [3]:57772/csp/user/get?class=GridDemo&method=GetGridData должны отображаться данные в формате JSON.

{ "rows": [ { "id": 1, "data": [ "001","Organization One" ] },{ "id": 2, "data": [ "002","Organization Two" ] } ] }

Стоит обратить внимание, что в данной статье не рассматривается вопрос безопасности, а также корректного формирования JSON. Данные методы приведены как иллюстрация подхода к проектированию приложения и построения интерфейсов пользователя. Если кратко, то необходимо ограничить доступ к методам классов, чтобы можно было вызвать только методы, которые ориентированы на обработку данных, а также проверять права пользователя в каждом методе отдельно.

Получив JSON с данными, остается только написать страничку с пользовательским интерфейсом. Для этого воспользуемся библиотекой dhtmlx (или Sencha Ext JS, JQuery UI и т.п., просто изменив формат исходящего JSON).

<!DOCTYPE html>
<html>
<head>
    <title>Grid Demo</title>
    <link href="js/dhtmlxw/dhtmlx.css" rel="stylesheet">    
    <script src="js/dhtmlxw/dhtmlx.js"></script> 
    <script src="js/jquery-1.10.2.min.js"></script>
   
    <script language='javascript'>    
    	var g = null;
    	var l = null;        
    	
        $(document).ready(function (){
            l = new dhtmlXLayoutObject(document.body, '1C');
   		g = l.cells("a").attachGrid();
   		l.cells("a").setText("Grid Demo");
   		g.setImagePath("/js/dhtmlxw/imgs/");
   		g.setHeader("Code,Full Name,Short name");
    		g.setColumnIds("Code,NameFull,NameShort");
    		g.attachHeader("#text_filter,#text_filter,#text_filter,#text_filter");
    		g.setInitWidths("120,*,200");
    		g.setColAlign("center,left,left,left");
    		g.setColTypes("ro,ro,ro,ro");
    		g.setColSorting('str,str,str,str');
    		g.init();
    		    		
    		$.getJSON( "http://localhost:57772/csp/user/get?class=GridDemo&method=GetGridData&table=GridDemo", onDataLoaded);
        });
                
    function onDataLoaded(data) {
        g.clearAll();
        g.parse(data,'json');
    }
    </script>

</head>
<body style="height:600px">
</body>
</html>

Для запросов к серверу в данном примере используется метод JQuery — getJSON, после чего в колбеке onDataLoaded, данные передаются в грид. Если все сделано правильно, должен появится грид с данными.

Прямой доступ к классам Caché через REST, на примере DHTMLX Grid

Заключение

В статье был рассмотрен один из методов взаимодействия с сервером Caché посредством технологии REST. Создан универсальный механизм доступа к любым статическим методам. Используя его, формируется JSON с данными, который обрабатывается на клиенте с помощью UI библиотеки.

В данной статье не было рассмотрено:

  1. Безопасность при обращении к классам, используя REST(права пользователей, именование веб методов).
  2. Формирование корректного JSON(zconvert, %ZEN.Auxiliary.jsonSQLProvider  и т. п.).
  3. Формирование расширенного пользовательского интерфейса (layout, tabs, treeview и т. п.).

Пример, используемый в статье, можно скачать тут [4]

Автор: dsoul

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/71441

Ссылки в тексте:

[1] http://localhost:57772/csp/user/get: http://localhost:57772/csp/user/get

[2] http://localhost:57772/csp/user/get?class=GridDemo&method=InitDemoData: http://localhost:57772/csp/user/get?class=GridDemo&method=InitDemoData

[3] localhost: http://localhost

[4] тут: https://www.dropbox.com/s/2k12jopha7u7fzo/GridDemo.zip?dl=0

[5] Источник: http://habrahabr.ru/post/239861/