HTTPClient()

Vom Front-End bis SOAP.

Moderator: Moderatoren

Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

HTTPClient()

Beitrag von Dominik Krebs »

Guten Morgen zusammen,
aktuell beschäftige ich mich mit der HTTPClient Klasse. Diese verwende ich auf meiner "Serveranwendung" die immer mal wieder folgenden Code ausführt:

Code: Alles auswählen

LOCAL cResult        := ""
LOCAL oHTTP
LOCAL oJsonResult
LOCAL sHTTPResponse  := ""

         /*
         oHTTP := HttpClient():new( REQUEST_URL )
         oHTTP:httpRequest:setHeader("Content-Type", "application/json; charset=utf-8")
         oHTTP:httpRequest:setMethod( "POST" )
         oHTTP:httpRequest:setContent( json_serialize(oData) )
         oHTTP:setAuthorization( ::URLUsername,::URLPassword )

         IF P_PORTA2_Aktiv = "1"
         sHTTPResponse := oHTTP:send()
         IF oHTTP:getStatusCode() == 200
         FileWrite(cLocalDataPath + "soapResponse.txt", sHTTPResponse)
         cResult := MemoRead(cLocalDataPath + "soapResponse.txt")
         ENDIF
         oHTTP:disconnect()
         ENDIF
         */
Es passiert jedoch sehr häufig das mit meine Anwendung ohne jeglichen Fehler abschmiert. Sozusagen als würde ich ein QUIT setezen.

Führe ich diesen Quelltext in meiner Testumgebung aus, habe ich keinerlei Probleme.
Hat jemand ähnliche Probleme bereits gehabt?

Liebe Grüße aus Hanau !
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Jan »

Hallo Dominik,

gibt es eine xppfatal?

Und mir fällt auf das Du das :send nur in der IF-Schleife machst, aber den HTTPClient grundsätzlich erstellst und konfigurierst. Der ist zwar LOCAL deklariert und damit würde das vermutlich eher nicht stören, aber verwirrend find ich das schon.

Was macht denn Dein json_serialize()? Könnte da ein Problem drin liegen, das der manchmal mit ungültigen Daten gefüttert wird?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Guten Morgen Jan,
Leider gibt es keinen xppfatal.
Mit der IF Schleife hast du natürlch absolut Recht. Die Variable P_PORTA2_Aktiv dient auch mehr zu Testzwecken. Sie ist also zu 99% auf "1".

Möglicherweise lieht der Fehler in json_serialize. Das ist die Klasse von Pablo. Ich meine mich zu erinnern das hier ein Error abgefragt werden kann.

Jedoch wäre das irgendwie komisch, da ich in der Testumgebung keinerlei Probleme habe wenn dieselben Daten versende.

Grüße!
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Jan »

Dominik,

da müssen ja im Livebetrieb nur irgendwelche krummen Daten ankommen, die Du im Testbetrieb unter Beobachtung nicht hast.

Warum benutzt Du die Funktion aus ot4xb? Und nicht die aus Xbase++? Var2Json() und Jason2Var() sind sehr gute Funktionen. Und haben den Vorteil mit DataObjects umzugehen, die wirklich super abzuarbeiten und im Debugger zu betrachten sind.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von brandelh »

Zum Einschränken der Fehlerursache würde ich mal eine EXIT Prozedure erstellen, die Informationen in eine Log Datei schreibt.
Wenn diese Datei erstellt wird, ist das Ende aus Sicht der EXE regulär (daher keine Fatal oder Error Datei),
wenn sie nicht erstellt wird, schmiert das Programm so heftig ab, dass die Runtime nix mitbekommt.
Gruß
Hubert
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Hallo Jan,
anscheinen habe ich nicht ganz die Wahrheit erzählt.
Nun ist es mir auch im Testsystem passiert.
Ich ließ die Funktion in einer FOR Schleife laufen und siehe da, nach ca. 750 Durchläufen ist das Programm einfach abgeschmiert. Wieder, als wäre ein QUIT gesetzt worden. Wieder kein XPPFATAL.
Vor dem Senden der Anfrage habe ich jeweils das Ergebnis von json_serialize in eine Variable, und von dort aus in eine Datei schreiben lassen.
Die letze geschriebene Datei sieht in Ordung aus.

