Seite 1 von 1

Sockets [Erledigt, aber nicht gelöst]

Verfasst: Di, 20. Dez 2016 10:11
von Jan
Hallo,

gerade verzweifle ich am Support enies Lieferanten. Es geht darum, aus einer Heizungsanlage die aktuellenWerte auszulesen. Das geht per RESTful Webservices. Eine Verbindung des Gerätes zum Internet gibt es nicht - das ist sowohl im Gerät abgeschaltet als auch durch Einstellungen in der Firewall geblockt.

Ich habe also mal eine simple Anfrage geschrieben:

Code: Alles auswählen

nSocket := SocketNew(AF_INET, SOCK_STREAM, 0, @nError)
lSuccess := SocketConnect(nSocket, , "192.168.1.7", 8080, @nError)
cText := Ansi2Utf8("GET 192.168.1.7:8080/user/menu HTTP/1.1" + crlf + crlf)
nRueckgabe := SocketSend(nSocket, cText, , , @nError)
nSocket ist sauber gefüllt. lSuccess = .T.. nError bleibt bei jeder Abfrage 0. Also sollte eigentlich immer alles sauber abgelaufen sein.

Aber: Wenn ich dann per SocketRecvString die Rückgabe abfrage, bekomme ich immer diese Meldung:
HTTP/1.1 404 Not Found
Content-Length: 150
Content-Type: application/xml;charset=UTF-8
Cache-Control: no-cache
Date: Tue, 20 Dec 2016 09:52:40 GMT

<?xml version="1.0" encoding="utf-8"?>
<eta version="1.0" xmlns="http://www.eta.co.at/rest/v1">
<error>No such application or domain</error>
</eta>
Der Support meint, ich würde wohl eine falsche URI verwenden. Kann aber nicht sein, denn wenn ich die in den Browser eingebe bekomme ich ganz sauber das Ergebnis.

Was mache ich da falsch?

Jan

Re: Sockets

Verfasst: Di, 20. Dez 2016 10:25
von georg
Hallo, Jan -


ich würde in Firefox mittels F12 das Debugging (naja, fast Debugging) aktivieren, und dann die URI mal aufrufen und sehen, was da zwischen Browser und Gerät ausgetauscht wird.

Re: Sockets

Verfasst: Di, 20. Dez 2016 11:11
von nightcrawler
Wie Georg schon geschrieben hat: Datenverkehr mitloggen.
Ich vermute, dass Du den falschen Dienst anfrägst und evtl ein accept:json oder accept:xml mit in den Request einbauen musst.

Re: Sockets

Verfasst: Di, 20. Dez 2016 11:49
von Jan
Hallo Georg und Joachim,

da stelle ich mal eine ganz blöde Frage: Warum müsste ich bei einem GET noch Angaben machen müssen wie ein accept? Insbesondere im Hinblick darauf das ich bei einem Aufruf von "192.168.1.7:8080/user/menu" im Browser das korrekte Ergebnis zurückgeliefert bekomme?

Sorry, wenn ich mich da etwas Begriffstutzig anstelle. Das ist immer noch nicht so ganz meine Welt.

Jan

Re: Sockets

Verfasst: Di, 20. Dez 2016 11:55
von nightcrawler
Hallo Jan,
Dein Browser schickt das alles mit ... dem ist dann egal, ob HTML, XML, JSON oder eine Datei (der Dateiinhalt) zurückkommt. Der kann eben alles irgendwie anzeigen oder speichern. Diese Meta-Ebene wird im Header dem Sender mitgeteilt.
Der Sender schaut nun, was er alles senden kann (möglicherweise ist die Applikation nur auf JSON programmiert und kann kein XML, dann muss der Sender eben JSON ausliefern) und tut das entsprechend. Wenn Du nun dem Sender gar nicht mitteils, ws Du akzeptierst, dann weiss er nicht was zu tun ist und schickt eine Fehlermeldung.
Ich gehe schwer davon aus, dass Dein Socket per se nur HTML anfordert. Die Antwort vom Sender ist aber XML (wie im Header erkennbar). Er hat evtl keinen Dienst für HTML Ausgabe implementiert.
Deshalb der Vorschlag nach einem Logging - dort kannst Du den Header der Antwort anschauen und entsprechendes auch abfragen.

Re: Sockets

Verfasst: Di, 20. Dez 2016 12:42
von ramses
Hallo Jan

sende mal nur folgendes "GET 192.168.1.7:8080/user/menu"

den die Fehlermeldung sagt doch dass der Server "HTTP/1.1" nicht findet.

Cu Carlo

Re: Sockets

Verfasst: Di, 20. Dez 2016 13:22
von Jan
Leider war der Support des Herstellers nicht gewillt oder nicht in der Lage mir mitzuteilen, welche Einstellungen exakt dafür notwendig sind. Ich habe die einschlägigen alle durchgetestet, insbesondere natürlich die, die in den verschiedenen Rückgaben aufgeführt werden. Das hat alles nichts gebracht.

