Pokud používáte aplikační server, po nějakém čase pravděpodobně dospějete k situaci, kdy s ním budete potřebovat komunikovat z nějakého jiného programu, z jiného počítače, popřípadě budete mít více instalací aplikačního serveru na více počítačích a budete potřebovat zajistit komunikaci mezi nimi.
Takovýchto komunikačních rozhraní je vyvíjeno (a více či méně používáno) několik. Hodně se hovoří a píše například o SOAP rozhraní, které tyto požadavky umožňuje řešit. Jako však i v jiných oblastech jsou technologie, o kterých se hodně píše, ale již méně je najdete v konkrétních řešeních. Důležitým faktorem pro rozšíření je vždy snadnost implementace a následného použití.
Zope server v sobě standardně implementuje rozhraní nazývané XML-RPC server. Jedná se o jednoduchý a zároveň velmi mocný nástroj, jehož pomocí můžete vytvářet distribuované systémy schopné komunikace mezi sebou. XML-RPC server je v Zope serveru integrován do vrstvy protokolu HTTP a jeho použití je zcela transparentní. Tímto způsobem lze pomocí XML-RPC klienta přistupovat de-facto ke všem objektům, vytvořeným na Zope serveru, bez toho, abyste je museli pro tyto účely upravovat.
Klientská část může být realizována několika způsoby. Pokud používáte scriptovací jazyk Python, máte vyhráno. Pro něj je dostupná knihovna nazvaná ‚xmlrpclib.py‘, která poskytuje potřebné nástroje.
Marshalling a unmarshalling – dvě tajemná slova
Název XML-RPC je tvořen dvěmi slovy. RPC pochází z remote-procedure-call a XML se týká dnes často zmiňované XML technologie. XML-RPC je XML využívané v praxi. Nebojte, abyste XML-RPC mohli používat, nemusíte XML jazyk znát. De-facto se s ním během vytváření komunikace se serverem nesetkáte. K jeho použití dochází uvnitř. Veškeré informace, které na server posíláte nebo ze serveru přijímáte, nemusí být pouze ‚holé‘ textové řetězce, ale můžete prostřednictvím XML-RPC pracovat i s komplikovanějšími datovými strukturami, jako jsou klasická pole či složitější dictionaries. K přenosu těchto datových typů se používá tzv. marshalling či opačně unmarshalling. Jedná se o způsob, jakým jsou data transformována do přenositelné standardizované podoby. V našem případě je to právě XML.
Ale dost teorie. Představme si, že na serveru máme objekt, který vrací seznam uživatelů vyhovujících zaslaným kritériím. Tento objekt má název ‚get_users‘. Jako argument přijímá datovou strukturu, která popisuje kritéria pro vyhledávání.
V interaktivním režimu Pythonu si pak můžeme vyzkoušet, jak takováto transformace vypadá.
# natažení podpůrné knihovny >>> import xmlrpclib # nastavení kritérií >>> par={'pohlavi':'muz','vek':26} # převedení na datový typ 'tuple' >>> tpar=tuple([{'pohlavi':'muz','vek':26}]) # volání metody provádějící převod parametrů do XML >>> vysledek=xmlrpclib.dumps(tpar,'get_users') >>> print vysledek <?xml version='1.0'?> <methodCall> <methodName>get_users</methodName> <params> <param> <value><struct> <member> <name>vek</name> <value><int>26</int></value> </member> <member> <name>pohlavi</name> <value><string>muz</string></value> </member> </struct></value> </param> </params> </methodCall>
Zobrazena je pythonová datová struktura převedená do XML.
Obrácený převod, tzv. unmarhalling, je zajišťován prostřednictvím jiné metody téže knihovny. Máme-li z předchozího příkladu v proměnné ‚vysledek‘ uložen XML objekt, následující metodou provedeme zpětné převedení na původní datový typ.
>>> print xmlrpclib.loads(vysledek)[0][0] ({'vek': 26, 'pohlavi': 'muz'},)
Působivé, že? Přesto se jedná pouze o interní metody, které při běžné práci nevyužijete. A je to tak dobře. Soustředit se můžete více na to, co děláte, a ne, jak to děláte.
Jak tedy klient komunikuje s XML-RPC serverem?
Ukažme si to na příkladu, který může vypadat takto:
Dejme tomu, že na Zope serveru máme v kořenovém adresáři skript s názvem ‚aktualni_cas‘. Ten jako hodnotu vrací naformátované aktuální datum a čas. Jednoduchý PythonScript, který vrací aktuální datum a čas, může vypadat např. takto:
## Script (Python) "aktualni_cas" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters= ##title= ## datum=DateTime().strftime("%d.%m.%Y %H:%M:%S") return datum
Klientská část naprogramovaná v pythonu pak vypadá takto:
# natažení podpůrné knihovny >>> import xmlrpclib # nastavení spojení na server, proměnná 's' je # nyní objektem připojení na server >>> s=xmlrpclib.Server('http://linuxbox') # volání našeho scriptu na serveru (jednoduché, že?) >>> s.aktualni_cas() # vaše metoda vrátí řetězec z aktuálním datumem a časem '6.8.2002 12:30:20' # pokud máte na serveru adresář users a v něm script # nazvaný 'get_users', vypadá volání takto >>> s.users.get_users()
Odkazovat se však můžete i na objekt běžné HTML stránky, a tak následující příklad provede natažení standardní úvodní stránky. Ta je pak k dispozici jako textový řetězec.
>>> import xmlrpclib >>> s=xmlrpclib.Server('http://linuxbox') >>> s.index_html() '<html> <head> <title>Zope </title>\n <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">\n </head> <body bgcolor="#FFFFFF"> ...... <body> </html>\n'
XML-RPC rozhraní neslouží pouze k získávání informací ze serveru, ale funguje plnohodnotně oboustranně, tzn. můžete volat vytvořený objekt s parametrem, který se na straně serveru zpracuje. Samozřejmě jsou stále na straně serveru zohledňována přístupová práva, což v praxi znamená, že k objektu, ke kterému nemáte přístup přes standardní Zope rozhraní, se nedostanete ani přes XML-RPC.
K čemu je možno XML-RPC použít?
V jednoduchosti je síla a zde to platí dvojnásob. Jednoduché použití ve spolupráci se Zope serverem přímo vede k různým implementačním řešením.
U nás například provádíme zálohování prostřednictvím vlastní aplikace naprogramované v pythonu, která vysledek své činnosti zapisuje prostřednictvím XML-RPC do Zope serveru. Ten pak poskytuje uživatelské rozhraní pro prohlížení a při nestandardních stavech je schopen odpovědné osobě zaslat e-mail.
Závěr
XML-RPC v podání Zope serveru je živé a plně funkční řešení. Nemusíte nic doinstalovávat, dodatečně konfigurovat a pak se o to starat. Lehce tak můžete své již vyvinuté aplikace otevřít okolnímu světu a vytvořit tak například bezpečnou vstupní bránu do vašeho skladového systému pro vaše obchodní partnery.
Příště se podíváme na možnost komunikace dvou Zope serverů mezi sebou právě prostřednictvím XML-RPC rozhraní, či jak vytvářet tzv. web-services dostupné pro okolní svět. Dozvíte se také, k čemu je dobrá XML-RPC Proxy a že XML-RPC je otevřenou technologií schopnou zajistit komunikaci např. mezi prostředím PHP a Zope.
Odkazy
Zde si můžete stáhnout Zope server
Zde naleznete xmlrpclib knihovnu
Řešení založená na aplikačním serveru Zope