XML-RPC-Server -> Client zwingend Python?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Mittwoch 27. Februar 2008, 11:41

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?
BlackJack

Mittwoch 27. Februar 2008, 12:00

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 27. Februar 2008, 12:21

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Mittwoch 27. Februar 2008, 13:31

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,))
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 27. Februar 2008, 13:34

Das hier ist kein Tupel, sondern ein Integer, der (ueberfluessigerweise) geklammert wird: Erst so wird's ein Tupel:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Mittwoch 27. Februar 2008, 13:35

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.
Antworten