HTTPClient()

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
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:

HTTPClient()

Beitrag von Jan »

Hallo,

hat irgendwer sich schon mit der neuen Klasse beschäftigt und kann mir da ein wenig auf die Sprünge helfen.

Mein eigentliches Problem hatte ich ja schon geschildert: Ich arbeite mit einer externen Online-Datenbank. Und kann dort Daten abfragen oder speichern (bestehende Daten ändern oder komplett neu anlegen). Das habe ich immer über Sockets gemacht, was tadellos lief. Nun haben die Datenbankbetreiber irgend was geändert, und nun bekomme ich zum Abschluß der Rückgaben keine Nachrichtenende-Zeichen mehr. Heißt: Ich bekomme die gewünschte Antwort zurück, laufen dann aber im Anschluß an die Übertragung in ein Timeout. Also korrekte und vollständige Nachricht, aber durch das mehrmenütige Warten auf den automatischen Timeout dauert ein ein klein wenig arg lange. Ich habe das dann auf LoadFromUrl() umgeschrieben. Was absolut simpel und sauber funktioniert. Bis auf zwei Mangelpunkte: Das kann keine Methode DELETE, und bei komplexeren Sachen wie das Speichern eines kompletten Satzes in der Datenbank zickt der rum, ich bekomme das nicht hin.

Also dachte ich, das ich das mal mit der neuen HTTPClient() versuche. Mir fehlt da aber irgendwie ein wenig Fundament zu. Ich bekomme damit nicht mal eine einfache simple GET-Abfrage hin. Egal was ich mache, ich bekomme immer einen :getStatusCode() -1 hin.

Die Samples in der Doku geben zwar den Ansatz von Erleuchtung, aber ganz offensichtlich nicht genug für mich.

Was ich alles in der Socket-Version nutze (nicht immer alles, aber all das kommt irgendwo mal vor):
  • Das geht grundsätzlich auf HTTPS inkl. SocketNegotiateSSL(nSocket)
  • Methode (GET, POST, DELETE)
  • Content-Type
  • User-Agent
  • Host
  • Accept
  • Accept-Language
  • Authorization
  • Cache-Control
  • Content-Lenght
  • X-Reason
  • Als Parameter einen XML-String, abgetrennt vom Rest durch eine Leerzeile
Sehr sicher werde ich davon nicht mehr alles benötigen. Aber wie gesagt, selbst minimale Anfragen mit einem GET scheitern bei mir. Von daher bin ich für jede Erklärung dankbar.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPClient()

Beitrag von ramses »

Hallo Jan

am besten schaust du dir die Kommunikaton beliebiger Webseiten im Debugger an (Firefox Taste F12) da kannst du die nötigen Header Infos (meist werden da nur die nötigen gesetzt) ansehen. Nichts anderes sind deine erwähnten Werte die im Header/Kopf jeder HTTP Anforderungen und Antworten stehen. Eine Detalierte Beschreibung findest du in der RFC2616. Auch die Statuscodes sind da beschrieben. Bei HTTP gibts aber nur Status-Codes ab 100.

Wenn du noch die Wahl hast empfehle ich dir unbedingt Xb2.net zu verwenden und dir nicht in die Alaska-Klassen-Zwangsjacke anzuziehen. Mit xb2.net müsstest du dich meist auch nicht um HTTP-Header's kümmern

Gruss Carlo
Valar Morghulis

Gruss Carlo
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 »

Carlo,

Xb2.Net ist keine Alternative.

Und ich weiß, wie ich all die Parameter mit den Sockets in Xbase++ umsetzen muß. Das klappt ja schon seit ca. 3 Jahren. Ich muß aber wegen der beschriebenen Probleme auf den neuen HTTPClient() umsteigen, und da steige ich einfach nicht dahinter, wie ich das damit umsetzen kann/muß.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPClient()

Beitrag von ramses »

Hallo Jan

Schade. Aber auch mit den Sockets müsste es gehen. Du bekommst doch als erstes den Header der dir die Nachrichtenlänge angibt. Damit weisst du doch wieviele Bytes länge die Meldung hat...... Es ist halt schwierig einen Tip zu geben ohne das Beispiel zu sehen.

Gruss Carlo
Valar Morghulis

Gruss Carlo
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 »

Carlo,

der Hinweis auf die Content-Length war gut. Dumm nur: Bei den Antworten, wo ich ohnehin nicht in den Timeout laufe, gibt es da eine Angabe. Aber da, wo ich minutenlang warten "darf", da ist der Wert 0. Hilft also nicht wirklich weiter.

Ich könnte DIr gerne ein Beispiel zusenden. Weiß aber nicht, ob das wirklich zielführend wäre. Denn ich möchte ja einfach nur verstehen wie die HTTPClient()-Klasse fuktioniert mit den Bestandteilen, die ich aufgelistet habe.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPClient()

Beitrag von ramses »

Hallo Jan

ja wenn Content-Length 0 ist kommt auch nicht mehr eben 0 = Nichts, Wenn du da wartest, wartest du auf nichts und du musst warten bis das Timeout abgelaufen ist und dies die warterei beendet. Das ist ja der Sinn der Längenangabe dass du zählenkannst wann du alles empangen hast und kein Timeout benötigts.

