Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi System.Net.HTTPClientComponent (https://www.delphipraxis.net/212095-system-net-httpclientcomponent.html)

Detlev 16. Dez 2022 15:25

System.Net.HTTPClientComponent
 
Ich nutze Delphi 10.2 Tokyo und versuche gerade, einfache Methoden für den Zugriff über https:// zu finden.

System.Net.HTTPClientComponent war mir bisher unbekannt. Ich habe hier zwei Versuche, die beide nicht funktionieren. Die Dokumentation ist dazu furchtbar dürftig.

Delphi-Quellcode:
procedure TForm1.SpeedNETGet2Click(Sender: TObject);
var
  AHTTPClient    : TNetHTTPClient;
  AResponseStream : TMemoryStream;
begin
  AHTTPClient := TNetHTTPClient.Create(nil);
  AResponseStream := TMemoryStream.Create;

  MemoGetSSL2.Text := AHTTPClient.Get('https://de.wikipedia.org/wiki/Wikipedia:Hauptseite', AResponseStream).ContentAsString;

  AResponseStream.Free;
  AHTTPClient.Free;
end;
SpeedNETGet2Click crasht bei https mit ENetHTTPCertificateException "Serverzertifikat ungültig oder nicht vorhanden", aber funktioniert mit normalen http-Seiten.

Was mache ich falsch?

Unterstützt die Komponenten überhaupt https?

Detlev 16. Dez 2022 15:47

AW: System.Net.HTTPClientComponent
 
Habe die Originalfrage gekürzt auf das verbliebende Unwissen. Habe gerade herausgefunden, dass man THTTPRequest mit einem THTTPClient verbinden muss. Dann frage ich mich aber: Was soll das? Hat jemand darauf eine Antwort, warum man dann nicht gleich den HTTPClient verwendet, sondern umständlich einen HTTPRequest verbindet?!

Wie auch immer, https funktioniert so nicht, http aber schon. Die zentrale Frage bleibt also.

Delphi-Quellcode:
procedure TForm1.SpeedNETGetClick(Sender: TObject);
var
  AHTTPRequest   : TNetHTTPRequest;
  AHTTPClient    : TNetHTTPClient;

  AResponseStream : TMemoryStream;
  AString        : String;
begin
  AHTTPClient    := TNetHTTPClient.Create(nil);

  AHTTPRequest   := TNetHTTPRequest.Create(nil);
  AHTTPRequest.Client := AHTTPClient;

  AResponseStream := TMemoryStream.Create;

  MemoGetSSL2.Text := AHTTPRequest.Get('http://squarenmr.com', AResponseStream).ContentAsString;

  AResonseStream.Free;
  AHTTPRequest.Free;
  AHTTPClient.Free;

Uwe Raabe 16. Dez 2022 15:53

AW: System.Net.HTTPClientComponent
 
Für einen simplen Abruf einer Seite kann man natürlich gleich den Client verwenden. In der Regel sind die Anforderungen aber deutlich komplexer und lassen sich mit einem Client und mehreren Requests flexibler gestalten.

Detlev 16. Dez 2022 16:03

AW: System.Net.HTTPClientComponent
 
OK, danke. Habe inzwischen herausgefunden, dass die TNEThttpClient-Sache als Komponente auf einem Formular gedacht sind und man ebenso gut auch THTTPClient direkt verwenden kann, ohne Komponenten-Wrapper. Das war mir vorher nicht klar.

Trotzdem bleibt die entscheidende Frage, wie man ggf. https zum Laufen bekommt.

Uwe Raabe 16. Dez 2022 16:31

AW: System.Net.HTTPClientComponent
 
Also hier läuft das ohne Probleme (mit einfacherer Lösung für Stream zu String):
Delphi-Quellcode:
var
  AHTTPClient : TNetHTTPClient;
  AResponseStream : TStringStream;
  AString : String;
begin
  AHTTPClient := TNetHTTPClient.Create(nil);
  try
    AResponseStream := TStringStream.Create;
    try
      AHTTPClient.Get('https://de.wikipedia.org/wiki/Wikipedia:Hauptseite', AResponseStream);
      AString := AResponseStream.DataString;
    finally
      AResponseStream.Free;
    end;
  finally
    AHTTPClient.Free;
  end;
  Memo1.Text := AString;
end;

Detlev 16. Dez 2022 16:43

AW: System.Net.HTTPClientComponent
 
Bei dir läuft das?! Das ist ja verdammt seltsam. Bei mir wirft es den Zertifikatsfehler.

Uwe Raabe 16. Dez 2022 16:50

AW: System.Net.HTTPClientComponent
 
Kannst du denn die URL im Browser aufrufen? Auch in verschiedenen?

mjustin 16. Dez 2022 17:30

AW: System.Net.HTTPClientComponent
 
Zitat:

Zitat von Detlev (Beitrag 1516340)
Bei dir läuft das?! Das ist ja verdammt seltsam. Bei mir wirft es den Zertifikatsfehler.

Das ist möglich, weil das Zertifikat über den Windows Zertifikatsspeicher geprüft wird. Fehlt dort ein Root-Zertifikat, kann zu diesem Server weder über einen Browser noch über eine andere Anwendung, die diesen Zertifikatsspeicher verwendet, eine gesicherte Verbindung hergestellt werden.

Manche Browser wie z.B. Firefox verwenden einen eigenen Zertifikatsspeicher, daher kann damit ein Verbindungsaufbau funktionieren der mit einem anderen Browser nicht funktioniert (und umgekehrt).

System.Net.HTTPClient hat anscheinend eine Property in der Informationen zu fehlgeschlagenem Verbindungsaufbau stehen können: SecureFailureReasons

https://docwiki.embarcadero.com/Libr...FailureReasons

Eventuell steht darin etwas Hilfreiches.

(Quelle: https://stackoverflow.com/a/71507061/80901)

Detlev 16. Dez 2022 18:01

AW: System.Net.HTTPClientComponent
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1516341)
Kannst du denn die URL im Browser aufrufen? Auch in verschiedenen?

Klar kann ich Wikipedia in jedem Browser öffnen... das muss an der Implementation in Delphi liegen.

Uwe Raabe 16. Dez 2022 21:52

AW: System.Net.HTTPClientComponent
 
Oder an den am Ende verwendeten Windows-Funktionen.

Aber an Delphi liegt es ja offenbar nicht, sonst würde es ja bei mir auch nicht funktionieren. Ich habe es extra auch mit 10.2 versucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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