Var2Json() und Jason2Var() habe ich mir noch nie wirklich angschaut. Sie sind auch sehr schlecht beschrieben wie ich finde, oder mir mangelt es an Wissen, diese Funktionen richtig anzuwenden.

Grüße!
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Hallo Hubert,
ich lasse aktuell nochmal eine Schleife laufen in der ich keine Daten per :SetContent sende. Dannach werden ich deinen Vorschlag mal ausprobieren.

Liebe Grüße
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Auch nach intensiven versuchen lässt sich der Fehler in der Testumgebung nicht mehr nachstellen.
Ich werde nun mal die Stelle auf DataObject und Var2Json umbauen und schauen, ob sich somit etwas ändert.
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Auch das hat leider keinen Unterschied gemacht.
Also schließe ich die Daten die gesendet werden mal aus.
Hat denn die HTTPClient Klasse ein bekanntes Problem?
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Irgendetwas ist hier oberfaul.

Ich habe nun alle unnötigen Zeilen herrausgenommen.
Meine Anwendung erleidet den Fehler nach kurzer Zeit, nachdem

Code: Alles auswählen

         oHTTP := HttpClient():new( "https://google.de/" )
         oHTTP:send()
         oHTTP:Disconnect()
aufgerufen wurde.
In der Regel dauert dies 30 Sek. bis 2 minuten. Manchmal kann man diese aber auch mehrmals hintereinander aufrufen.

Hat denn niemand eine Idee?
Zuletzt geändert von Dominik Krebs am Do, 25. Jun 2020 16:05, insgesamt 1-mal geändert.
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Jan »

Dominik,

wenn ich Deine drei Zeilen Code in eine Schleife baue, dann kann ich die beliebig oft laufen lassen ohne Fehler (was ich auch nicht anders erwartet hätte). Und der braucht auch für jeden Durchlauf nur einen Wimpernschlag (was ich ebenfalls nicht anders erwartet hätte). Das muß also irgend etwas an der gesamten Umgebung sein. Das jetzt aber festzustellen ist etwas schwierig.

Du hattest ja schon die Abfrage nach dem :getStatusCode. Bau doch mal da rein das Du auch den :getLastError() oder :getLastMessage() abfragst und jedes mal direkt wegschreibst in eine Datei. Dann kannst Du ja sehen ob da eventuell irgend was schief läuft.

Oder gibt es da eventuell eine Firewall die die Rückgaben nicht durchlässt, und Dein Prozess geht dann in einen Timeout? Sowas könnte dann eventuell auch den Unterschied zwischen Deinem Testsystem und dem realen System erklären.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von brandelh »

die Abfrage im Sekundentakt einer fremden Web Adresse könnte der Server auch als Hacker Angriff deuten und Gegenmaßnahmen einleiten ;-)

Wobei die 3 Zeilen doch mit * versehen sind, ich habe es so verstanden, dass er diese auskommentiert hat.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: HTTPClient()

Beitrag von Werner_Bayern »

Dein HttpClient() - Problem könnte der PDR 7252 sein. Welche Version nutzt Du von Xbase++? Das Leck wurde mit der 1176 gestopft. Aktuell sind auch noch einige PDRs zu HttpClient() offen.
es grüßt

Werner

<when the music is over, turn off the lights!>
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

@Jan
Man sollte auch davon ausgehen können, das dieser Code sich problemlos ausführen lässt.
:getLastError() und :getLastMessage() habe ich nun mit eingebaut. Ich warte gespannt auf die Ergebnisse.
Selbst wenn die Applikation in ein Timeout läuft, sollte ja nicht ein so fataler Absturz daraus resultieren. Jedoch könnte ich mir das mit dem Timeout mal genauer anschauen, und dieses eventuell separat setzen. Eine Firewall gibt es in dieser Form nicht.

