Die Programmiersprache Ruby

Blog| Forum| Wiki  

XMLRCP kann mit Hilfe des HTTP Protokoll Daten von einen Client zu einem Server schicken.
Beschreibung des Verbindungaufbau.
Der Server wird mit einer Portangabe gestartet und wartet dann auf Anfragen von Clienten.
Der Client wird mit der IP oder Internetbezeichnung sowie Port des Server aufgerufen.
Der Client schickt ein Datenparket was den HTTP Protokoll unterliegt, mit Methode und die dazugehörigen Argumente zum Sever.
Beispiel
aus Ruby code

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

wird ein HTTP Anfrage mit der XML Nachricht

1
2
3
4
5
6
7
8
9
10
POST /RPC2 HTTP/1.1
Accept: */*
Connection: keep-alive
Content-Type: text/xml; charset=utf-8
User-Agent: XMLRPC::Client (Ruby 1.8.6)
Host: localhost:8080
Content-Length: 182

<?xml version="1.0" ?><methodCall><methodName>funktion.add</methodName>
<params><param><value><i4>45</i4></value></param><param><value><i4>55</i4></value></param></params></methodCall>

Der Server bearbeitet die Anfrage wertet die XML nachricht aus und schickt das Ergbnis zum Client zurück.
Beispiel
aus der Xml Nachricht

1
2
3
s.add_handler("funktion.add") do |a,b|
  a + b
end

Dies ist HTTP Anwort mit der XML Nachricht

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK 
Connection: Keep-Alive
Date: Thu, 05 Nov 2009 11:39:31 GMT
Content-Type: text/xml; charset=utf-8
Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-03-13)
Content-Length: 113

<?xml version="1.0" ?><methodResponse><params><param><value><i4>100</i4></value></param></params></methodResponse>


ein ausführliches Beispiel

Image:XMLRPC.gif

SchrittErklärungCode
1 XMLRPC Server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
1
2
3
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" ?>
<methodCall>
  <methodName>funktion.add</methodName>
  <params>
    <param>
      <value>
        <i4>45</i4>
      </value>
    </param>
    <param>
       <value>
         <i4>55</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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" ?>
<methodCall>
  <methodName>funktion.add</methodName>
  <params>
    <param>
      <value>
        <i4>45</i4>
      </value>
    </param>
    <param>
       <value>
         <i4>55</i4>
       </value>
     </param>
   </params>
</methodCall>
Im Tag value wird auch die Beschreibung

von welcher Datentyp der Wert ist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" ?>
<methodResponse>
  <params>
    <param>
      <value>
        <i4>100</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>
3 Ergebnis auf der Clientseite
1
2
45 + 55 = 100
HelloRubyuser