将JSON对象传递给Datasnap服务器应用程序

将JSON对象传递给Datasnap服务器应用程序,json,delphi,datasnap,delphi-10.2-tokyo,Json,Delphi,Datasnap,Delphi 10.2 Tokyo,我在Delphi Tokyo 10.2中有一个datasnap应用服务器和一个客户端witten。我需要知道我是否正确地进行了两者之间的沟通。我将在这里写下客户机代码: 客户端代码: procedure TRemoteAcessModule.InitialiseRESTComponents(BaseURL: string); var ReqParam : TRESTRequestParameter; begin //URL to which client has to connect RE

我在Delphi Tokyo 10.2中有一个datasnap应用服务器和一个客户端witten。我需要知道我是否正确地进行了两者之间的沟通。我将在这里写下客户机代码:

客户端代码:

procedure TRemoteAcessModule.InitialiseRESTComponents(BaseURL: string);
var
 ReqParam : TRESTRequestParameter;
begin
 //URL to which client has to connect
 RESTClient1.BaseURL := BaseURL;//'http://192.168.110.160:8080/datasnap/rest/TserverMethods1';
 RESTClient1.Accept:= 'application/json, text/plain; q=0.9, text/html;q=0.8,';
 RESTClient1.AcceptCharset := 'UTF-8, *;q=0.8';

 RESTRequest1.Client := RESTClient1;
 RESTRequest1.Response := RESTResponse1;

 RESTResponse1.RootElement := 'Rows';
 RESTResponseDataSetAdapter1.Response := RESTResponse1;
 RESTResponseDataSetAdapter1.Dataset := FDMemTable1;
 RESTResponseDataSetAdapter1.NestedElements := true;

end;

class function TItemsHelper.InsertItem(item: TItem): boolean;
var
 ds : TDataset;
begin
 ds := RemoteAcessModule.CallResource2('InsertItem', TJson.ObjectToJsonString(item));
 if ds.Fields[0].AsInteger > 0 then
  result := true
 else
  result := false
end;

function TRemoteAcessModule.CallResource2(ResourceName: string): TDataset;
begin
  CallResourceNoParams(ResourceName);
  result := GetQueryResult;
end;

procedure TRemoteAcessModule.CallResource(ResourceName, Params: string);
begin
 RESTResponseDataSetAdapter1.Dataset := TFDMemTable.Create(self); //new
 RESTRequest1.Resource := ResourceName;
 RESTRequest1.ResourceSuffix := '{qry}';
 RESTRequest1.AddParameter('qry', TIdURi.ParamsEncode(Params), TRESTRequestParameterKind.pkURLSEGMENT, [poAutoCreated]);
 RESTRequest1.Execute;
 RESTResponseDataSetAdapter1.Active := true;
 RESTRequest1.Params.Delete('qry');
 RESTRequest1.ResourceSuffix :='';
end;
在服务器端,我编写了一个函数,用于解码json并将项目数据插入数据库

因此,要插入项,我必须通过传递需要插入的Titem对象来调用titemHelper.InsertItem。这很有效。但我的疑问是:

RESTRequest1.AddParameter('qry', TIdURi.ParamsEncode(Params), TRESTRequestParameterKind.pkURLSEGMENT, [poAutoCreated]); 
  • 上面提到的方法是否是传递编码数据的正确方法 json对象到服务器(使其成为URL的一部分)?如果不是,怎么办 我可以将json数据发送到datasnap服务器吗

  • 我在这里做错了什么事,你能给我一些建议吗


  • 提前感谢您耐心地完成这一过程。期待一些指导

    如果您有DataSnap REST服务器,则有一个向导可用于构建DataSnap客户端应用程序。您使用的REST客户端库用于通用REST服务器。若您有DataSnap服务器,并且希望使用Delphi客户端应用程序,那个么可以利用向导


    顺便说一句,Embarcadero现在建议开发REST服务器。

    正如@erwin提到的,您应该检查DataSnap REST客户端模块。至少这就是我为客户创建概念验证应用程序的方式。例如,DataSnap服务器有几个REST客户机模块,该模块有一个名为GetListByFetchParams的公共方法,该方法返回TFDJSONDataSets。实现看起来有点像这样:

    function TBaseServerMethods.InternalGetListByFetchParams(aFetchParams: TFetchParams): TFDJSONDataSets;
    begin
      {$IFDEF USE_CODESITE}
      CSServerMethods.TraceMethod( Self, 'InternalGetListByFetchParams', tmoTiming );
      CSServerMethods.Send( csmFetchParams, 'aFetchParams', aFetchParams );
      {$ENDIF}
    
      Result := TFDJSONDataSets.Create;
    
      // Close the ListDataSet
      ListDataSet.Close;
    
      // Open the List DataSet
      ListDataSet.Open;
    
      // Add the ListDataSet to the result using a predefined name.
      TFDJSONDataSetsWriter.ListAdd( Result, ListDataSetName, ListDataSet );
    
      {$IFDEF USE_CODESITE}
      CSServerMethods.Send( 'qryList.SQL', ListDataSet.SQL );
      CSServerMethods.Send( csmFDDataSet, 'qryList DataSet Contents', ListDataSet );
      {$ENDIF}
    end;
    
    最重要的是,我创建了一个TFDJSONDataSets,并将其设置为结果。我删除了一些代码,但简而言之,aFetchParams用于更改ListDataSet引用的FireDaC查询组件的SQL语句,然后打开该数据集。接下来,我使用TFDJSONDataSetsWriter.ListAdd调用将我们的ListDataSet添加到TfdJSONDataSet,这是函数的结果

    客户端我也需要一些代码。此代码将调用DataSnapServer上的远程方法,该方法将返回TFDJSONDataSet,然后我可以将其反序列化到客户端上的TFDMemTables中:

    procedure TBaseAgent.FetchListWithParams(aFetchParams : TFetchParams);
    var
      oListData      : TFDJSONDataSets;
      oKeyValues     : TDictionary< String, String >;
    begin
      {$IFDEF USE_CODESITE}CSAgent.TraceMethod( Self, 'FetchListWithParams', tmoTiming );{$ENDIF}
    
      oListData      := FetchListWithParamsFromServer( aFetchParams );
      try
        tblList.AppendData( TFDJSONDataSetsReader.GetListValue( oListData, 0 ) );
        tblList.Open;
      finally
        FreeAndNil( oListData );
      end;
    end;
    
    过程TBaseAgent.FetchListWithParams(aFetchParams:TFetchParams);
    变量
    oListData:tfdjson数据集;
    OkeyValue:t字典;
    开始
    {$IFDEF USE_CODESITE}CSAgent.TraceMethod(Self,'FetchListWithParams',tMoting);{$ENDIF}
    oListData:=从服务器获取的带有参数的FetchListWithParams(aFetchParams);
    尝试
    tblList.AppendData(TFDJSONDataSetsReader.GetListValue(oListData,0));
    t打开;
    最后
    FreeAndNil(oListData);
    结束;
    结束;