@Hubert.
Dies ist auch nur zur Veranschaulichung. Im realen Betrieb frage ich einen Lokalen Webserver in einem viel Höheren, unregelmäßigem Intervall ab, der das nicht aus Bedrohung sieht :D. Die * habe ich vergessen zu entfernen ... UPS =D>

@Werner
Ich verwende Version 2.00.1176. Diese PDR könnte tatsächlich zutreffen. Interessant, Wenn ich das richtig verstehe wurde diese PDR in Version 2.00.1180 behoben? Habe mit den PDR's noch nicht viel zu tun gehabt.

Liebe Grüße
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Jan »

Dominik,

jetzt begebe ich mich auf gefährliches Glatteins.

Ich hatte massive Probleme mit Programmabstürzen, die einen Speicherfehler im Aufruf von HttpClient() verantwortlich machten, immer exakt die gleiche Zeile im Code des HttpClient(). Alaska konnte da aber nichts finden. Das Problem ist seit der 1255 gelöst. Da wurde der Bug im DataObject:copy behoben, der Handles verlor. Ich habe jetzt überhaupt keine Ahnung ob der HttpClient intern mit DataObjects arbeitet. Und daher das Problem kam. Aber wie gesagt - mit der 1255 ist das jetzt halt weg.

Du hast natürlich Recht, das ein Totalabsturz ohne irgend eine Rückmeldung nicht gut ist. Weder für uns noch für Alaska. Aber manchmal ist es tasächlich so das ein Fehler manchmal eine Rückmeldung gibt, und in anderen Situationen nicht. Ist mir selber schon passiert. Zum Glück nur sehr, sehr selten.

Irritierend ist dabei natürlich schon, daß das bei Dir im Test sauber läuft, beim Kunden aber nicht. Dennoch ist es immer gut, die aktuellsten Builds von Xbase++ einzusetzen. Da werden immer irgendwelche Bugs und PDR behoben.

Jan
Zuletzt geändert von Jan am Do, 25. Jun 2020 16:51, insgesamt 1-mal geändert.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Frank Grossheinrich »

Hallo Dominik,
1) weiß unser Support von dem Problem?
2) welche Xbase++ Version setzst du ein? Aktuell ist 1255. Und vorher gab es schon 1185. Damit sollten vorgenannte PDRs keine Rolle spielen.
3) gibt es eine eigene Fehlerroutine in deinem Code?
Grüße, Frank
We love Xbase++, and you?
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Ich habe den support heute davon in Kenntnis gesetzt.
Habe eine Beispielanwendung geschrieben in der ich den Fehler nachstellen konnte. Diese habe ich Alaska zukommen lassen.

Wenn die 1255 die aktuellste Version ist sollte ich natürlich zuerst updaten.
Eventuell ist das Problem ja bereits behoben wie Jan schon sagte.

Ich werde euch spätestens nach dem Update informieren.

@Frank.
Ich verwende Version 1176 und die Standard Fehlerroutine.
Gruß Dominik
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Frank Grossheinrich »

Meeeeeeeeeeensch, du hast doch Support ... dann kontaktiere doch meine Kollegen früher.
Dann wäre auch aufgefallen, dass mit deiner Registrierung etwas nicht stimmt (ich arbeite gerade dran). Dafür kann ich mich nur entschuldigen.
Fortsetzung folgt.

