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
| Schritt | Erklärung | Code
|
| 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
& &
' '
< <
> >
" "
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 |
|