Rest 德尔福休息填写Response

Rest 德尔福休息填写Response,rest,delphi,firemonkey,Rest,Delphi,Firemonkey,我正在从事一个DElphi FMX项目,在这个项目中,我向REST后端发出了很多请求 我使用的是一个TresClient,每次我请求一些东西时都会动态地创建一个TresRequest,我的计划是让它多读,让UI更具响应性 我创建了一个名为DoRequest的函数,用于执行实际请求,它看起来像这样: Function TFormMain.Dorequest(Meth:TRESTRequestmethod;Url,RequestBody:String; Var Respons: TCustomRE

我正在从事一个DElphi FMX项目,在这个项目中,我向REST后端发出了很多请求

我使用的是一个TresClient,每次我请求一些东西时都会动态地创建一个TresRequest,我的计划是让它多读,让UI更具响应性

我创建了一个名为DoRequest的函数,用于执行实际请求,它看起来像这样:

Function TFormMain.Dorequest(Meth:TRESTRequestmethod;Url,RequestBody:String; 
Var Respons: TCustomRESTResponse):Boolean;
Var
  par: TRESTRequestParameter;
  Req : TRESTRequest;
begin
  Req := TRESTRequest.Create(RESTClient);
  With Req do
  try
    if RequestBody<>'' then
    begin
      Params.Clear;
      par := Params.AddItem('body',RequestBody);
      par.ContentType := ctAPPLICATION_JSON;
      par.Kind := pkREQUESTBODY;
    end;
    Method   := Meth;
    Resource := Url;
    Execute;
    Respons  := Response;
    Result  := Respons.StatusCode In [200,201];
  finally
    Req.Free;  // <-Error here
  end;
end;
然而,当释放我的TRESTRequest Req时,我会遇到访问冲突

我发现这是因为tcustomresponse响应只是一个指向放置Req.响应的内存的指针,所以释放Req也会破坏响应

我的问题是:如何制作Req.Response的副本,该副本在Req被释放后仍然有效

我尝试过Response.Assign(Response),但它给出了一个相当奇怪的错误:“无法将TcustomResponse分配给TFormMain”

我这样做是错误的吗?同时也要记住,我希望实际请求处于另一种状态


Michael

当您不将自己的TresResponse链接到客户端时,客户端将创建自己的TresResponse并释放它。如果您创建自己的TresResponse并分配它,客户端将不处理它,您可以随时释放它


也就是说,正如我在评论中提到的,我认为让线程处理反序列化响应可能更好,让它传递一个更通用的类或记录来保存相关信息(a,如果你喜欢的话),您可以创建一个单独的记录或类来保存响应的相关信息,而不是传递特定的树响应。

。如果可能的话,我还将反序列化/解析或预处理响应内容,以便在返回之前将其从原始信息转换为有用信息。这样,应用程序的其余部分就不依赖于这个特定的树响应,甚至不依赖于使用rest获取此信息的事实。
procedure TFormUser.Button1Click(Sender: TObject);
Var
  Respons: TCustomRESTResponse;
begin
  If DoRequest(rmPOST,CreateUserUrl,JSON,Respons) then
    begin
      ShowMessage('User '+EdEmail.Text+' created');
      ModalResult := MrOk;
    end