Grüße, Frank
We love Xbase++, and you?
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Hallo Frank,
Super, danke das es jetzt so schnell geklappt hat.
Ich habe mich schon gewundert warum das länger dauert, aber ist überhaupt nicht schlimm.
Habe das Update nun gemacht und der erste Test läuft aktuell, ich bin gespannt.
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Der Fehler ist nach dem Update bis jetzt nicht erneut aufgetaucht.
Ich bin jetzt mal vorsichtig optimistisch und behaupte, es wurde bereits gefixt :D
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Guten Morgen Zusammen,
also der Fehler ist behoben.
Es muss wohl an den verlorenen Handles vom DataObject gelegen haben.
Vielen Dank für eure Hilfe :)
Gruß Dominik
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Frank Grossheinrich »

Hallo Dominik,
danke für die Rückmeldung!
Ich muss mir mal intern den Quelltext von HttpClient() anschauen, aber ich glaube nicht, dass es an den DataObjects gelegen hat.
Wie dem auch sei, Happy Xbase++ing.
Frank
We love Xbase++, and you?
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Frank Grossheinrich »

Hallo Dominik,
habe den HttpClient() untersucht und dort werden zwar DataObjects verwendet, aber nicht in der Art, dass es hier zu Problemen kommen konnte (zumindest nicht wegen PDR oDataObject:copy).
Sprich, dass dein Problem behoben wurde ist eher Kategorie Zufall. Das haben wir nicht wissentlich gemacht. Und das ist für mich nicht akzeptabel.
Somit meine Frage an dich: kannst du mir ein Szenario nennen/geben (in PRG) das dein Verhalten zeigt? Mit Version 117ebbes. So, dass der Prozess abraucht.
Da bitte ich inständig drum. Dann können wir das untersuchen.
Grüße, Frank
We love Xbase++, and you?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HTTPClient()

Beitrag von Jan »

Hallo Frank,

es gibt bei Euch einen Vorgang [#T225357] von mir, der genau dieses Thema betrifft. Ich hatte das oben auch kurz beschrieben. Ich hatte beim Kunden das Problem, das der bei sehr vielen HTTPClient()-Abfragen mit einem Zu wenig Speicher-Fehler ausgestiegen ist. Immer im HTTPClient() Immer in der gleichen Zeile dieser Funktion. Ihr hattet das überprüft und keinen Fehler gefunden. Ich hab die aber am laufenden Band, teilweise mehrmals täglich. In 24/7-Programmen, und auf den Clients mit "normalen" Programmen. Grob geschätzt kam das nach eingen Hundert HTTPClient() Aufrufen, aber das ist vage, da an den Stellen dann auch immer viel mit oDo:copy() gearbeitet wird.

Das hier ist der relevante Teil der Fehlermeldung:

Code: Alles auswählen

Anmeldename         : Service
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: O CLASS:RequestThread
oError:canDefault   : .F.
oError:canRetry     : .F.
oError:canSubstitute: .F.
oError:cargo        : NIL
oError:description  : Nicht gen³gend Speicher
oError:filename     :
oError:genCode      : 15
oError:operation    : init
oError:osCode       : 0
oError:severity     : 2
oError:subCode      : 1005
oError:subSystem    : BASE
oError:thread       : 7
oError:tries        : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von REQUESTTHREAD:INIT(71)
Aufgerufen von HTTPCLIENT:SENDASYNC(1638)
Aufgerufen von HTTPCLIENT:SEND(1512)
Aufgerufen von HOLEFLEXDELIVERYLINK(435)
Aufgerufen von SENDECHANGEDELIVERYLINK(498)
Und mit der 1255 war das schlagartig weg.

Ich hatte Euch damals auch ein Sample geschickt. Das aber zugegebener Maßen nicht so wirklich den Fehler reproduzierte. Das Problem ist das diese HTTPClient()-Abfragen hier alle auf einen internen Server laufen, und den kann ich Euch ja schlecht mitgeben :-D

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HTTPClient()

Beitrag von Dominik Krebs »

Hallo Frank,
Ich habe dir ein PN geschrieben, mit weiteren Infos.
An dieser Stelle erstmal vielen Dank an alle, die sich dem Problem angenommen haben.
Gruß Dominik
Antworten