AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke IdHTTP Post Request -> dann Zeit abwarten bis Response
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTP Post Request -> dann Zeit abwarten bis Response

Ein Thema von bogdan · begonnen am 26. Jun 2017 · letzter Beitrag vom 11. Mai 2020
Antwort Antwort
Seite 1 von 2  1 2      
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#1

IdHTTP Post Request -> dann Zeit abwarten bis Response

  Alt 26. Jun 2017, 18:11
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

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

  Alt 26. Jun 2017, 18:32
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.
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#3

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

  Alt 26. Jun 2017, 19:08
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.

Trotzdem vielen Dank für deine Hilfe.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

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

  Alt 26. Jun 2017, 19:16
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 26. Jun 2017, 19:33
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.
$2B or not $2B
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

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

  Alt 26. Jun 2017, 19:49
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
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#7

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

  Alt 26. Jun 2017, 22:06
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

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

  Alt 26. Jun 2017, 22:34
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.
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#9

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

  Alt 27. Jun 2017, 13:08
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?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#10

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

  Alt 27. Jun 2017, 13:13
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('{"日本語":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.
Michael Justin
  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 04:47 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