TFPHttpClient.SimpleGet exception 301

Alle Fragen zur Netzwerkkommunikation
Antworten
Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

TFPHttpClient.SimpleGet exception 301

Beitrag von Winni »

Hi!

Nach 15 Jahren Pause möchte ich wieder in die Welt von http und html einsteigen.

Mein erster Test wurde von hier entnommen:

https://wiki.freepascal.org/fphttpclient

Code: Alles auswählen

writeln(TFPHttpClient.SimpleGet('https://freepascal.org'));


Das knallt gleich einmal mit exception EHTTPclient 301

Falls 301 ein httpError ist bedeuted das "Moved Permanently"

Kann mir jemand einen Tipp geben, wie man um die httpError herum programmiert?

Den Spiegel in HTML lesen, geht problemlos:

Code: Alles auswählen

memo1.Lines.Text:= TFPHttpClient.SimpleGet('https://www.spiegel.de'); 

Grüße
Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von sstvmaster »

Das sollte helfen:

Code: Alles auswählen

http.AllowRedirect := true;
http.Get('https://freepascal.org');
Bei SimpleGet funktioniert das manchmal nicht, siehe: https://forum.lazarus.freepascal.org/in ... #msg301704
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von Winni »

Hi!

"http" mag der Compiler nicht.

In welcher unit steht den "http"??

Ich habe bisher nur fphttpclient und opensslsockets eingebunden.

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von sstvmaster »

Ach Winni.

Code: Alles auswählen

...
procedure TForm1.Button1Click(Sender: TObject);
var
  http: tfphttpclient;
begin
  Memo1.Clear;
  Memo2.Clear;

  http := tfphttpclient.Create(nil);
  try
    try
      http.AllowRedirect := checkbox1.Checked;
      Memo1.Lines.Text:= http.Get(Edit1.Text);
      Memo2.Lines := http.ResponseHeaders;
      Statusbar1.Panels[0].Text := 'E: ' + http.ResponseStatusText;
      Statusbar1.Panels[1].Text := 'Code: ' + http.ResponseStatusCode.ToString;
    except
      on E: EHttpClient do
      begin
        Memo2.Lines := http.ResponseHeaders;
        Statusbar1.Panels[0].Text := 'E: ' + E.Message;
        Statusbar1.Panels[1].Text := 'Code: ' + http.ResponseStatusCode.ToString;
      end
      else
        raise;
    end;
  finally
    http.Free;
  end;
end;
...
Dateianhänge
project1.zip
(105.88 KiB) 96-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von Winni »

Ach sstvmaster!

Hab vielen Dank!
Nun hab ich den Einstieg!!

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von sstvmaster »

:wink: :lol:
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von Warf »

Das interresante hierbei ist, ein Redirect (HTTP error codes 3XX) gibt die Redirekt Addresse über ein Headerfeld zurück. die HTTPClient implementierung scheint allerdings keine Möglichkeit zu bieten darauf über die Exception zuzugreifen, und eventuell den Redirect manuel zu handlen. Man kann zwar das OnRedirect Event setzen, das wird aber nur ausgeführt wenn man AllowRedirects auf True setzt, und automatisch redirects gefolgt wird. Wenn man also manuell redirects handlen will, z.B. manchen, denen man vertraut, folgen aber unbekannten nicht, muss man das machen indem man im OnRedirect eine eigene Exception wirft die man dann beim Get fängt.

Das sieht mir nach einem deutlich überkomplizierten Flow aus um so etwas simples zu machen. Mal ganz davon abgesehen das man andere Headerfelder, die ja wichtige informationen für das weitere Vorgehen halten können (nicht nur bei Redirects, sondern auch bei anderen Return codes, HTTP header sind ja erweiterbar und z.B. eine REST API könnte informationen als custom header einbauen) bei Exceptions nicht auslesen kann. Das limitiert die Nutzung doch ziemlich, da wichtige Informationen dabei einfach verloren gehen.

Das sollte eventuell angepasst werden, sodass die Exception die originale HTTP Response enthält

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von Winni »

Hi!

Also sstvmaster hat mir erstmal den Einstig gegeben und die 300er Error werden brav automatisch umgebogen, wenn AllowRedirect auf true gesetzt ist.

Was soll man da noch in den in den ResponseHeaders rumwühlen. Machen die Browser das? Ich schätze nicht.

Die ganze www-Welt ist doch sowieso eine überzüchtete Bruchbude. Einst zum Dokumenten-Austausch unter Wissenschaftlern erfunden und dann immer noch was rangeschraubt. Und noch was. Und noch was. Css. Media. JavaScript. Java. VW-Käfer mit Porsche-Motor.

Aber es bringt Spaß, mal wieder auf diesem Gebiet unterwegs zu sein.

Winni

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von Warf »

Winni hat geschrieben:
Fr 11. Mär 2022, 01:20
Also sstvmaster hat mir erstmal den Einstig gegeben und die 300er Error werden brav automatisch umgebogen, wenn AllowRedirect auf true gesetzt ist.
Der Browser muss ein paar Header checken, z.B. die CORS (Cross Origin Resource Sharing), damit können Websites angeben von welchen anderen Websites sie intern aufgerufen werden dürfen. Das muss bei jeder Response gecheckt werden, egal ob es ein success oder Fehler oder Redirect ist.

Aber HTTP wird ja nicht nur fürs web verwendet sondern auch sehr viel für REST APIs. REST ist im Grunde eine erweiterung der WWW Architektur von Dokumente die für Menschen lesbar und navigierbar sind auf Maschienenlesbare dokumente und Navigationen. Und hier muss, im Gegensatz zu websites die von sehr generischen Programmen (Browsern) gelesen werden muss, können hier mehr Freiheiten genommen werden, da die Clienten meistens spezialisiert für diese APIs entwickelt werden. Das erlaubt HTTP für diese Fälle zu erweitern, und HTTP erlaubt das durch das setzen beliebiger Header im "Key: Value" format.

Das ist etwas was man nicht sehr oft braucht, aber die Möglichkeit sowas zu handhaben in den Fällen in denen man es braucht wäre definitiv nützlich

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TFPHttpClient.SimpleGet exception 301

Beitrag von sstvmaster »

Hier hatte wp auch mal eine ähnliche Frage zu den Exceptions im tpfhttpclient.
https://fpc-devel.freepascal.narkive.co ... -to-server
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Antworten