TFPHTTPClient Get, Exception "404"

Rund um die LCL und andere Komponenten
Antworten
Ekkehard
Beiträge: 12
Registriert: So 12. Feb 2023, 12:42

TFPHTTPClient Get, Exception "404"

Beitrag von Ekkehard »

Hallo,
ich versuche mittels der Methode "Get" des TFPHTTPClient den Inhalt von Seiten der deutschen Wikipedia zu laden.
Dabei ergibt sich ein seltsames Verhalten der Methode Get, wobei ich mir nicht sicher bin, ob es ursächlich an der Methode liegt.

Vorab, ein Abruf einzelner Artikel wie z.B.

Code: Alles auswählen

  Memo1.Lines.Text := TFPHTTPClient.SimpleGet('https://de.wikipedia.org/wiki/Lazarus_(Entwicklungsumgebung)');
funktioniert, d.h. es handelt sich nicht um ein generelles Problem zwischen Software und Server.
Was aber nicht geht, sind Aufrufe von "dynamischen" Seiten, wie der Startseite oder Kategorieseiten.

Code: Alles auswählen

   Memo1.Lines.Text := TFPHTTPClient.SimpleGet('https://de.wikipedia.org/wiki/Wikipedia:Hauptseite');     
Löst entsprechend eine Exception aus "Unexpected response status code: 404."
Gleiches passiert bei

Code: Alles auswählen

    Memo1.Lines.Text := TFPHTTPClient.SimpleGet('https://de.wikipedia.org/wiki/Kategorie:Free_Pascal');   
Man kann aber Kategorieseitenn auch über einen anderen Link aufrufen, d.h. man ruft index.php plus Parameter ab.
Und da wird es dann seltsam, denn die folgende Zeile funktioniert:

Code: Alles auswählen

    Memo1.Lines.Text := TFPHTTPClient.SimpleGet('https://de.wikipedia.org/w/index.php?title=Kategorie:Free_Pascal');
Ganz merkwürdig wird es, wenn man Seiten mit einer Umleitung aufruft. So führt z.B. der Aufruf von
https://de.wikipedia.org/w/index.php
über eine Umleitung (Antwort 301) zur Hauptseite der Wikipedia.
Implementiert man nun eine Instanz von TFPHTTPClient und erlaubt die Weiterleitung, so kommt offensichtlich die Antwort mit der Umleitung an und der folgende Aufruf zur umgeleiteten Seite schlägt dann fehl.

Natürlich funktionieren alle verwendeten Links im Browser.
Zunächst dachte ich, dass Wikipedia den unbekannten "Browser" ausschließt, aber ein Eintrag

Code: Alles auswählen

    lPHTTPClient.AddHeader('User-Agent', 'Mozilla/5.0');
ändert am Verhalten nichts.
Ich vermutete auch, dass die Komponente vielleicht den ":" in einen anderen Code konvertiert, weil sie dieses Zeichen als unzulässig in der Pfadangabe der URL ansieht, aber beim Aufruf zu einem lokalen Server, sieht man in dessen log, dass dem nicht so ist.

Kennt jemand ein solches Verhalten oder hat Ideen, was man noch probieren könnte?
Viele Grüße
Ekkehard

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TFPHTTPClient Get, Exception "404"

Beitrag von theo »

Der Doppelpunkt schmeckt dem anscheinend dort nicht.
Probier mal so:

Code: Alles auswählen

uses ...opensslsockets, fphttpclient, httpprotocol;  
...
Memo1.Lines.Text :=  TFPHTTPClient.SimpleGet('https://de.wikipedia.org/'+HTTPEncode('wiki/Wikipedia:Hauptseite'));    
Das ist natürlich nicht die Lösung, aber es zeigt, wo das Problem liegt.
S.a. https://de.wikipedia.org/wiki/URL-Encod ... arstellung

Antworten