Inhaltsverzeichnis

27.5.2 Klasse RpcClient

Ein Objekt der Klasse RpcClient (gb.xml.rpc) können Sie so erzeugen:

Dim hRpcClient As RpcClient 
hRpcClient = New RpcClient(remoteFunction As RpcFunction)  As "EVENT-NAME" 

Beachten Sie, dass Sie alle Eigenschaften einer (neuen) RPC-Funktion festgelegt haben müssen, bevor Sie ein neues RPC-Client-Objekt erzeugen.

27.5.2.1 Eigenschaften

Die Klasse RpcClient verfügt über drei Eigenschaften:

EigenschaftDatentypBeschreibung
ModeIntegerGibt den Modus für den intern verwendeten HTTP-Server an oder setzt diese Eigenschaft. Als Werte für die Eigenschaft Modus können diese drei Konstanten verwendet werden: Const offLine As Integer = 0, Const httpSync As Integer = 1 und Const httpAsync As Integer = 2.
RpcMethodRpcFunctionDiese Eigenschaft kann nur gelesen werden und gibt eine RpcFunktion zurück.
URLStringDer URL besteht aus dem Locator des Servers mit nachfolgender Port-Nummer, auf dem der XML-RPC-Server lauscht. Beispiel → localhost:1088

Tabelle 27.5.2.1.1 : Eigenschaften der Klasse RpcClient

27.5.2.2 Methoden

Die Klasse RpcClient verfügt nur über diese zwei Methoden:

MethodeRückgabetypBeschreibung
Function Call(Data As Variant[])VariantZurückgegeben wird der Funktionswert des Methodenaufrufs. Data ist ein Variant-Array mit den Argumenten, das an den Server übergeben wird.
Function EvalReply(sCad As String)VariantGibt den Datenteil einer XML-RPC-Antwort zurück. Diese Daten können u.a. vom Typ Integer, Float, String, Boolean, Array oder Struct sein.

Tabelle 27.5.2.2.1 : Methoden der Klasse RpcClient

27.5.2.3 Client-Projekt 1

Als Server für das erste Projekt wird ein XML-RPC-Server → Kapitel 27.5.1 RPC-Server gestartet, der seine Dienste auf einem PC lokal auf dem Port 1088 anbietet. Der Port 1088 wurde gewählt, weil er einerseits über den ersten Standard-Ports (>1023) liegt und andererseits offiziell nicht benutzt wird oder reserviert ist. Über die RPC-Schnittstelle können die folgenden vier Funktionen vom Client aufgerufen werden:

Doc

Abbildung 27.5.2.3.1: Dokumentation der Funktion add2integer

Signatur

Abbildung 27.5.2.3.2: Liste der Signatur der Funktion add2integer

Funktionen

Abbildung 27.5.2.3.3: Liste der implementierten Funktionen

Run

Abbildung 27.5.2.3.4: Aufruf der Methode add2integer

Beachten Sie: In beiden Projekten erfolgt für die beiden Summanden keine Prüfung des Datentyps und des Integer-Bereiches.

Der Quelltext für den XML-RPC-Client wird vollständig angegeben:

' Gambas class file
 
Private $sRPCURL As String
Private hXMLRPCFunction As RpcFunction
Private hXMLRPCClient As RpcClient
Private $aArguments As Variant[]
Private $sRPCFunctionName As String
 
Public Sub Form_Open()
  FMain.Resizable = False
  FMain.Title = "HTTP-SERVICE * RPC-CLIENT"
  txbSumme.ReadOnly = True
' $sRPCURL = "0.0.0.0:1088"
' $sRPCURL = "192.168.2.101:1088"
' $sRPCURL = "127.0.0.1:1088"
  $sRPCURL = "localhost:1088" ' This Port officially not used or reserved
  $sRPCFunctionName = "add2integer"
End
 
Public Sub btnGetResult_Click()
  GetResult()
End
 
Public Sub btnGetInformation_Click()
  GetDoc()
  GetSignatures()
  GetMethods()
End
Public Sub txbSummand1_Change()
  txbSumme.Clear() 
End
 
Public Sub txbSummand2_Change()
  txbSumme.Clear() 
End
 
Private Sub GetResult()
 
  Dim iResult As Integer
 
  $aArguments = New Variant[]
  hXMLRPCFunction = New RpcFunction($sRPCFunctionName, [XmlRpc.xInteger, XmlRpc.xInteger], XmlRpc.xInteger)
  hXMLRPCClient = New RpcClient(hXMLRPCFunction) As "hXMLRPCClient"
  hXMLRPCClient.URL = "http://" & $sRPCURL
 
  $aArguments.Add(CInt(txbSummand1.Text))
  $aArguments.Add(CInt(txbSummand2.Text))
 
  Try iResult = hXMLRPCClient.Call($aArguments)
  If Not Error Then 
     txbSumme.Text = Str(iResult)
  Else
     Message.Error(("Error-Text: ") & Error.Text & gb.NewLine &
                   ("Error-Location:  ") & Error.Where & gb.NewLine & 
                   ("URL: '") & $sRPCURL & " '")
  Endif
 
End
 
