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
bogdan

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

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

  Alt 26. Jun 2017, 21: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
 
#2

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

  Alt 26. Jun 2017, 21: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
 
#3

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

  Alt 27. Jun 2017, 12: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.010 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 27. Jun 2017, 12: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
nahpets
(Gast)

n/a Beiträge
 
#5

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

  Alt 27. Jun 2017, 12:49
Bei meiner Routine kann im HTML.Body schonmal was stehen, wenn ein Fehler auftritt.

Bei manchen Seiten bekommt man nur den Responsecode, manche liefern aber zusätzlich auch eine vollständige Webseite, die auch nochmal die Fehlermeldung enthält.

Es gibt da keine so wirklich immer passende Regel / Verfahrensweise.

Beim Fehlercode 404 (für nicht gefunden) wirft Indy z. B. eine Exception. Ruft man die gleiche Url in 'nem Browser auf, so zeigt der aber gelegentlich eine (nicht selbst generierte) Fehlerseite an.

Es muss also auch bei 'nem Fehler "irgendwo" dieses HTML herkommen, damit der Browser da was anzeigen kann.

Für Deine konkrete Seite eventuell einfach mal in der Fehlerroutine die Werte von allen Eigenschaften von idHTTP ausgeben und da dann schauen, was für Dich zielführend sein könnte.

Ohne Angabe einer "fehlerbehafteten" Url kann ich nicht prüfen, ob meine Routine damit umgehen kann oder sagen, wo für sie ggfls. welche Informationen abrufbar sein könnten.
  Mit Zitat antworten Zitat
bogdan

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

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

  Alt 27. Jun 2017, 13:09
Hallo mjustin,

mit EIdHTTPProtocolException wird der HTML Code ausgegeben.

Bin schon öfters drüber gestolpert aber dann doch erfolgrech ignoriert.

Code:
      on E: EIdHTTPProtocolException do
      begin
        WriteLn(E.Message);
        WriteLn(E.ErrorMessage);
      end;
Jetzt kann ich die Parameter sehen die mir viellecht bei der POST Anfrage weiter helfen könnten.
  Mit Zitat antworten Zitat
JDiegelmann

Registriert seit: 8. Sep 2017
2 Beiträge
 
#7

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

  Alt 11. Mai 2020, 11:46
Peinliche Frage:

in dem Listing wird das VCL Element WebIndex.PrepareHtmlText verwendet?

Um welche Komponente handelt es sich dabei ??? ich habe nichts entsprechendes gefunden.

Vielen Dank.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

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

  Alt 11. Mai 2020, 13:29
Zitat:
dmPascalScript ist ein Datenmodul, dessen Komponenten genutzt werden.
Das Beispiel ist aber mehr als mangelhaft. Schreib besser was eigenes.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:12 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-2025 by Thomas Breitkreuz