datasnap回调

回调

除了用REST支持调用DataSnap服务方法外,JSON还用于实现回调方法.DataSnap2010支持客户端回调
函数,使其执行在服务方法上下文中.这样就可以实现客户端调用服务端方法时,服务端就可以调用由客户端传
递好参数的回调函数.

例如,我们修改EchoString方法,向其中添加回调支持.修改后的EchoString方法如下:

function EchoString(Value: string; callback: TDBXcallback): string;

TDBXcallback类定义在DBXJSON单元.在我们实现EchoString方法前,先搞清楚如何在客户端定义回调函
数(毕竟,这是一个可以让服务端调用的客户端方法).

在客户端,我们必须定义一个新类,继承在TDBXCallback,重写其Execute方法.

type

TCallbackClient = class(TDBXCallback)

public

function Execute(const Arg: TJSONValue): TJSONValue; override;

end;

在Execute方法中,有一个TJSONValue类型的参数,可以复制(Clone)这个参数然后设置其具体内
容.Execute方法也返回一个TJSONValue类型的值,这里我们只返回同样的值:

function TCallbackClient.Execute(const Arg: TJSONValue): TJSONValue;

var

Data: TJSONValue;

begin

Data := TJSONValue(Arg.Clone);


ShowMessage('Callback: ' + TJSONObject(Data).Get(0).JSonValue.value);

Result := Data

end;

例如, 在方法实际返回前(如方法正在执行),回调函数将显示EchoString方法传递参数的值.服务端新的
EchoString方法实现需要将String值赋给一个TJSONObject对象,并将其传递给回调函数.如下:

function TServerMethods2.EchoString(Value: string; callback: TDBXcallback): string;

var

msg: TJSONObject;

pair: TJSONPair;

begin

Result := Value;

msg := TJSONObject.Create;

pair := TJSONPair.Create('ECHO', Value);

pair.Owned := True;

msg.AddPair(pair);

callback.Execute(msg);

end;

注意这个回调函数将在客户端执行—然后在服务端Echostring方法执行完毕前返回

最后,在客户端调用EchoString方法也需要修改,因为我们现在要提供一个回调类TCallbackClient的实例,如
下所示:

var

MyCallback: TCallbackClient;

begin

MyCallback := TCallbackClient.Create;

try

Server.EchoString(Edit1.text, MyCallback);

finally

MyCallback.Free;

end;

end;

这个范例阐释了如何在DataSnap2010中使用客户端回调函数.

你可能感兴趣的:(Data)