AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TIdHTTP zu THTTPClient umschreiben, THttpClient ableiten und Get() überschreiben
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von DieDolly · begonnen am 9. Apr 2022 · letzter Beitrag vom 10. Apr 2022
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

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

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

  Alt 9. Apr 2022, 17:09
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 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;

Geändert von DieDolly ( 9. Apr 2022 um 19:03 Uhr)
  Mit Zitat antworten Zitat
TUhr

Registriert seit: 25. Sep 2021
16 Beiträge
 
#2

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

  Alt 9. Apr 2022, 21:03
Bist Du so freundlich das Problem mit IdHTTP (Post und Get) zu erklären, da es bei mir problemlos funktioniert.

Vielen Dank !
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 9. Apr 2022, 21:06
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".

Geändert von DieDolly ( 9. Apr 2022 um 21:10 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 10. Apr 2022, 00:43
Hallo,
wo genau kommt der abstrakte Fehler?
Heiko

Geändert von hoika (10. Apr 2022 um 00:46 Uhr)
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 10. Apr 2022, 08:35
Direkt beim HttpClient.Get().
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 10. Apr 2022, 10:08
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.
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 10. Apr 2022, 10:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 10. Apr 2022, 10:32
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
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, 10: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 12:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 10. Apr 2022, 12:39
[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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr.
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