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?
XML-RPC-Server -> Client zwingend Python?
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.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo droptix!droptix hat geschrieben:Es werden ja offensichtlich Python-Objekte zwischen Server und Client übertragen
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>
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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?
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,))
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Das hier ist kein Tupel, sondern ein Integer, der (ueberfluessigerweise) geklammert wird:
Erst so wird's ein Tupel:
Code: Alles auswählen
(2)
Code: Alles auswählen
(2,)
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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'>