将JSON对象传递给Datasnap服务器应用程序
我在Delphi Tokyo 10.2中有一个datasnap应用服务器和一个客户端witten。我需要知道我是否正确地进行了两者之间的沟通。我将在这里写下客户机代码: 客户端代码:将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
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]);
提前感谢您耐心地完成这一过程。期待一些指导 如果您有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);
结束;
结束;