Я пытаюсь сделать асинхронный веб-запрос, используя компоненты, созданные во время выполнения. Но я не могу заставить метод ExecuteAsync работать: Возникает ошибка : Request has no client component

Вот как можно воспроизвести:

Поместите Memo на пустую форму, а затем этот код:

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;

Первый синхронизированный вызов нужен только для того, чтобы показать, что я получаю данные от этого вызова.

Так что же я делаю не так?

Jens Borrisholt

Ответов: 1

Ответы (1)

Далия Прасникар указала мне верное направление: Поскольку запрос выполняется асинхронно, FreeAndNil, вероятно, будет запущен до выполнения запроса. Это освободит клиента, а также запрос, поскольку клиент владеет запросом.

Многие говорили мне, что я не устанавливаю свойство TRESTRequest.Client. Это неверно! Поскольку клиент является владельцем запроса, свойство 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);

...

2022 WebDevInsider