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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconTh69: Delphi-Tags hinzugefügt


jaenicke - So 29.11.20 00:01

Dann bliebe (abgesehen von einer neuen Delphiversion, die natürlich noch andere Vorteile hätte...) z.B. noch die Windows API direkt übrig:
URLDownloadToFile lädt Daten herunter.
Mehr dazu findest du in der Doku:
https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775123(v=vs.85)


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 user profile iconNarses: 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
//  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);
  try
    IdHTTP1.Request.ContentType:= 'application/json';
    Memo4.text := IdHTTP1.Get(Url);
  finally
    IdHTTP1.Disconnect;
  end;
  Memo4.refresh;
  IdHTTP1.free;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Rupert - Di 01.12.20 21:49

So - die gelesenen Daten wurden vorerst provisorisch implementiert, was so aussieht...
:D