Codeintensive REST-Callback-Funktionen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu DataSnap-REST


Mit Heavyweight-Callback-Funktionen können Sie von einer Webseite aus JavaScript-Funktionen beim Server registrieren und durch Angabe der ID des Empfangskanals festlegen, bei welcher Bedingung sie benachrichtigt werden sollen. Dies ermöglicht einem schlanken Client fast unverzüglich Benachrichtigungen vom Server zu erhalten, ohne dass ständig Anfragen gesendet werden müssten, um Änderungen festzustellen.

Für diese Benachrichtigungen vom Server müssen Sie zunächst die Serverkomponente und alle Serverklassenkomponenten in ein Datenmodulformular verschieben (oder an eine andere Position – außerhalb des Webmoduls –, wo diese Komponenten nur eine einzelne Instanz erstellen). Der Server hat Sende- und Benachrichtigungsfunktionen, die eine Kanal-ID und ein TJSONValue-"message"-Objekt übernehmen. Für die Benachrichtigung sind zusätzliche Parameter zum Festlegen der genauen Client-Callback-Funktion, an die die Meldung gesendet werden soll, erforderlich. Wenn Sie jedes Mal, wenn eine Memo-Komponente geändert wird, eine Meldung senden möchten, fügen Sie ein Ereignis für die Bearbeitung dieser Komponente hinzu und geben Folgendes in das Ereignis ein:

 
 Val := TJSONString.Create(Memo1.Text);
 [DSServer].BroadcastMessage('MemoChannel', Val); //'MemoChannel' can be replaced by anything
 

Fügen Sie dann im Client-Code ein Formular mit einem Textbereich mit der ID "tarea" (oder ähnlich) ein, fügen Sie diesen JavaScript-Code hinzu, und stellen Sie sicher, dass der Code ausgeführt wird (beim Übertragen, beim Laden der Seite usw.):

 
 var channel = new ClientChannel(null, "MemoChannel"); //this matches the server's Channel ID
 var callback = new ClientCallback(channel, null,
   function(jsonValue) {
     if (jsonValue != null) {
       document.getElementById("tarea").value = jsonValue;
     }
     return true;
 });
 channel.connect(callback);
 

Dieser Beispielcode erstellt einen Textbereich in Ihrem Webbrowser, der immer mit dem in der Memo-Komponente auf dem Server eingegebenen Text synchron ist.

In XE2 kann jetzt für JavaScript REST-Callbacks zusätzlich zu dem ServerChannelName des Kanals eine Liste mit zu überwachenden ServerChannelNames angegeben werden. Für den ClientCallback-Konstruktor steht ein optionaler Abschlussparameter zur Verfügung, der ein JSON-Array mit Kanalnamen angibt. Dieser Parameter kann auf ein leeres Array oder auf null gesetzt werden, wenn Sie keine weiteren zu überwachenden Kanalnamen angeben wollen.

Dies ist wegen des von Browsern vorgeschriebenen Verbindungslimits besonders für JavaScript notwendig. Sie können ähnliches Verhalten anhand von Namenskonventionen für die Callback-IDs aller Clients simulieren. Der Server (nicht aber der Client) kann dann einen bestimmten Kanal UND eine Callback-ID weiterleiten. Das entspricht weitgehend Callbacks, die ihren eigenen Kanal überwachen. Es wird jedoch verhindert, dass Clients mehrere Callbacks auf demselben Kanal überwachen müssen. Zudem wird der Server eingeschränkt, da er den übergeordneten Kanal angeben muss.

Siehe auch