Ich hab mir das jetzt mal total einfach gemacht. Da ich in diesem fall einfach nur GET-Abfragen mache, bin ich auf LoadFromUrl() umgestiegen. Das hat dann sofort anstandslos funktioniert. Da kann man im nachhinein nur sagen: Warum einfach, wenn es auch kompliziert geht. ;-)

Auch wenn das letztendlich nicht zum gewünschten Ziel geführt hat - danke für alle Eure Hinweise und Tipps.

Jan

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 9:06
von Rudolf
Hallo Jan,
ich nehme TServerXMLHTTPRequest() von OT4XB oder Chilkat, hier kann man noch diverse Parameter setzen wie timeout, ignorecertall etc.
Grüße
Rudolf

Code: Alles auswählen

oHttp := TServerXMLHTTPRequest():New()
if oHttp:Open("GET",cUrlList,,cUser,cPWD)
     oHTTp:lIgnoreCertAll := .t.
     *oHttp:SetTimeOuts( nResolveTimeOut,nConnectTimeOut,nSendTimeOut,nReceiveTimeOut )
     if oHttp:Send()
          sleep(5)
          *nStatus1 := oHttp:status()
           cc := oHttp:responseBody

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 10:23
von ramses
@Jan

Jan hast du xb2net?

Cu Carlo

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 10:32
von Jan
Hallo Carlo,

nein. benutze ich nicht.

Jan

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 10:36
von Jan
Hallo Rudolf,

mit den entsprechenden Funktionen von Pablo hatte ich mal vor zwei oder drei Jahren angefangen, weil ich da noch keine Professional Subscription hatte. Das habe ich dann aber sehr schnell wieder aufgegeben. Die Funktionen in diesem Bereich waren mir ganz extrem zu langsam, und eine passende Auftragsprogrammierung durch Pablo ging sehr schleppend voran und wurde dann irgendwann von ihm auch ohne jeden Kommentar nicht weiter geführt. Seither bin ich eher vorsichtig, was den Einsatz von ot4xb angeht. Das läßt sich nicht immer vermeiden, weil in manchen Bereichen Alaska einfach nicht in die Puschen kommt. Aber soweit möglich schmeiße ich das halt raus.

Jan

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 11:01
von Rudolf
Hallo Jan,
ist auch meine Philosophie, stelle jetzt alles auf Chilkat um, aber hatte sonst mit OT4XB nie Probleme mit dem HTTPREQUEST, auch nicht mit Geschwindigkeit.
Grüße
Rudolf

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 21. Dez 2016 17:17
von ramses
@Rudolf

du stellst alles auf "Chilkat" um?

Benötigst du dann nicht auch ot4xb in den Wrapper Funktionen?

Bist du mit dem XML-Parser glücklich?

Cu Carlo

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Do, 22. Dez 2016 9:39
von Rudolf
Hallo Carlo,
brauchst kein OT4XB, nur die DLL registrieren und einmal am Anfang die Lizenzfunktion aufrufen. XML Parser funktioniert sehr gut, wie auch alles andere. Hat sehr gute Doku (Beispiele in VFP) und gute Logfunktion bei Problemen. Für ein Tool mit so einem großen Funktionsumfang ein sehr guter Preis finde ich.
Grüße
Rudolf

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Do, 22. Dez 2016 11:36
von ramses
Hallo Rudolf
du hast recht gute Doku und viele Funktionen. Leider per ActiveX.
ActiveX steht bei uns auf der "Never, ever do that again!" - Liste.....
Gruss
Carlo

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Do, 22. Dez 2016 12:10
von Rudolf
Hallo Carlo,
schade, welche Gründe sind das ? Hatte bis jetzt keine Probleme, auch nicht bei "komplizierten" Kunden und im Hochsicherheitsbereich.
Güße
Rudolf

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Do, 22. Dez 2016 12:50
von brandelh
Für mich ist ActiveX auch auf der "das mach ich nur im Notfall" Liste ;-)
Registrieren von DLLs auf Zielrechnern, das geb ich mir nicht - insbesondere bei Citrix Servern immer eine Freude mit dem Admin.

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Do, 22. Dez 2016 12:55
von Jan
Ich habe mich ebenfalls soweit möglich von ActiveX verabschiedet. Zu langsam, manchmal instabil (was nicht immer an Xbase++ liegen muß), ständig Probleme mit Kunden wo sich das nicht installieren ließ, oftmals verwirrende oder fehlende Doku der Schnittstelle auf Seiten der ActiveX-Module - wenn immer möglich verwende ich schon länger alternative Möglichkeiten.

Jan

Re: Sockets [Erledigt, aber nicht gelöst]

Verfasst: Mi, 28. Dez 2016 7:44
von AUGE_OHR
ramses hat geschrieben:ActiveX steht bei uns auf der "Never, ever do that again!" - Liste.....
wieso ... wenn man den Code selbst schreibt :)