Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdHTTP Post Request -> dann Zeit abwarten bis Response (https://www.delphipraxis.net/193147-idhttp-post-request-dann-zeit-abwarten-bis-response.html)

bogdan 26. Jun 2017 17:11

IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Mit IdHTTP.Get und den dazugehörigen Header + Body Angaben setze ich ein Request an eine bestimmte Seite ab.

Zu 95% der Abfragen bekomme ich auch den korrekten Response.

Ab und zu aber kommt die Exception: HTTP/1.1 503 Service Temporarily Unavailable
Ich habe den Aufruf der Seite manuell im TWebBrowser mehrmals ausprobiert.
Im WebBrowser konnte ich dann sehen, dass ab und zu als erstes eine "Vorschau" Seite angezeigt wird, die zb. 5 Sekunden Werbung schaltet und als Response im HTML Code ein 503 Error ausgibt.
Wartet man die 5 Sekunden ab, dann wird die korrekte Seite im WebBrowser angezeigt.

Wie bekomme ich es mit der IdHTTP Komponente das Problem in den Griff, dass der Response der korrekten Seite geladen wird?
Gibt es sowas wie ein "Wait Time Until Response After Request" Parameter? :gruebel:

nahpets 26. Jun 2017 17:32

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
In der Fehlerbehandlung diese Meldung HTTP/1.1 503 Service Temporarily Unavailable bzw. ResponseCode = 503 separat behandeln, wenn der Fehler Auftritt Sleep(5000) und dann nochmal versuchen.

Oder eine Seite, die nicht zum automatischen Auslesen gedacht ist, nicht automatisch auslesen.

bogdan 26. Jun 2017 18:08

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Sleep habe ich auch schon ausprobiert. Leider ohne Erfolg, da die Werbe-Seite JavaScript zum weiterladen nutzt.

Wenn die Seite nicht für den automatisierten Zugriff gedacht wäre, dann dürften die restlichen 95% auch nicht funktionieren, deshalb denke ich nicht daß es das Problem ist.

Man will wohl eher den Nutzer zum Werbung schauen zwingen. :cry:

Trotzdem vielen Dank für deine Hilfe.

nahpets 26. Jun 2017 18:16

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Zwischendurch Werbunganschauzwang ist gleichbedeutend mit: Kann man nicht automatisch auslesen, weil: Man weiß nicht, was man da bekommt.

Hast Du HandleRedirects auf True gesetzt?
Wie steht es in dem Zusammenhang mit RedirectMaximum?

himitsu 26. Jun 2017 18:33

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Zitat:

Zitat von nahpets (Beitrag 1375398)
bestimmte Seite

Die Seite ist wohl so geheim oder es ist eigentlich garnicht erlaubt diese Seite automatisiert auszulesen, dass sie hier verheimlicht wird?

Man wird es nicht glaubt, aber wenn es explizit erlaubt wäre, dann würden sogar viele Webseiten eine ordentliche API anbieten, wo man ganz einfach an die gewünschten daten kommt. :stupid:

nahpets 26. Jun 2017 18:49

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Prinzipiell hast Du recht.

Hab' ab und an auf meinem Rechner auch mal 'nen Webserver laufen, nur für die lokale Nutzung.

Und solange ich den Rechner nicht so richtig abgesichert hatte, hab' ich im Log des Webservers auch schonmal Tante Google gefunden, die meinte, da mal den Links folgen zu müssen.

Es gibt in dieser Welt aber keinen Link, der irgendwie auf meinen Rechner verweist. Weder hab' ich 'ne Domaine noch hat mein Rechner 'ne feste IP-Adresse. Trotzdem hat die Googleline ihn gefunden :-(

Dasher mal unverschämt von mir die Behauptung: Was Tante Google darf, darf auch der Rest der Welt ;-)

Also lese jeder jeden ungefragt aus und sammle dessen Daten (und vermarkte sie wenn möglich mit größtmöglichem Gewinn), es leben der Datenschutz :-(

Und laut Threadtitle werden Daten per Post verarbeitet, da könnte sich ja dann gerade mal wieder ein Spambot in der Entwicklung befinden ;-)

