简体   繁体   中英

Passing Objects to DataSnap Server Methods?

I am using Delphi XE6, & datasnap, and I am trying to pass an Object (TDataObj) with some fields to a datasnap server method and the strangest error is occuring. My server method will crash on a TStringStream creation if my data object I pass in NOT nil.

//client side

procedure TForm8.btnGetDataClick(Sender: TObject);
var
  DataObj: TDataObj;
  S: TStream;
begin
  //create an object
  DataObj := TDataObj.Create;
  DataObj.Id:= 1;
  DataObj.Name := 'DataObj1';
  DataObj.ExportType := 'PDF';
  //pass the obj to server method to retrieve data stream back
  try
    S := ClientModule1.ServerMethods1Client.GetData(DataObj);
    S.Seek(0, soFromBeginning);
    ClientDataSet1.LoadFromStream(S);
    ClientDataSet1.Open;
  finally
  end;
end;

//Server Side method

function TServerMethods1.getData(const DataObj: TDataObj): TStream;
var
  r: String;
  SS: TStringStream;
begin
  //create a stream using JSON from getSessionJSON method
  SS := TStringStream.Create(getSessionJSON(DataObj)); //returns json
  try
    try
      r := ServerContainer1.idHttp1.Post
        ('MyUrlHere', SS);
      //do something else here
    except
      on e: exception do
      begin
        ShowMessage(e.Message);
        exit;
      end;
    end;
  finally
    SS.Free;
  end; 
end;

//get Json

function TServerMethods1.getSessionJSON(const DataObj: TDataObj): String;
var
  ParamsJSONObj, SessionJSONObj: TJSONObject;
begin
  ParamsJSONObj := TJSONObject.Create;
  ParamsJSONObj.AddPair(TJSONPair.Create('ID', DataObj.Id));
  ParamsJSONObj.AddPair(TJSONPair.Create('Name', DataObj.Name));
  ParamsJSONObj.AddPair(TJSONPair.Create('ExportType', DataObj.ExportType));
  SessionJSONObj := TJSONObject.Create;
  SessionJSONObj.AddPair(TJSONPair.Create('DataParams', ParamsJSONObj));
  result := SessionJSONObj.toString;
end;

However, on the client side, if I pass in a nil object

 S := ClientModule1.ServerMethods1Client.GetData(nil);

and then fill in the values in the get Json on the server side

 ParamsJSONObj.AddPair(TJSONPair.Create('ID', '1'));
  ParamsJSONObj.AddPair(TJSONPair.Create('Name', 'DataObj1'));
  ParamsJSONObj.AddPair(TJSONPair.Create('ExportType', 'pdf'));

it works, but , if I pass in the actual data object (dataObj) instead of nil

it crashes on the server side here

  SS := TStringStream.Create(getSessionJSON(DataObj)); 

whether I call getSessionJSON or not

If I place in any string

SS := TStringStream.Create('THis is a random test');

if the DataObj is not nil, the values in dataObj are there, but the

SS := TStringStream.Create will throw a runtime error

Hope this is understandable? dataObj, makes the call above crash if dataObj is NOT nil

Any help would be greatly appreciated

Turned out to be an encoding issue which was solved using

 S := getSessionJSON(DataObj);
  SS := TStringStream.Create(r, TEncoding.ASCII);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM