Entwickler-Ecke
Internet / Netzwerk - TWebBrowser zeigt Javascript nicht an
Rupert - Fr 27.11.20 18:45
Titel: TWebBrowser zeigt Javascript nicht an
Hallo Leute.
Ich stehe vor dem Problem, das mir der html-Browser ein Download des Javascripts (GetMeterRealtimeData.json) vorschlägt, anstatt den Script auszufühern und mir das Resultat zu liefern.
Quelltext
1:
| WebBrowser1.Navigate('http://192.168.101.15/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=0'); |
Ergebnis - siehe Bild
Derselbe Aufruf im Webbrowser bringt als Ergebnis:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| { "Body" : { "Data" : {} }, "Head" : { "RequestArguments" : { "DeviceClass" : "Meter", "DeviceId" : "0'", "Scope" : "Device" }, "Status" : { "Code" : 6, "Reason" : "CGI-Args: Invalid parameter '0'' for attribute 'DeviceId' (must be numeric)", "UserMessage" : "" }, "Timestamp" : "2020-11-27T17:43:12+01:00" } } |
Hat jemand dafür eine Lösung?
PS ich verwende (noch immer) DELPHI5
lg
Rupert
jaenicke - Fr 27.11.20 19:53
Ähm... Json ist kein Skript, sondern ein Format zur Speicherung von Objekten (ursprünglich) in JavaScript. Da kann man nichts ausführen. Von daher ist das Verhalten schon richtig. Die Anzeige im Webbrowser, die du gepostet hast, zeigt ja auch Json-Inhalt.
Aber wozu brauchst du denn hier einen TWebBrowser? Wie wäre es die Datei einfach mit TIdHttp ohne den ganzen Overhead mit der Webbrowser-Komponente herunterzuladen und in einem TMemo anzuzeigen?
Ralf Jansen - Fr 27.11.20 21:12
Das Json ist eine Fehlerresponse des CGIs. Da steht ziemlich offensichtlich das du als QueryParameter für DeviceId nicht 0 benutzen darfst und du schickst 0 hin.
jaenicke - Fr 27.11.20 21:15
Für die richtige ID sollte man bei Fronius Geräten vorher GetActiveDeviceInfo.cgi verwenden um die verfügbaren Geräte zu ermitteln. Deren ID kann man dann in obigem Skript als Parameter angeben.
Rupert - Sa 28.11.20 13:07
jaenicke hat folgendes geschrieben : |
Aber wozu brauchst du denn hier einen TWebBrowser? Wie wäre es die Datei einfach mit TIdHttp ohne den ganzen Overhead mit der Webbrowser-Komponente herunterzuladen und in einem TMemo anzuzeigen? |
Delphi5 hat noch kein
TIdHttp - ich muss also irgendwie anders an die Daten kommen und generell wäre es ideal, direkt an die Daten des Wechselrichters ranzukommen.
Moderiert von Th69: Delphi-Tags hinzugefügt
Rupert - So 29.11.20 19:33
Danke für die Info - welche Delphi version wäre geeignet um delphi5 programme migrieren zu können.
Lt Embarcadero sollte dies mit RAD 10.3 möglich sein.
jaenicke - So 29.11.20 20:44
Solange du das ganze privat machst und kein oder wenig Geld (bis 5000 USD) damit verdienst, kannst du einfach die kostenlose Delphi Community Edition nehmen. Die alten Projekte kann man damit aufmachen. Die Umstellung auf Unicode könnte z.B. ein paar Änderungen erfordern, aber das siehst du dann ja.
Rupert - Di 01.12.20 00:22
Danke vielmals.
Ich habe die Community Edition erst mal downgeloaded und befasse mich später weil:
Ich fand im Indy9 eine funktionierende TIdHttp
Bekam aber gleich ein neues Problem.
Wenn ich ein neues Projekt erstelle funktioniert die procedure Button4Click
baue ich dasselbe in meine bestehende Heizungsapp ein, erhalte ich eine Exception
Ich konnte feststellen, dass der URL-String nicht an TIdHttp1.Get übergeben wird - deshalb die Exception.
Aber warum wird der String in der App Heizung nicht übergeben, in einer neuen jedoch schon??
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure THauptformular.Button4Click(Sender: TObject); var Jsonstream: TStringStream; idhttp1:TIdHTTP; const Url:String='http://192.168.101.15/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=0';
begin IdHTTP1:= TIdHttp.Create(nil); Jsonstream := TStringStream.Create(''); try IdHTTP1.Request.ContentType:= 'application/json'; Memo4.text := IdHTTP1.Get(Url); finally Jsonstream.Free; end; Memo4.refresh; IdHTTP1.free;
end; |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
jaenicke - Di 01.12.20 01:27
Da muss es schon einen Unterschied geben. Der gezeigte Quelltext ist in Ordnung.
Die Exception und der Hinweis, dass der Wert nicht verfügbar sei, deuten darauf hin, dass eventuell die Indy-Komponente nicht korrekt erstellt wurde. Das siehst du dann an der Stelle aus dem Screenshot daran, dass (wenn es so ist) Self = nil ist. Das würde die Exception erklären.
Rupert - Di 01.12.20 10:23
OK - aber mit derselben Indy-Komponente und einem anderen Projekt klappt die Procedure tadellos!
Ich versteh´s nicht...
jaenicke - Di 01.12.20 10:48
Du erstellst hier eine Komponente IdHTTP1 neu, aber auf dem Formular liegt diese auch?
Wo passiert denn die Schutzverletzung, wie sieht da der Stacktrace aus usw.?
Rupert - Di 01.12.20 19:29
Ich habe den Fehler beheben können.
1. Dass der URL-Parameter nicht übergeben wurde lag am Suchpfad in den Options.
Ich konnte dies zwar nicht nachvollziehen, aber seid ich das Ausgabeverzeichnis gelöscht und wieder eingetragen hatte wurde er übergeben.
2. Dann hatte ich einen neuen Fehler, 10056: Socket already connected
mit dem IdHTTP1.Disconnect ging dieser Fehler weg, und seitdem funktioniert die procedure.
Vielen Dank jedenfalls für die Hilfe und Anregungen!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure THauptformular.Button4Click(Sender: TObject); var idhttp1:TIdHTTP; Const url: String='http://192.168.101.15/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=0';
begin IdHTTP1:= TIdHttp.Create(nil); try IdHTTP1.Request.ContentType:= 'application/json'; Memo4.text := IdHTTP1.Get(Url); finally IdHTTP1.Disconnect; end; Memo4.refresh; IdHTTP1.free; end; |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
Rupert - Di 01.12.20 21:49
So - die gelesenen Daten wurden vorerst provisorisch implementiert, was so aussieht...
:D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!