Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#9

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben

  Alt 10. Apr 2022, 11:36
(ich darf verkünden, der Code da unten funktioniert. Alles ist eingebaut und bleibt jetzt so. Vielen Dank an alle)

Könntest du mir dabei helfen?

Mein Ziel mit der eigenen Klasse:
so wenig Zeilen wie möglich, wenn ich irgendwo was mit HTTP machen möchte - so habe ich das aktuell ja auch schon mit TIdHTTP.
THTTPClient würde, wenn ich den abstrakten Fehler nicht hätte, sofort funktionieren so wie ich es jetzt habe.

Das überschrieben Get brauche ich nur, damit ich im Get selber dann noch HttpResponse: IHttpResponse; setzen kann. Damit habe ich dann pro HTTP-Aufruf irgendwo im Programm wieder ein paar Zeilen weniger und kann direkt auf ein von mir im der eigenen HttpClient-Klasse deklarierten HttpResponse zugreifen, ohne extra über IHttpResponse gehen zu müssen.

Ist TRestHTTP besser? Das Respnse-Feld ist schon drin, das wäre natürlich gut. Aber ich weiß nicht wie man das nutzen soll. Ich sehe hier irgendwas mit Streams und get ist eine Prozedur statt Funktion. Das wäre ja wieder mehr Aufwand als das was ich jetzt schon habe.

Kann ich nicht doch irgendwie THTTPClient nutzen?

Ich glaube ich bin zu dumm für Streams und sowas. Hier meine zusammengepfuschte Lösung. Wenn ich alles so lasse wie ich es jetzt unten stehen habe, habe ich pro Aufruf nicht mehr Code als ich im Projekt wo ich das brauche eh schon habe. Beim Aufruf wäre auch bestimmt ein 1-Zeiler möglich, aber an manchen Stellen verwende ich die HTTP-Instanz noch weiter. Eigentlich brauche ich noch eine overload Post() Methode. Meinem alten Code übergebe ich einfach TStrings. TRestHTTP will einen Stream, deswegen lasse ich das sein. Streams sind ein Geheimnis für mich.


Delphi-Quellcode:
type
 THTTPCustom = class(TRESTHTTP)
 public
  ResponseContent: TStringStream;

  procedure Get(const AURL: string); overload;

  constructor Create;
  destructor Destroy; override;
 end;

constructor THTTPCustom.Create;
begin
 inherited Create;

 ResponseContent := TStringStream.Create;
end;

destructor THTTPCustom.Destroy;
begin
 inherited Destroy;

 ResponseContent.Free;
end;

procedure THTTPCustom.Get(const AURL: string);
begin
  ResponseContent.Clear; // wenn ich mit einer THTTPCustom-Instanz mehrfach Get() ausführe, sind die Ergebnisse sonst falsch
  ResponseContent.Seek(0, soBeginning);
  inherited Get(AURL, ResponseContent);
end;

procedure TForm3.Button2Click(Sender: TObject);
var
 HttpClient: THTTPCustom;
begin
 HttpClient := THTTPCustom.Create;
 try
  HttpClient.Get('domain');
  showmessage(HttpClient.Response.ContentAsString() + ' - ' + HttpClient.ResponseCode.ToString);
 finally
  HttpClient.Free;
 end;
end;

Geändert von DieDolly (10. Apr 2022 um 13:31 Uhr)
  Mit Zitat antworten Zitat