XML-RPC

DL3AD
Beiträge: 441
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

XML-RPC

Beitrag von DL3AD »

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

Socke
Lazarusforum e. V.
Beiträge: 2814
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

Beitrag von Socke »

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

DL3AD
Beiträge: 441
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: XML-RPC

Beitrag von DL3AD »

... Danke für den Link - aber das Beispiel ist... :cry:

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 ?

sstvmaster
Beiträge: 366
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: Windows 10 | Lazarus: 2.0.10 und Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: XML-RPC

Beitrag von sstvmaster »

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.

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
fldigi_xmlrpc.jpg (113.75 KiB) 402 mal betrachtet
Synapse_XMLRPC.zip
(317.43 KiB) 5-mal heruntergeladen
LG Maik

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2311
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

Beitrag von m.fuchs »

DL3AD hat geschrieben:
Di 17. Nov 2020, 18:21
... Danke für den Link - aber das Beispiel ist... :cry:
Oh, schade. Dabei habe ich das sogar als relativ simpel eingestuft.
DL3AD hat geschrieben:
Di 17. Nov 2020, 18:21
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
3. Antwort empfangen
Genau, das ist die Grundlage von praktisch aller Webservice-Kommunikation.
DL3AD hat geschrieben:
Di 17. Nov 2020, 18:21
Wie macht man dass am einfachsten ?
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

PascalDragon
Beiträge: 122
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

Beitrag von PascalDragon »

DL3AD hat geschrieben:
Di 17. Nov 2020, 17:03
Gibt es eine XML-RPC implementation in Lazarus ?
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

mschnell
Beiträge: 3411
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

Beitrag von mschnell »

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

DL3AD
Beiträge: 441
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: XML-RPC

Beitrag von DL3AD »

@sstvmaster
Hallo Maik,
vielen Dank für das Beispiel - nach einer kleinen Anpassung läuft es auch unter Debian . :D
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

sstvmaster
Beiträge: 366
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: Windows 10 | Lazarus: 2.0.10 und Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: XML-RPC

Beitrag von sstvmaster »

Hallo Frank,

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.
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.
Dateianhänge
xml_rpc_synapse_lazxml.zip
(126.71 KiB) 5-mal heruntergeladen
Zuletzt geändert von sstvmaster am Do 19. Nov 2020, 12:28, insgesamt 3-mal geändert.
LG Maik

Benutzeravatar
six1
Beiträge: 235
Registriert: Do 1. Jul 2010, 19:01

Re: XML-RPC

Beitrag von six1 »

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:

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

sstvmaster
Beiträge: 366
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: Windows 10 | Lazarus: 2.0.10 und Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: XML-RPC

Beitrag von sstvmaster »

@six1,

danke Michael, habe gleich meinen Beitrag entsprechend angepasst und das Demo Projekt auch.
LG Maik

Benutzeravatar
six1
Beiträge: 235
Registriert: Do 1. Jul 2010, 19:01

Re: XML-RPC

Beitrag von six1 »

Gerne und ich habe gleich meinen Copy&Paste Fehler korrigiert, nachdem Du das gleich entdeckt hattest :mrgreen:
Gruß, Michael

sstvmaster
Beiträge: 366
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: Windows 10 | Lazarus: 2.0.10 und Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: XML-RPC

Beitrag von sstvmaster »

So, damit das jetzt dann vollständig ist, hier jetzt noch die Version mit fphttpclient, SSL, DOM und XMLWrite.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}


interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,

  fpHttpClient, fpOpenSSL, 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);             // <-- Warum ???
    http.RequestBody := Request;
    try
      http.Post('http://127.0.0.1:7362', Response);
      Response.Seek(0, soFromBeginning);            // <-- Warum ???
      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.
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
Dateianhänge
xml_rpc_fphttpclient_lazxml.zip
(127.24 KiB) 4-mal heruntergeladen
Zuletzt geändert von sstvmaster am Do 19. Nov 2020, 23:25, insgesamt 1-mal geändert.
LG Maik

Socke
Lazarusforum e. V.
Beiträge: 2814
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

Beitrag von Socke »

sstvmaster hat geschrieben:
Do 19. Nov 2020, 16:46
Und gleich noch die Frage dazu. Warum muss ich die Streams erst auf Anfang bringen? In dem Synapse Beispiel musste ich das nicht tun.
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.

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

sstvmaster
Beiträge: 366
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: Windows 10 | Lazarus: 2.0.10 und Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: XML-RPC

Beitrag von sstvmaster »

@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... ).
LG Maik

Antworten