Private Sub GetDoc()  
 
  Dim sResult As String
 
  $aArguments = New Variant[]
  hXMLRPCFunction = New RpcFunction("system.methodHelp", [XmlRpc.xString], XmlRpc.xString)
  hXMLRPCClient = New RpcClient(hXMLRPCFunction) As "hXMLRPCClient"
  hXMLRPCClient.URL = "http://" & $sRPCURL
 
  $aArguments.Add("add2integer")
 
  Try sResult = hXMLRPCClient.Call($aArguments)
  If Not Error Then 
     Message.Title = ("Description of the function")
     Message.Info(("Function: ") & $sRPCFunctionName & "<hr>" & sResult)
  Else
     Message.Error(("Error-Text: ") & Error.Text)
  Endif
 
End
 
Private Sub GetSignatures()  
 
  Dim aResult As New RpcArray
  Dim sMessage As String
  Dim iIndex As Integer
 
  $aArguments = New Variant[]
  hXMLRPCFunction = New RpcFunction("system.methodSignature", [XmlRpc.xString], XmlRpc.xArray)
  hXMLRPCClient = New RpcClient(hXMLRPCFunction) As "hXMLRPCClient"
  hXMLRPCClient.URL = "http://" & $sRPCURL
 
  $aArguments.Add("add2integer")
 
  Try aResult = hXMLRPCClient.Call($aArguments)
  If Not Error Then 
     Message.Title = ("List of data types")
     sMessage = ("List of data types of the function")
     sMessage &= "<font color='red'>" & $sRPCFunctionName & "</font>"
     sMessage &= "<hr>"
     For iIndex = 1 To aResult.Count
       If iIndex = 1 Then 
          sMessage &= ("Function value ") & " = " & aResult[iIndex - 1] & gb.NewLine
       Else
          If iIndex = aResult.Count Then 
             sMessage &= "Argument " & Str(iIndex - 1) & " = " & aResult[iIndex - 1]
          Else
             sMessage &= "Argument " & Str(iIndex - 1) & " = " & aResult[iIndex - 1] & gb.NewLine
          Endif
       Endif
     Next
     Message.Info(sMessage)
  Else
     Message.Error(("Error-Text: ") & Error.Text)
  Endif  
End
 
Private Sub GetMethods()  
 
  Dim aResult As New RpcArray
  Dim sMessage As String
  Dim iIndex As Integer
 
  $aArguments = New Variant[]
  hXMLRPCFunction = New RpcFunction("system.listMethods", [], XmlRpc.xArray)
  hXMLRPCClient = New RpcClient(hXMLRPCFunction) As "hXMLRPCClient"
  hXMLRPCClient.URL = "http://" & $sRPCURL
 
  Try aResult = hXMLRPCClient.Call($aArguments)
  If Not Error Then 
     Message.Title = ("List of funktions")
     sMessage = ("Functions on the RPC server") & "<hr>"
     For iIndex = 1 To aResult.Count
       sMessage &= aResult[iIndex - 1] & gb.NewLine
     Next
     Message.Info(sMessage)
  Else
     Message.Error(("Error-Text: ") & Error.Text)
  Endif
 
End

27.5.2.4 Client-Projekt 2

Im Gegensatz zum ersten Projekt wird ein XML-RPC-Server nur dann gestartet, wenn die PHP-Datei xmlrpc.server.php im Web-Ordner ~/public_html aufgerufen wird → Kapitel 27.5.1 und 24.13. Der Quelltext für den Client2 unterscheidet sich vom Client1 aus dem Projekt 1 deshalb vor allem in der unterschiedlichen Diktion des URL. Als Funktion ist ebenso wie im ersten Projekt add2integer implementiert.

' Gambas class file
 
Private $sRPCURL As String
 
Public Sub Form_Open()
  FMain.Resizable = False
  FMain.Title = "WEBSERVICE * RPC-CLIENT"
  txbSumme.ReadOnly = True
  $sRPCURL = "localhost/~" & System.User.Name &/ "xmlrpc.server.php"
End
 
Public Sub btnGetResult_Click()
  GetResult()
End
 
Public Sub txbSummand1_Change()
  txbSumme.Clear()
End
 
Public Sub txbSummand2_Change()
  txbSumme.Clear()
End
 
Private Sub GetResult()
 
  Dim hXMLRPCClient As RpcClient  
  Dim hXMLRPCFunction As RpcFunction
  Dim aArguments As New Variant[]
  Dim iResult As Integer
 
  hXMLRPCFunction = New RpcFunction("add2integer", [XmlRpc.xInteger, XmlRpc.xInteger], XmlRpc.xInteger)
 
  hXMLRPCClient = New RpcClient(hXMLRPCFunction) As "hXMLRPCClient"
  hXMLRPCClient.URL = "http://" & $sRPCURL
 
  aArguments.Add(CInt(txbSummand1.Text))
  aArguments.Add(CInt(txbSummand2.Text))
 
  Try iResult = hXMLRPCClient.Call(aArguments)
  If Not Error Then 
     txbSumme.Text = Str(iResult)
  Else
     Message.Error("Fehler-Text:   " & Error.Text & gb.NewLine &
                   "Fehler-Ort:    " & Error.Where & gb.NewLine & 
                   "URL:   '" & $sRPCURL & " '")
  Endif
 
End

Das Ergebnis der algebraischen Addition wird Sie wohl nicht überraschen:

Abbildung 27.5.2.4.1: Aufruf der auf einem RPC-Server (PHP) implementierten Funktion add2integer

Download