Seite 1 von 1

HTTPClient()

Verfasst: Do, 21. Dez 2017 20:39
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

Re: HTTPClient()

Verfasst: Fr, 22. Dez 2017 18:54
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

Re: HTTPClient()

Verfasst: Fr, 22. Dez 2017 21:22
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

Re: HTTPClient()

Verfasst: Fr, 22. Dez 2017 21:47
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

Re: HTTPClient()

Verfasst: Fr, 22. Dez 2017 22:15
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

Re: HTTPClient()

Verfasst: Fr, 22. Dez 2017 22:39
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

Re: HTTPClient()

Verfasst: Sa, 23. Dez 2017 5:26
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

Re: HTTPClient()

Verfasst: Sa, 23. Dez 2017 6:59
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

Re: HTTPClient()

Verfasst: So, 18. Feb 2018 15:04
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.

Re: HTTPClient()

Verfasst: So, 18. Feb 2018 15:44
von Werner_Bayern
Servus Bernd,

warum nicht per FTP? Dann wäre
FTPClient:directory()
Dein Freund...

Re: HTTPClient()

Verfasst: So, 18. Feb 2018 16:00
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()

Re: HTTPClient()

Verfasst: Mo, 19. Feb 2018 13:53
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.

Re: HTTPClient()

Verfasst: Mo, 19. Feb 2018 14:26
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

Re: HTTPClient()

Verfasst: Mo, 19. Feb 2018 22:44
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.