Seite 1 von 1

XML-RPC-Server -> Client zwingend Python?

Verfasst: Mittwoch 27. Februar 2008, 11:41
von droptix
Wenn ich nun einen Server schreiben will, mit dem verschiedenste Clients kommunizieren können sollen, dann denke ich dabei als erstes an einen XML-RPC-Server. Die Frage, die sich mir dabei stellt: Es werden ja offensichtlich Python-Objekte zwischen Server und Client übertragen, also z.B. auch Listen und Dictionaries, die Python-spezifisch sind und von anderen Programmiersprachen nicht "erkannt" werden.

Muss der XML-RPC-Client demnach zwingend auch in Python geschrieben sein oder kann man einen Universal-Server bauen, bei dem man sich auch als C- oder Java-Client anmelden kann? Was würde mit Return-Werten als Liste/Dict passieren?

Verfasst: Mittwoch 27. Februar 2008, 12:00
von BlackJack
Es werden keine Python-Objekte übertragen, sondern Datentypen die XML-RPC kennt. Die müssen natürlich irgendwie auf Python-Objekte abgebildet werden.

XML-RPC kennt als Datenstrukturen `struct`, das sind Schlüssel/Wert-Paare, und `array`. `struct` wird in Python als `dict` dargestellt und `array` als Liste. In anderen Sprachen müssen `struct` und `array` halt auf entsprechende Strukturen in den Sprachen abgebildet werden. Zum Beispiel in Java auf Objekte, die `java.util.Map` und `java.util.List` implementieren.

Re: XML-RPC-Server -> Client zwingend Python?

Verfasst: Mittwoch 27. Februar 2008, 12:21
von gerold
droptix hat geschrieben:Es werden ja offensichtlich Python-Objekte zwischen Server und Client übertragen
Hallo droptix!

Es wird nur Text übertragen:

Code: Alles auswählen

>>> import xmlrpclib
>>> d = {"first_name": "Rudolf", "last_name": "Winter"}
>>> l = ["a", "b", 1, 2, d]
>>> print xmlrpclib.dumps((l,))
<params>
<param>
<value><array><data>
<value><string>a</string></value>
<value><string>b</string></value>
<value><int>1</int></value>
<value><int>2</int></value>
<value><struct>
<member>
<name>first_name</name>
<value><string>Rudolf</string></value>
</member>
<member>
<name>last_name</name>
<value><string>Winter</string></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>

>>>
mfg
Gerold
:-)

Re: XML-RPC-Server -> Client zwingend Python?

Verfasst: Mittwoch 27. Februar 2008, 13:31
von droptix
Ah, cool. Also kann ich davon ausgehen, dass ein Client in einer anderen Sprache die XML-RPC-Syntax versteht.

Sowas hab ich schon öfter gesehen und einfach abgetan, nun frag ich aber mal: Was soll das Übergeben eines Tupels mit einem abschließenden Komma ohne zweiten Wert?
gerold hat geschrieben:

Code: Alles auswählen

print xmlrpclib.dumps((l,))

Verfasst: Mittwoch 27. Februar 2008, 13:34
von Rebecca
Das hier ist kein Tupel, sondern ein Integer, der (ueberfluessigerweise) geklammert wird: Erst so wird's ein Tupel:

Re: XML-RPC-Server -> Client zwingend Python?

Verfasst: Mittwoch 27. Februar 2008, 13:35
von BlackVivi
droptix hat geschrieben:Ah, cool. Also kann ich davon ausgehen, dass ein Client in einer anderen Sprache die XML-RPC-Syntax versteht.

Sowas hab ich schon öfter gesehen und einfach abgetan, nun frag ich aber mal: Was soll das Übergeben eines Tupels mit einem abschließenden Komma ohne zweiten Wert?
gerold hat geschrieben:

Code: Alles auswählen

print xmlrpclib.dumps((l,))

Code: Alles auswählen

>>> ("wert")
'wert'
>>> type(("wert"))
<type 'str'>
>>> ("wert",)
('wert',)
>>> type(("wert",))
<type 'tuple'>
Dürfte klar sein.