Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben (https://www.delphipraxis.net/210348-tidhttp-zu-thttpclient-umschreiben-thttpclient-ableiten-und-get-ueberschreiben.html)

DieDolly 9. Apr 2022 17:09


TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
TIdHTTP (get und post) scheint seit ein paar Wochen oder länger nicht mehr auf gewissen Systemen zu funktionieren, deswegen würde ich gerne alles zu THTTPClient umschreiben.

Ein Problem habe ich aber. Ich habe eine eigene Klasse
Delphi-Quellcode:
THTTPCustom = class(THttpClient)
mit eigenem Create und Destroy. Ich ich gerne das Get überschreiben, sodass ich String zurück bekomme und nicht erst wieder überall ContentAsString() hinschreiben muss. Wie geht das?

Außerdem würde ich in der eigenen Klasse ein property Response: IHttpResponse; einfügen. Die eigene Get-Funktion setzt dann gleich auch Response.
Der Vorteil ist, dass ich dann alles was ich brauche (String Get-Ergebnis und IHttpResponse Response-Ergebnis) in einer Klasse statt 2.

Mir fällt gerade aber auch auf, dass das hier gar nicht funktioniert und mit einem abstrakten Fehler beendet wird. Nur wieso?

Delphi-Quellcode:
unit HTTPCustom;

interface

uses
 System.Net.HttpClient;

type
 THTTPCustom = class(THttpClient)
 public
  constructor Create;
  destructor Destroy; override;
 end;

implementation

constructor THTTPCustom.Create;
begin
 inherited Create;
end;

destructor THTTPCustom.Destroy;
begin
 inherited Destroy;
end;

// hier würde ich gern noch Get() hinzufügen, wo dann Antwort von Get (IHttpResponse) in eine private Variable HttpResponse geschrieben wird

end.
Delphi-Quellcode:
procedure TForm3.Button2Click(Sender: TObject);
var
 HttpClient: THTTPCustom;
 HttpResponse: IHttpResponse;
begin
 HttpClient := THTTPCustom.Create;
 try
  HttpResponse := HttpClient.Get('irgendeine txt datei auf irgendeinem server');
 finally
  HttpClient.Free;
 end;
end;

TUhr 9. Apr 2022 21:03

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
Bist Du so freundlich das Problem mit IdHTTP (Post und Get) zu erklären, da es bei mir problemlos funktioniert.

Vielen Dank !

DieDolly 9. Apr 2022 21:06

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
Seit ein paar Wochen gehen bei mir im gesamten Netzwerk bestimmte Webseiten nur noch 1- oder 2-Mal, danach kommt nur noch "Seite wurde nicht gefunden".
2 Seiten sind mir bekannt. Meine eigene Seite war betroffen, ist jetzt aber wieder über den Webbrowser erreichbar.

Aus meiner Software raus mit TIdHTTP kann ich meine Webseite aber nicht erreichen. Nehme ich die exakt gleiche URL und kopiere sie in den Browser, funktioniert alles.
Getestet auf 3 PCs und 2 Handys. DNS-Server schon geändert, FritzBox zurückgesetzt, Firewalls und alles woran man sonst noch denkt aus.
Über einen Proxy im Firefox, hier hide.me, ist eine der seltsamerweise blockierten Seiten erreichbar.

Mit THTTPClient gibts keine Probleme. Ich denke, das Problem liegt draußen, irgendwo bei 1&1.

Da ich eh von TIdHTTP weg wollte, bietet sich das ja jetzt an. Aber ich schaffe es nicht THTTPClient abzuleiten wie oben reinkopiert, es kommt immer "Abstrakter Fehler".

hoika 10. Apr 2022 00:43

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
Hallo,
wo genau kommt der abstrakte Fehler?

DieDolly 10. Apr 2022 08:35

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
Direkt beim HttpClient.Get().

Delphi.Narium 10. Apr 2022 10:08

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
Nutzt Du die aktuellsten Versionen von Indy und OpenSSL? Etwas ältere Versionen kommen nicht mit allen HTTPS-Protokollen zurecht.

Das Problem hatte ich vor 'ner Weile auch, habe die aktuellen Versionen von Indy und OpenSSL genommen und schon geht's wieder. Und das bei meinem ollen Delphi 7.

Im Zweifelsfalle schau bitte mal bei https://www.ssllabs.com/ssltest/analyze.html nach, welche Protokolle die Webseiten, die bei Dir mit TIdHTTP nicht funktionieren, nutzen und prüfe, ob Deine Indy-Version damit zurecht kommt. Etliche Seiten unterstützen nur noch TLS 1.2 und das ist bei älteren Indy-Versionen noch nicht dabei.

Ein weiteres Problem könnte der Inhalt von TIDHTTP.Request.UserAgent sein. Trag da bitte mal was aktuelles ein. Etliche Server antworten bei zu "alten" UserAgents mit HTTP-Code 404 = "Seite nicht gefunden". Bei UserAgents älter als 'Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0' klappt es oft nicht mehr so recht.
Einige mögliche Werte für FireFox kannst Du hier finden: https://developer.mozilla.org/en-US/...-Agent/Firefox.
Für Chrome hier: https://developer.chrome.com/docs/mu...ce/user-agent/.
Bunt gemischtes ist hier zu finden: https://beamtic.com/user-agents/.

Eine nicht ganz aktuelle Liste als Unit:
Delphi-Quellcode:
unit ToolsUserAgentConsts;

interface

// Quelle: https://developers.whatismybrowser.com/useragents/explore/software_name/firefox/
const
  csUserAgentMac     = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0';
  csUserAgentNT5130   = 'Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0';
  csUserAgentNT5133   = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0';
  csUserAgentNT5136   = 'Mozilla/5.0 (Windows NT 5.1; rv:36.0) Gecko/20100101 Firefox/36.0';
  csUserAgentNT5140   = 'Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0';
  csUserAgentNT51701  = 'Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1';
  csUserAgentNT6034   = 'Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0';
  csUserAgentNT6117   = 'Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/20.6.14';
  csUserAgentNT6152   = 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0';
  csUserAgentNT6125   = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0';
  csUserAgentNT6157   = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0';
  csUserAgentNT6161   = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0';
  csUserAgentNT6117b = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0';
  csUserAgentNT6118   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0';
  csUserAgentNT6138   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0';
  csUserAgentNT6140   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1';
  csUserAgentNT6141   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0';
  csUserAgentNT6142   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0';
  csUserAgentNT6143   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0';
  csUserAgentNT6147   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0';
  csUserAgentNT6150   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0';
  csUserAgentNT6152b = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0';
  csUserAgentNT6154   = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0';
  csUserAgentNT6373   = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0';
  csUserAgentNT1057   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0';
  csUserAgentNT1059   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0';
  csUserAgentNT1060   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0';
  csUserAgentNT1061   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0';
  csUserAgentNT1062   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0';
  csUserAgentNT1063   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0';
  csUserAgentNT1065   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0';
  csUserAgentNT1066   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0';
  csUserAgentNT1067   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0';
  csUserAgentNT1078   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0';
  csUserAgentNT1084   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0';
  csUserAgentNT1085   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0';
  csUserAgentNT1088   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0';
  csUserAgentNT1089   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0';
  csUserAgentNT1090   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0';
  csUserAgentNT1091   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0';
  csUserAgentNT1092   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0';
  csUserAgentNT1093   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0';
  csUserAgentNT1094   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0';
  csUserAgentNT1095   = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0';
  csUserAgentNT1050   = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0';
  csUserAgentNT1052   = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0';
  csUserAgentNT1054   = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0';
  csUserAgentNT51175  = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0';
  csUserAgentNT511712 = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7';
  csUserAgentLinux24  = 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0';

implementation

end.

DieDolly 10. Apr 2022 10:25

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

Im Zweifelsfalle schau bitte mal bei https://www.ssllabs.com/ssltest/analyze.html nach, welche Protokolle die Webseiten, die bei Dir mit TIdHTTP nicht funktionieren, nutzen und prüfe, ob Deine Indy-Version damit zurecht kommt
Daran liegt es nicht. https://www.opitec.de/opitec-web/st/Home ist beispielsweise aus dem gesamten Netzwerk, egal ob aus einer Software oder von Firefox, Chrome usw., nicht erreichbar - nur mit Proxies.

ich würde sehr gerne auf THTTPClient umsteigen statt da rumzudoktorn. Das wäre ansich ja auch kein Problem, wenn ich eine Ableitung von THTTPClient hinbekommen würde.

Uwe Raabe 10. Apr 2022 10:32

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

Zitat von DieDolly (Beitrag 1504468)
Mir fällt gerade aber auch auf, dass das hier gar nicht funktioniert und mit einem abstrakten Fehler beendet wird. Nur wieso?

THTTPClient ist nur die Basisklasse. Die eigentlich verwendete Klasse wird in THTTPClient.Create je nach verwendeter Plattform bestimmt. Wichtig: THTTPClient.Create ist kein constructor!
Delphi-Quellcode:
class function THTTPClient.Create: THTTPClient;
begin
  Result := THTTPClient(TURLSchemes.GetURLClientInstance('HTTP')); // do not translate
end;
Eventuell wäre ein zielführender Ansatz, von TRESTHTTP abzuleiten (der hat schon das FHTTPResponse Feld) und dort ein weiteres GET-overload anzufügen, das deinen Wünschen entspricht.

DieDolly 10. Apr 2022 10:36

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
(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;

Uwe Raabe 10. Apr 2022 12:39

AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
 
[QUOTE=DieDolly;1504481]
THTTPClient würde, wenn ich den abstrakten Fehler nicht hätte, sofort funktionieren so wie ich es jetzt habe./QUOTE]

Die Architektur rund um THTTPClient sieht vor, dass Ableitungen für unterschiedliche Plattformen erstellt werden. Damit fallen Ableitungen für funktionalen Erweiterungen, so wie du sie geplant hattest, erst einmal aus. Das muss dann in Wrapper-Klassen realisiert werden, wie es ja in TRESTHTTP und, in einem höheren Level, in TRESTClient realisiert sind. Ich kann aber verstehen, wenn diese Klassen für deine Zwecke etwas viel Overhead haben. Trotzdem schön, dass du es zum Laufen gebracht hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz