Ruby-Programmierung: xmlrpc

Aus Wikibooks

Zurück zu Ruby-Programmierung Hauptmenü

Schritt Erklärung Code
1 XMLRPC Server
require "xmlrpc/server"
s = XMLRPC::Server.new(8080)
s.add_handler("funktion.add") do |a,b|
  a + b
end
s.add_handler("funktion.div") do |a,b|
  if b == 0
    raise XMLRPC::FaultException.new(1, "Division durch 0")
  else
    a / b 
  end
end
s.add_handler("funktion.str") do |a,b|
  a << b
end
s.add_handler("down") do 
s.shutdown
"shutdown"
end
Nach starten des XMLRPC Server meldet Ruby
[2009-11-02 14:19:30] INFO  WEBrick 1.3.1
[2009-11-02 14:19:30] INFO  ruby 1.8.6 (2007-03-13) [i386-mswin32]
[2009-11-02 14:19:30] INFO  WEBrick::HTTPServer#start: pid=3708 port=8080
2 XMLRPC Client
require "xmlrpc/client"
server = XMLRPC::Client.new("localhost", nil, 8080)
begin
  param = server.call("funktion.add", 45, 55)
  puts "45 + 55 = #{param}"
  param = server.call("funktion.str", "Hello","Rubyuser")
  puts "#{param}"
  param = server.call("down")
  puts "#{param}"
rescue XMLRPC::FaultException => e
  puts "Error:"
  puts e.faultCode
  puts e.faultString
end
Client übersetzt nach XML
<?xml version="1.0" ?>
<methodCall>
  <methodName>funktion.add</methodName>
  <params>
    <param>
      <value>
        <i4>4</i4>
      </value>
    </param>
    <param>
       <value>
         <i4>5</i4>
       </value>
     </param>
   </params>
</methodCall>
<?xml version="1.0" ?>
<methodCall>
  <methodName>funktion.str</methodName>
  <params>
    <param>
      <value>
        <string>Hello</string>
      </value>
    </param>
    <param>
      <value>
        <string>Rubyuser</string>
      </value>
    </param>
  </params>
</methodCall>
<?xml version="1.0" ?>
<methodCall>
  <methodName>down</methodName>
  <params/>
</methodCall>
Man erkennt die Übersetzung von

param = server.call("funktion.add", 45, 55)

<?xml version="1.0" ?>
<methodCall>
  <methodName>funktion.add</methodName>
  <params>
    <param>
      <value>
        <i4>4</i4>
      </value>
    </param>
    <param>
       <value>
         <i4>5</i4>
       </value>
     </param>
   </params>
</methodCall>
Im Tag value wird auch die Beschreibung

von welcher Datentyp der Wert ist

Einfache Datentypen
– "int" bzw. "i4"
   Wertebereich 32-bit von - 2,147,483,648 bis 2,147,483,647 
– "boolean"
   Wert O und 1 zugelassen
   machmal auch false|true
– "string"
   beachten bei XML valid
   &      &amp;
   '      &apos;
   <      &lt;
   >      &gt;
   "      &quot;
   ASCII oder Unicodeumfang hängt vom Server ab.
– "double"
   Realzahlen 	64-bit
   Kein Inf, -Inf, NaN, keine Exponenten.
   Der tatsächliche Wertebereich hängt vom Server ab
– "dateTime.iso8601"
   Formatvorgabe YYYYMMDDThh:mm:ss
– "base64"
   String wird base64-Codierung umgewandelt
   Beschreibung in RFC 2045
Der Server berechnet die Antwort und sendet das Ergebnis als

XML Daten an den Client zurück

<?xml version="1.0" ?>
<methodResponse>
  <params>
    <param>
      <value>
        <i4>9</i4>
      </value>
    </param>
  </params>
</methodResponse>
<?xml version="1.0" ?>
<methodResponse>
  <params>
    <param>
      <value>
        <string>HelloRubyuser</string>
      </value>
    </param>
  </params>
</methodResponse>
<?xml version="1.0" ?>
<methodResponse>
  <params>
    <param>
      <value>
        <string>shutdown</string>
       </value>
     </param>
   </params>
</methodResponse>