bogdan 26. Jun 2017 21:06

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Hallo an Alle,

zuerst einmal vielen Dank für die zahlreichen Antworten in so einer kurzen Zeit.

Was mir schon aufgefallen ist, dass ab und zu ein Thema/Frage irgendwie ausufert, weil man gleich Spambots, DDOS Attacken, bösartige Apps, etc. vermutet.
Ja, es gibt Menschen, die Ihre Zeit damit vergeuden Anderen zu schaden.

Hier handelt es sich tatsächlich um die "Anderen" und damit keine wilden Spekulationen weiter vermutet werden, möchte ich in diesem Punkt etwas Licht ins Dunkle bringen.
Es handelt sich um illegale Filehoster URLs, die weiter an eine Anwaltskanzlei geleitet werden sollen.

Falls Jemand noch weitere Fragen hat, kann mich per PM anschreiben.
Ansonsten würde ich gerne an dem Hauptthema weiter arbeiten wollen, wenn das für euch ok ist?

Es gibt eine HTTPSend Komponente von Synapse, die den Sourcecode der fehlermeldenden Seite ausgeben kann, also nicht nur die Exception. Da das Programm aber schon mit zahlreichen Code der IdHTTP Compo belastet ist, möchte ich ungern auf eine neue Compo dem Code umschreiben. Zudem scheint die Synapse Compo nicht unter XE8 zu funktionieren.

Ist es vielleicht möglich mit der IdHTTP Compo den Quelltext der fehlermeldenden Seite auszugeben anstatt der Exception?

nahpets 26. Jun 2017 21:34

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Ok, die Aufgabenstellung klingt vernünftig, da hab' ich dann nix mehr zu meckern ;-)

Hier ein Quelltext, den ich für idHTTP.Get nutze, mit ein bisserl Fehlertoleranz:
Delphi-Quellcode:
function MyHTTPGet(sURL : String; slHTML : TStrings; slAHRef : TStrings; var sMessage : String; iRedirect : Integer) : Boolean;
var
          iError : Integer;
