![]() |
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:
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?
THTTPCustom = class(THttpClient)
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; |
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 ! |
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". |
AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Hallo,
wo genau kommt der abstrakte Fehler? |
AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Direkt beim HttpClient.Get().
|
AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Nutzt Du die aktuellsten Versionen von
![]() 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 ![]() 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: ![]() Für Chrome hier: ![]() Bunt gemischtes ist hier zu finden: ![]() 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. |
AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Zitat:
![]() 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. |
AW: TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Zitat:
Delphi-Quellcode:
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.
class function THTTPClient.Create: THTTPClient;
begin Result := THTTPClient(TURLSchemes.GetURLClientInstance('HTTP')); // do not translate end; |
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; |
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 05:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz