datasnap+msgpack
datasnap+msgpack
datasnap借助rtti,可以使用任何类型的自定义对象作为远程方法的参数和返回类型,这真是非常恐怖的存在。任何其他3方中间件是无论如何都做不到这一点的。
unit ServerMethodsUnit1;
interface
uses MsgPack,
System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth;
type
{$METHODINFO ON}
TServerMethods1 = class(TComponent)
private
{ Private declarations }
public
{ Public declarations }
function test(params: TMsgPack): TMsgPack;
end;
{$METHODINFO OFF}
implementation
uses System.StrUtils;
{ TServerMethods1 }
function TServerMethods1.test(params: TMsgPack): TMsgPack;
begin
var f1: string := params.Force('f1').AsString;
var f2: string := params.Force('f2').AsString;
FreeAndNil(params);
Result := TMsgPack.Create;
Result.Force('result').AsBoolean := True;
Result.Force('f1').AsString := f1;
Result.Force('f2').AsString := f2;
end;
type
TServerMethods1Client = class(TDSAdminClient)
private
FtestCommand: TDBXCommand;
public
constructor Create(ADBXConnection: TDBXConnection); overload;
constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
destructor Destroy; override;
function test(params: TMsgPack): TMsgPack;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
var send: TMsgPack := TMsgPack.Create;
send.Force('f1').AsString := '咏南';
send.Force('f2').AsString := '中间件';
var m: TServerMethods1Client := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
var recv: TMsgPack := m.test(send);
if recv.Force('result').AsBoolean then
begin
Memo1.Lines.Add(recv.Force('f1').AsString);
Memo1.Lines.Add(recv.Force('f2').AsString);
end;
m.Free;
end;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/14148989.html

浙公网安备 33010602011771号