begin
  Result  := False;
  sMessage := 'ok';
  dmPascalScript.WebIndex.Clear;
  slHTML.Clear;
  slAHref.Clear;
  iError := 0;
  repeat
    try
      dmPascalScript.http.RedirectMaximum := iRedirect;
      dmPascalScript.http.HandleRedirects := iRedirect <> 0;
      dmPascalScript.WebIndex.HTML.Add(dmPascalScript.http.Get(sUrl));
      dmPascalScript.http.Disconnect(True);
      dmPascalScript.http.IOHandler.InputBuffer.Clear;
      Result := True;
    except
      on e : Exception do begin
        sMessage := AnsiReplaceText(e.Message,#13#10,' ');
        if e.Message = 'Connection Closed Gracefully.' then begin
          Inc(iError);
        end else begin
          iError := MaxInt;
          case dmPascalScript.http.ResponseCode of
            301, 302 : begin
                    dmPascalScript.PSReg.WriteAppLog(Format('Scriptaufruf : HTTPGet(%s)',[sUrl]));
                    dmPascalScript.PSReg.WriteAppLog(Format('Fehlermeldung: %s',[sMessage]));
                    dmPascalScript.PSReg.WriteAppLog(Format('Location    : %s',[dmPascalScript.http.Response.Location]));
                  end;
          else
            dmPascalScript.PSReg.WriteAppLog(Format('Scriptaufruf : HTTPGet(%s)',[sUrl]));
            dmPascalScript.PSReg.WriteAppLog(Format('Fehlermeldung: %s',[sMessage]));
            dmPascalScript.PSReg.WriteAppLog(Format('ResponseCode : %d',[dmPascalScript.http.ResponseCode]));
          end;
        end;
        dmPascalScript.http.Disconnect(True);
        dmPascalScript.http.IOHandler.InputBuffer.Clear;
      end;
    end;
  until Result or (iError > 4);
  if Result then begin
    dmPascalScript.WebIndex.PrepareHtmlText;
    dmPascalScript.WebIndex.GetHeader;
    dmPascalScript.WebIndex.GetBody;
    dmPascalScript.WebIndex.GetAHRef;
    slHTML.AddStrings(dmPascalScript.WebIndex.HTML);
    slAHRef.AddStrings(dmPascalScript.WebIndex.AHRef);
  end;
end;
WebIndex ist ein Parser, der den Quelltext der HTML-Seiten in eine Form umwandelt, die eine (halbwegs) automatische Weiterverarbeitung zulässt.

dmPascalScript ist ein Datenmodul, dessen Komponenten genutzt werden.

slHTML enthält den aufbereiteten Inhalt der Webseite, slAHref enthält alle in der Webseite gefundenen Links.

Die Routine selbst wird über Pascalscript aus 'nem Programm aufgerufen, dass u. a. der automatischen Auswertung von Webseiten dient.

In dem Case-Block könntest Du dann eventuell noch die 503 abfragen. und da ein Sleep einbauen.

Schau mal bitte, ob der von Dir gesuchte Inhalt eventuell in idhttp.ResponseText zu finden ist. idHTTP.ResponseCode müsste die 503 enthalten.

Hast Du mal geschaut, ob in der Variabel, in die Du mit idHTTP.Get('url') den Inhalt der Webseite bekommen kannst, nicht auch im Fehlerfalle was drinne steht.

Hier im Beispiel müsste dann der Quelltext der Fehlerseite in slHTML zu finden sein.

bogdan 27. Jun 2017 12:08

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Hallo nahpets,

habe mal deinen Ansatz ausprobiert, leider ohne Erfolg.

Unabhängig von der Seite, welche geladen wird, ist der Response.Text einer Exception bei IdHTTP.GET oder IdHTTP.POST immer nur eine "kurze" e.message.
Deshalb kann ich mir nicht vorstellen, dass in deinem Code im dmPascalScript.WebIndex.HTML bei einer Exception ein HTML Code geladen wird.

Kann das wirklich sein oder gibt es beim IdHTTP.Request einen Parameter, welcher vor der Abfrage eingestellt werden muss, damit der HTML "Error"-Code trotzdem angezeigt wird?

mjustin 27. Jun 2017 12:13

AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
 
Zitat:

Zitat von bogdan (Beitrag 1375407)
Ist es vielleicht möglich mit der IdHTTP Compo den Quelltext der fehlermeldenden Seite auszugeben anstatt der Exception?

Ja, zum Beispiel wie hier: https://mikejustin.wordpress.com/201...-6-https-post/

Bei einer EIdHTTPProtocolException steht der HTML Body in ErrorMessage.

Delphi-Quellcode:
program JSONPostExample;
 
{$APPTYPE CONSOLE}
 
uses
  IdHTTP, IdGlobal, SysUtils, Classes;
 
var
  HTTP: TIdHTTP;
  RequestBody: TStream;
  ResponseBody: string;
begin
  HTTP := TIdHTTP.Create;
  try
    try
      RequestBody := TStringStream.Create('{"&#26085;&#26412;&#35486;":42}',
        TEncoding.UTF8);
      try
        HTTP.Request.Accept := 'application/json';
        HTTP.Request.ContentType := 'application/json';
        ResponseBody := HTTP.Post('https://httpbin.org/post',
          RequestBody);
        WriteLn(ResponseBody);
        WriteLn(HTTP.ResponseText);
      finally
        RequestBody.Free;
      end;
    except
      on E: EIdHTTPProtocolException do
      begin
        WriteLn(E.Message);
        WriteLn(E.ErrorMessage);
      end;
      on E: Exception do
      begin
        WriteLn(E.Message);
      end;
    end;
  finally
    HTTP.Free;
  end;
  ReadLn;
  ReportMemoryLeaksOnShutdown := True;
end.


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