Wo hast du denn die HTTPClient() Klasse gefunden?

Gruss Carlo
Valar Morghulis

Gruss Carlo
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 »

ramses hat geschrieben: Fr, 22. Dez 2017 22:39Wo hast du denn die HTTPClient() Klasse gefunden?
Moin Carlo,

Xbase++ 2.0.875. Hat Alaska als Ablösung von LoadFromUrl() geschaffen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HTTPClient()

Beitrag von ramses »

Guten Morgen Jan

tatsächlich, ich bin Paff!!
Und die Klasse scheint einfach anzuwenden und ist sogar Dokumentiert, was ist nur geschehen?!? Wunder?

Auch dein Stautuscode -1 ist beschrieben bezw. wie du weitere Infos dazu abfragen kannst.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

Re: HTTPClient()

Beitrag von BJelinek »

Hallo zusammen,

versuche auch den HTTPClient einzusetzen, um
eine Datei von meiner Homepage zu laden.

Funktioniert auch wunderbar mit dem in der Hilfe gezeigten Beispiel.

Gibt es eine Möglichkeit das Datei-Datum auf der Domain vorher auszulesen um
es zu vergleichen, ob ich die Datei überhaupt herunterladen muß.

Für einen Tip wo ich suchen muss oder wie es geht freue ich mich sehr.
Grüße
Bernd

Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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 »

Servus Bernd,

warum nicht per FTP? Dann wäre
FTPClient:directory()
Dein Freund...
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

Re: HTTPClient()

Beitrag von BJelinek »

Servus Werner,

klar get FTP. Danke für den Tip.

Muss aber Benutzerwaltung usw. verwendet werden.

Bisher verwende ich wget, da geht so was.
Bin halt beim Schauen was mit HTTPClient() so geht.
Dachte, wenn wget das kann, geht es vieleicht auch mit HTTPClient()
Grüße
Bernd

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 »

wie gibt denn WGET dem Server bekannt, dass es nur neuere Dateien als z.B. MeinDatum haben will ?

Eventuell gibt es da Schlüsselwörter die man abfragen kann.
Gruß
Hubert
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 »

Seit Alaska den FTPClient() aufgebohrt hat Ende vergangenen Jahres kann man sowas recht einfach damit machen. Einfach das Directory() einlesen, und dann entsprechend nur die neueren Dateien ausfiltern.

Mit dem HTTPClient() hatte ich auch so meine Kämpfe. Seit einer gemeinsamen Action auf unsrem letzten XUG-Treffen läuft das aber schon wesentlich besser. Es scheint aber so als ob da noch ein paar Bugs drin sind. Zu einem gibt es sogar eine PDR bei Alaska.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

Re: HTTPClient()

Beitrag von BJelinek »

Hallo zusammen,

Es geht mit HTTPClient was ich wollte.
Dank schneller Hilfe vom ALASKA Support.
Anfrage 16:00 gestellt Antwort um 19:45 erhalten. =D>

Das finde ich echt supper, und sollte mal erwähnt werden.

Die Lösung sieht ungefähr so aus.

Code: Alles auswählen


// Create the client accessing the file.
oHC := HttpClient():new( "http://www.DeineDomain.de/test.exe" )

// Retrieve the headers only. Check the "last-modified" header
oHC:setMethod( "HEAD" )
oHC:send()

// Als Info kann man folgendes Abrufen
aHeader := oHC:HttpResponse:getHeaders()
// Dann kommt sowas zurück

{{Connection, Keep-Alive}, {Date, Mon, 19 Feb 2018 21:22:17 GMT}, {Keep-Alive, t
imeout=2, max=1000}, {Content-Length, 14789680}, {Content-Type, application/x-ms
dos-program}, {Last-Modified, Wed, 14 Feb 2018 18:02:46 GMT}, {Accept-Ranges, by
tes}, {ETag, "3b20211-e1ac30-5652feb1d7d80"}, {Server, Apache}}                 

// So kann man die einzelen Werte abrufen

  ? oHC:HttpResponse:getHeader( "last-modified"  )
  ? oHC:HttpResponse:getHeader( "Content-Length" )
  ? oHC:HttpResponse:getHeader( "Accept-Ranges"  )
  ? oHC:HttpResponse:getHeader( "Content-Type"   )
  ? oHC:HttpResponse:getHeader( "ETag"           )
  ? oHC:HttpResponse:getHeader( "Server"         )

Damit kann man dann vergleichen, ob die Datei Neuer ist.
oHC:HttpResponse:getHeader( "last-modified"  ) ergibt z.B.

 Wed, 14 Feb 2018 18:02:46 GMT

muß man dann umrechnen. (Bin ich am testen) und mit der vorhanden Datei
vergleichen.

// Der Download wird dann so gestartet
oHC:setMethod( "GET" )
oHC:getFile( "test.exe" )      // Zieldateiname mit Pfad

IF 200 == oHC:getStatusCode()
  // "Datum Zeit berichtigen."
   SetFDaTi( "TEST.EXE" , dDatum, cTimeReal )
ENDIF


Ich hoffe Ihr könnt mit meiner Beschreibung was anfangen.
Grüße
Bernd

Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten