delphi-blocks / WiRL

WiRL: RESTful Library for Delphi
https://wirl.delphiblocks.dev/
Apache License 2.0
238 stars 84 forks source link

Client - Recuperare Header #48

Closed maxcoros closed 10 months ago

maxcoros commented 10 months ago

Ho un problema con un app client, a seguito di una richiesta post come posso accedere all'header della risposta? Ho visto nei filtri che c'è la possibilità di accedere all'header tramite AResponseContext.Response.Headers.Values[] ma come faccio a vedere quali sono le chiavi presenti nell'header?

lminuti commented 10 months ago

Puoi fare in diversi modi, ma il più semplice, introdotto proprio di recente, lo vedi nel demo "01.HelloWorld". Prova a guardare la unit TMainDataModule e in particolare il metodo: GetPersonAndHeader.

// 1. Get the raw response (IWiRLResponse)
  LResponse := WiRLClientApplication1
    .Resource('helloworld/person')
    .QueryParam('Id', Id.ToString)
    .Get<IWiRLResponse>;

  // 2. Read the header from the response
  LContentType := LResponse.ContentType;
  // 3. Read the object (TPerson) from the response
  LPerson := LResponse.Content.AsType<TPerson>;
maxcoros commented 10 months ago

Ho visto l'esempio, ma quello che non riesco a capire è come fare per accedere a tutte le chiavi dell'header. Come faccio per vedere l'intero contenuto dell'header?

lminuti commented 10 months ago

Se guardi com'è fatta l'interfaccia IWiRLResponse hai la property HeaderValue che ti restituisce il valore di un header dato il suo nome. In alternativa puoi usare la property Headers che ti restituisce un interfaccia IWiRLHeaders che supporta gli enumerativi. In questo modo puoi scrivere una cosa tipo (vado a memoria):

var
  LHeader: TWiRLHeader;
begin
  ...
  for LHeader in AResponse.Headers do
  begin
    Writeln(LHeader.Name, LHeader.Value);
  end;
end;
maxcoros commented 10 months ago

Grazie, non mi ero proprio accorto che IWiRLHeaders supportasse gli enumerativi.

ho fatto un test ed effettivamente riesco a recuperare tutte le chiavi dell'header (o quasi). Il servizio a cui devo fare accesso setta due cookie, ma io riesco a vederne solo 1. Facendo la stessa chiamata con Postman li vedo tutti e due (prime due righe):

image

mentre utilizzando WiRL ottengo queste chiavi dall'header::

image

cosa mi sfugge?

lminuti commented 10 months ago

Puoi essere che sia un bug. Adesso non riesco a fare dei test ma prova a modificare la unit WiRL.http.Headers da così:

procedure TWiRLHeaders.SetValue(const AName, AValue: string);
var
  LIndex: Integer;
begin
  for LIndex := 0 to Count - 1 do
  begin
    if SameText(Items[LIndex].Name, AName) then
    begin
      if AValue = '' then
        Delete(LIndex)
      else
        Items[LIndex].Value := AValue;
      Exit;
    end;
  end;
  Add(TWiRLHeader.Create(AName, AValue));
end;

a così:

procedure TWiRLHeaders.SetValue(const AName, AValue: string);
begin
  Add(TWiRLHeader.Create(AName, AValue));
end;