![]() |
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: |
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. |
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. |
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? |
AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
Zitat:
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: |
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 ;-) |
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? |
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:
WebIndex ist ein Parser, der den Quelltext der HTML-Seiten in eine Form umwandelt, die eine (halbwegs) automatische Weiterverarbeitung zulässt.
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; 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. |
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? |
AW: IdHTTP Post Request -> dann Zeit abwarten bis Response
Zitat:
![]() 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz