【发布时间】: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