【问题标题】:Delphi REST fill out RESTResponseDelphi REST 填写 RESTResponse
【发布时间】:2018-02-23 08:19:42
【问题描述】:

我正在开发一个 DElphi FMX 项目,我在该项目中向 REST 后端发出大量请求。

我正在使用一个 TRESTClient,并且每次我请求某些东西时都会动态地创建一个 TRESTRequest,我的计划是让它多线程以使 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;

我这样称呼它:

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

但是,我在释放 Req(我的 TRESTRequest)时遇到访问冲突。

我发现是因为 TCustomRESTResponse Respons 只是做了一个指向放置 Req.Response 的内存的指针,所以释放 Req 也会破坏 Respons。

我的问题是:如何在 Req 被释放后复制 Req.Response?

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

我这样做是不是错误的方式,还要记住我希望实际请求处于另一个阶段?

迈克尔

【问题讨论】:

  • 您可以创建一个单独的记录或类来保存响应的相关信息。如果可能的话,我也会反序列化/解析或预处理响应内容,将其从原始信息转换为有用信息,然后再返回。这样,应用程序的其余部分将不依赖于这个特定的 TRESTResponse,甚至不依赖于使用 REST 获取此信息这一事实。

标签: rest delphi firemonkey


【解决方案1】:

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

也就是说,就像我在评论中提到的那样,我认为让线程处理反序列化响应可能会更好,并让它传递一个更通用的类或保存相关信息的记录(value object,如果你're into that),而不是传递特定的 TRESTResponse。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多