Autor Beitrag
Rupert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Fr 27.11.20 18:45 
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.

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

ausblenden 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
Einloggen, um Attachments anzusehen!
_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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

_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
docs.microsoft.com/e...is/ms775123(v=vs.85)
Rupert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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.

_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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??

ausblenden 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
Einloggen, um Attachments anzusehen!
_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Di 01.12.20 10:23 
OK - aber mit derselben Indy-Komponente und einem anderen Projekt klappt die Procedure tadellos!
Ich versteh´s nicht...
Einloggen, um Attachments anzusehen!
_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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!

ausblenden 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

_________________
Grüße Rupert
Rupert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Di 01.12.20 21:49 
So - die gelesenen Daten wurden vorerst provisorisch implementiert, was so aussieht...
:D
Einloggen, um Attachments anzusehen!
_________________
Grüße Rupert