Json 如何调用RESTRequest.ExecuteAsync

Json 如何调用RESTRequest.ExecuteAsync,json,rest,delphi,Json,Rest,Delphi,我正在尝试使用运行时创建的组件发出异步web请求。但我无法让ExecuteAsync方法工作:它引发了一个错误:请求没有客户端组件 以下是如何复制: 在空白表格上填写备注,然后输入以下代码: uses REST.Types, REST.Client; procedure TForm65.FormCreate(Sender: TObject); var RESTClient: TRESTClient; RESTResponse: TRESTResponse; RESTReques

我正在尝试使用运行时创建的组件发出异步web请求。但我无法让ExecuteAsync方法工作:它引发了一个错误:请求没有客户端组件

以下是如何复制:

在空白表格上填写备注,然后输入以下代码:

uses
  REST.Types, REST.Client;

procedure TForm65.FormCreate(Sender: TObject);
var
  RESTClient: TRESTClient;
  RESTResponse: TRESTResponse;
  RESTRequest: TRESTRequest;
begin
  ReportMemoryLeaksOnShutdown := True;

  RESTClient := TRESTClient.Create('https://dawa.aws.dk/postnumre?nr=9310');
  RESTResponse := TRESTResponse.Create(Self);
  RESTRequest := TRESTRequest.Create(RESTClient);

  RESTRequest.Response := RESTResponse;
  RESTRequest.Execute;
  Memo1.Lines.Add(RESTResponse.Content);


  RESTRequest.ExecuteAsync(
      procedure
    begin
      Memo1.Lines.Text := RESTResponse.Content
    end, True, True,
    procedure(AObject: TObject)
    begin
      Memo1.Lines.Add('Error: ' + ERESTException(AObject).Message);
    end);

  FreeAndNil(RESTClient);
end;
第一个同步调用只是为了显示我从该调用中获取数据


那么我做错了什么呢?

Dalija Prasnikar为我指出了正确的方向:因为请求是异步执行的,FreeAndNil可能会在请求执行之前运行。这将释放客户端和请求,因为客户端拥有请求

只是有人对我说我没有设置TRESTRequest.Client属性。这是不对的!由于客户端是请求的所有者,因此客户端属性位于构造函数中

{ TCustomRESTRequest }

    constructor TCustomRESTRequest.Create(AOwner: TComponent);
    begin

  // it is important to create the notify-list before
  // calling the inherited constructor
  FNotifyList := TNotifyList.Create;
  inherited Create(AOwner);

  // if we do get a client as owner, we just use
  // it. otherwise we look around and try to find
  // an existing client (maybe on the same form)
  if AOwner is TCustomRESTClient then
    Client := TCustomRESTClient(AOwner)
  else if RESTComponentIsDesigning(Self) then
    Client := RESTFindDefaultClient(Self);

...

FreeAndNil将在执行请求之前运行。您是对的。我没想过。把它作为一个答案,我会结束这个问题。你可以自己回答:)