XML-RPC
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
XML-RPC
Hallo,
ich möchte über XML-RPC auf ein Program (Fldigi) zugreifen.
In der Hilfe zu Fldigi steht folgendes
4.9
Xmlrpc Control
XML-RPC data is transported via simple HTTP and client implementations exist for most programming languages.
XML ist so Konfiguriert
Addresse: 127.0.0.1
Port: 7362
eine Tabelle der Methoden ist auch beigefügt – ich nehme mal beispielhaft folgende
fldigi.name Returns the program name
Der Rückgabewert ist ein String.
Frage:
Gibt es eine XML-RPC implementation in Lazarus ?
Frank
ich möchte über XML-RPC auf ein Program (Fldigi) zugreifen.
In der Hilfe zu Fldigi steht folgendes
4.9
Xmlrpc Control
XML-RPC data is transported via simple HTTP and client implementations exist for most programming languages.
XML ist so Konfiguriert
Addresse: 127.0.0.1
Port: 7362
eine Tabelle der Methoden ist auch beigefügt – ich nehme mal beispielhaft folgende
fldigi.name Returns the program name
Der Rückgabewert ist ein String.
Frage:
Gibt es eine XML-RPC implementation in Lazarus ?
Frank
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: XML-RPC
Eine Bibliothek ist mir nicht bekannt. Vielleicht hilft dir https://www.ypa-software.de/pages/de/vo ... azarus.php als Inspiration.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: XML-RPC
... Danke für den Link - aber das Beispiel ist...
Wenn ich das Prinzip von XML-RPC richtig verstanden habe - muss man folgendes tun
1.http Verbindung über die Addresse mit entsprechendem Port - hier 127.0.0.1; 7362 herstellen
2. z.B. folgendes senden
<?xml version="1.0" encoding="ISO-8859-15"?>
<methodCall>
<methodName>fldigi.name</methodName>
</methodCall>
3. Antwort empfangen
Wie macht man dass am einfachsten ?
Wenn ich das Prinzip von XML-RPC richtig verstanden habe - muss man folgendes tun
1.http Verbindung über die Addresse mit entsprechendem Port - hier 127.0.0.1; 7362 herstellen
2. z.B. folgendes senden
<?xml version="1.0" encoding="ISO-8859-15"?>
<methodCall>
<methodName>fldigi.name</methodName>
</methodCall>
3. Antwort empfangen
Wie macht man dass am einfachsten ?
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: XML-RPC
Hallo Frank,
ich habe das von hier: https://github.com/kattunga/NativeXml, genommen.
Und habe hier ein Beispiel gefunden: http://webdelphi.ru/2010/10/xml-rpc-v-d ... x-metodov/
Und anbei mein Beispiel. NativeXML ist mit drin. Synapse muss über OPM installiert werden, wenn nicht schon vorhanden.
ich habe das von hier: https://github.com/kattunga/NativeXml, genommen.
Und habe hier ein Beispiel gefunden: http://webdelphi.ru/2010/10/xml-rpc-v-d ... x-metodov/
Und anbei mein Beispiel. NativeXML ist mit drin. Synapse muss über OPM installiert werden, wenn nicht schon vorhanden.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
httpsend, NativeXmlold;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
http: THttpSend;
XMLDoc: TNativeXMLold;
begin
http := THttpSend.Create;
XMLDoc := TNativeXMLold.CreateName('methodCall');
try
XMLDoc.Root.NodeNew('methodName').ValueAsString := 'fldigi.version';
XMLDoc.SaveToStream(http.Document);
if http.HTTPMethod('POST', '127.0.0.1:7362') then
Memo1.Lines.LoadFromStream(http.Document);
finally
http.Free;
XMLDoc.Free;
end;
end;
end.
- Dateianhänge
-
- fldigi_xmlrpc.jpg (113.75 KiB) 4606 mal betrachtet
-
- Synapse_XMLRPC.zip
- (317.43 KiB) 154-mal heruntergeladen
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2640
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: XML-RPC
Oh, schade. Dabei habe ich das sogar als relativ simpel eingestuft.
Genau, das ist die Grundlage von praktisch aller Webservice-Kommunikation.
Die HTTP-Kommunikation am einfachsten mit dem mitgeliefertem FpHttpClient, für die XML-Kodierung gibt es mehrere Bibliotheken. Ein Startpunkt dafür ist hier: https://wiki.freepascal.org/XML
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 830
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: XML-RPC
FPC hatte mal bis Revision 14943 eine XML-RPC Implementierung, die jedoch zu Gunsten von WST aufgegeben wurde. In trunk ist unter $fpcdir/packages/fcl-net/examples/rpccli.pp noch immer ein (nicht mehr kompilierendes) Beispiel und zusammen mit dem Code aus dem Subversion könntest du versuchen das wieder gangbar zu machen.
FPC Compiler Entwickler
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: XML-RPC
WST scheint doch XMLRPC zu emthalten.
Eine kommerzielle Implementierung von XMLRPC für Delphi ist RemObjects Remoting SDK -> https://www.remotingsdk.com/ro/default.aspx
Wir haben das vor ein paar Jahren mal benutzt um auf der Server-Seite ein Delphi-programm hinter einem Microsoft Web Server und auf der Client Seite eine Adobe Flash Applikation im Browser zu verbinden.
Zumindest vor ein Paar Jahren haben die auch FPC unterstützt. Jetzt haben sie mit Oxygene eine eigene Pascal-Sprache.
-Michael
Eine kommerzielle Implementierung von XMLRPC für Delphi ist RemObjects Remoting SDK -> https://www.remotingsdk.com/ro/default.aspx
Wir haben das vor ein paar Jahren mal benutzt um auf der Server-Seite ein Delphi-programm hinter einem Microsoft Web Server und auf der Client Seite eine Adobe Flash Applikation im Browser zu verbinden.
Zumindest vor ein Paar Jahren haben die auch FPC unterstützt. Jetzt haben sie mit Oxygene eine eigene Pascal-Sprache.
-Michael
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: XML-RPC
@sstvmaster
Hallo Maik,
vielen Dank für das Beispiel - nach einer kleinen Anpassung läuft es auch unter Debian .
Ich hatte es zuvor mit Lnet probiert - war aber erfolglos - nun Funktioniert es und ich kann darauf aufbauen.
@all
Danke für eure Tipps!
Es ist immer wieder erfreulich, wie schnell man in diesem Forum kompetente Hilfe bekommt.
Frank
Hallo Maik,
vielen Dank für das Beispiel - nach einer kleinen Anpassung läuft es auch unter Debian .
Ich hatte es zuvor mit Lnet probiert - war aber erfolglos - nun Funktioniert es und ich kann darauf aufbauen.
@all
Danke für eure Tipps!
Es ist immer wieder erfreulich, wie schnell man in diesem Forum kompetente Hilfe bekommt.
Frank
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: XML-RPC
Hallo Frank,
anbei eine Version die ohne Fremdbestandteile auskommt.
Hier wurde nur Synapse, Laz2_Dom und Laz2_XMLWrite benutzt, jetzt auch mit SSL.
Zip im Anhang wurde auch angepasst.
Für SSL werden natürlich noch die DLLs oder für Linux die SSL-Pakete benötigt!!!
Ich habe auch eine Version mit der fphttpclient unit. Hier bekomme ich aber einen "Stream read error." Aber dazu mache ich eventuell einen neuen Beitrag auf.
anbei eine Version die ohne Fremdbestandteile auskommt.
Hier wurde nur Synapse, Laz2_Dom und Laz2_XMLWrite benutzt, jetzt auch mit SSL.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
HTTPSend, SSL_OpenSSL, Laz2_DOM, Laz2_XMLWrite;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
http: THTTPSend;
XMLDoc: TXMLDocument;
aRoot, aMethodName, aMethodValue: TDOMNode;
begin
// XML Dokument erzeugen
XMLDoc := TXMLDocument.Create;
// Wurzelknoten erzeugen
aRoot := XMLDoc.CreateElement('methodCall');
XMLDoc.AppendChild(aRoot);
// Kind Element erzeugen
aRoot := XMLDoc.DocumentElement;
aMethodName := XMLDoc.CreateElement('methodName');
// Wert für Kind Element
aMethodValue := XMLDoc.CreateTextNode('fldigi.version');
aMethodName.AppendChild(aMethodValue);
// Elemente sichern
aRoot.AppendChild(aMethodName);
// XML RPC Abfrage
http := THTTPSend.Create;
http.Sock.CreateWithSSL(TSSLOpenSSL); // <-- für https
http.Sock.SSLDoConnect; // <-- für https
try
WriteXML(XMLDoc, http.Document);
if http.HTTPMethod('POST', '127.0.0.1:7362') then
Memo1.Lines.LoadFromStream(http.Document);
finally
http.Free;
XMLDoc.Free;
end;
end;
end.
Für SSL werden natürlich noch die DLLs oder für Linux die SSL-Pakete benötigt!!!
Ich habe auch eine Version mit der fphttpclient unit. Hier bekomme ich aber einen "Stream read error." Aber dazu mache ich eventuell einen neuen Beitrag auf.
- Dateianhänge
-
- xml_rpc_synapse_lazxml.zip
- (126.71 KiB) 123-mal heruntergeladen
Zuletzt geändert von sstvmaster am Do 19. Nov 2020, 12:28, insgesamt 3-mal geändert.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Re: XML-RPC
Es wurde nicht explizit danach gefragt, aber Server in freier Wildbahn arbeiten heutzutage mit https.
Dafür müsste man noch zwei Zeilen ergänzen:
Dafür müsste man noch zwei Zeilen ergänzen:
Code: Alles auswählen
// XML RPC Abfrage
http := THTTPSend.Create;
http.Sock.CreateWithSSL(TSSLOpenSSL); // <-- für https
http.Sock.SSLDoConnect; // <-- für https
Gruß, Michael
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: XML-RPC
@six1,
danke Michael, habe gleich meinen Beitrag entsprechend angepasst und das Demo Projekt auch.
danke Michael, habe gleich meinen Beitrag entsprechend angepasst und das Demo Projekt auch.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Re: XML-RPC
Gerne und ich habe gleich meinen Copy&Paste Fehler korrigiert, nachdem Du das gleich entdeckt hattest
Gruß, Michael
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: XML-RPC
So, damit das jetzt dann vollständig ist, hier jetzt noch die Version mit fphttpclient, SSL, DOM und XMLWrite.
Und gleich noch die Frage dazu. Warum muss ich die Streams erst auf Anfang bringen? In dem Synapse Beispiel musste ich das nicht tun.
Vielen Dank geht an dieser Stelle auch an @socke mit dem Link zur Seite von @m.fuchs
(https://www.ypa-software.de/pages/de/vo ... azarus.php).
Mit Hilfe des PDFs habe ich die Lösung des "stream read errors" gefunden @seek(0, soFromBeginning).
Danke
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
fpHttpClient, OpenSSLSockets, OpenSSL, DOM, XMLWrite;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
http: TFPHTTPClient;
Request, Response: TStream;
XMLDoc: TXMLDocument;
aRoot, aMethodName, aMethodValue: TDOMNode;
begin
// XML Dokument erzeugen
XMLDoc := TXMLDocument.Create;
// Wurzelknoten erzeugen
aRoot := XMLDoc.CreateElement('methodCall');
XMLDoc.AppendChild(aRoot);
// Kind Element erzeugen
aRoot := XMLDoc.DocumentElement;
aMethodName := XMLDoc.CreateElement('methodName');
// Wert für Kind Element
aMethodValue := XMLDoc.CreateTextNode('fldigi.version');
aMethodName.AppendChild(aMethodValue);
// Elemente sichern
aRoot.AppendChild(aMethodName);
// Daten holen
InitSSLInterface;
http := TFPHTTPClient.Create(nil);
Response := TMemoryStream.Create;
Request := TMemoryStream.Create;
try
WriteXML(XMLDoc, Request);
Request.Seek(0, soFromBeginning);
http.RequestBody := Request;
try
http.Post('http://127.0.0.1:7362', Response);
Response.Seek(0, soFromBeginning);
if http.ResponseStatusCode = 200 then
Memo1.Lines.LoadFromStream(Response);
except
Memo1.Clear;
Memo1.Lines.Add('unbekannter Fehler.')
end;
finally
http.Free;
Response.Free;
Request.Free;
XMLDoc.Free;
end;
end;
end.
Vielen Dank geht an dieser Stelle auch an @socke mit dem Link zur Seite von @m.fuchs
(https://www.ypa-software.de/pages/de/vo ... azarus.php).
Mit Hilfe des PDFs habe ich die Lösung des "stream read errors" gefunden @seek(0, soFromBeginning).
Danke
- Dateianhänge
-
- xml_rpc_fphttpclient_lazxml.zip
- (127.24 KiB) 141-mal heruntergeladen
Zuletzt geändert von sstvmaster am Di 1. Dez 2020, 16:59, insgesamt 2-mal geändert.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: XML-RPC
Bei dem Request wäre es hilfreich, wenn du nur einen Teil des Streams senden möchtest (z.B. einen Teil einer großen Datei bei einem Upload). Daher finde ich eher das Verhalten von Synpase befremdlich.sstvmaster hat geschrieben: ↑Do 19. Nov 2020, 16:46Und gleich noch die Frage dazu. Warum muss ich die Streams erst auf Anfang bringen? In dem Synapse Beispiel musste ich das nicht tun.
Beim Response ist es eigentlich genau so: Du kannst ja auch einen Stream angeben, der eine Datei oder ganz woanders hin geschrieben wird. Möglicherweise kannst du dann gar nicht mehr zu der vorherigen Position zurückspringen (z.B. bei Pipes oder ungepufferter Datenkommunikation).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: XML-RPC
@Socke
Danke für deiner Erläuterung.
Soweit wie ich das erkennen kann übernimmt, das Teilen des Dokumentes in Chunks, Synapse das selbst ( httpsend.pas ab Zeile 523?).
Ich denke aber das man das auch "manuell" mit Synapse machen kann ( xxx.sock.Send... /Recv... ).
Danke für deiner Erläuterung.
Soweit wie ich das erkennen kann übernimmt, das Teilen des Dokumentes in Chunks, Synapse das selbst ( httpsend.pas ab Zeile 523?).
Ich denke aber das man das auch "manuell" mit Synapse machen kann ( xxx.sock.Send... /Recv... ).
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)