回调
除了用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中使用客户端回调函数.