Hlavní navigace

Zope a XML-RPC: komunikace mezi Zope servery a webovými službami

David Marko

V minulém článku jsme si ukázali, jaké možnosti má Zope server v roli serveru XML-RPC. Dnes se podíváme na to, jak je možno prostřednictvím XML-RPC komunikovat mezi dvěma Zope servery. Povíme se také trochu o webových službách a ukážeme si, jak takovou jednoduchou službu vytvořit.

XML-RPCProxy

Pokud chcete zajistit vzájemnou komunikaci dvou a více Zope serverů, máte v zásadě dvě možnosti: použít vlastní (Zope) rozhraní pomocí tzv. Zope klienta, nebo použít XML-RPC. Zde existují opět dvě varianty: buď si vytvoříte externí script, který bude v sobě implementovat potřebnou logiku a funkčnost, nebo použijete předpřipravený produkt s názvem XML-RPCProxy. A o této druhé variantě si nyní povíme něco více.

Jak již bylo řečeno, Zope server v sobě nativně podporuje serverovou část XML-RPC protokolu. Aby mohly spolu komunikovat dva Zope servery, potřebujeme implementovat XML-RPC klienta. XML-RPCProxy poskytuje právě tyto služby.

Instalace XML-RPCProxy

XML-RPCProxy patří do kategorie tzv. ‚Products‘, tzn. jedná se rozšiřující moduly instalující se na úrovni souborového systému. V našem případě to bude mírně složitější.

  1. Stáhněte si XML-RPCProxy. Jedná se o dva soubory: XMLRPCProxyBase.tgz a XMLRPCProxy.zexp
  2. Archiv XMLRPCProxyBase.tgz rozbalte do adresáře lib/python/Products ve vaší instalaci Zope.
  3. Soubor XMLRPCProxy.zexp uložte do adresáře import ve vaší instalaci Zope.
  4. Restartujte Zope.
  5. Přihlašte se do prostředí Zope jako ‚Manager‘ a v ‚Products/Control Panel‘ proveďte import souboru ‚XMLRPCProxy.zexp‘

Nyní by se vám v drop-down menu v prostředí Zope měla mezi dostupnými moduly objevit i XMLRPCProxy.

Instalace je za námi. Co dál?

Abychom mohli možnosti XMLRPCProxy využít, musíme vytvořit její instanci v databázové struktuře Zope. To provedeme jednoduchým přidáním prostřednictvím drop-down menu do nějakého zvoleného adresáře.

Záložka ‚Properties‘

Zde máme možnost nastavit dvě zásadní informace:

  1. ‚URL‘ – určuje adresu objektu, na který budeme přes XML-RPC přistupovat (např. http://server1/pu­blic)
  2. 2. ‚ValidMethodList‘ – zde specifikujeme seznam objektů, které budou pro vzdálené volání přístupné. Na jednotlivé řádky napíšeme názvy těchto objektů např.

    dostupnostSklad

    objednaniSklad

Kliknutím na tlačítko ‚Save options‘ nastavení uložíme. Tak, a to je vše z hlediska instalace a konfigurace XML-RPCProxy. V záložce ‚Call External Method‘ máme možnost vyzkoušet funkčnost. Do zobrazeného políčka napíšeme název vzdáleného objektu a po nakliknutí na ‚Execute‘ se zobrazí výsledek.

Příklady

Server poskytující XML-RPC služby

Mějme Zope server na počítači se jménem ‚server-sklad‘. Ten bude pro své okolí kromě jiného poskytovat služby XML-RPC serveru a bude tak poskytovat informace o dostupnosti požadovaných položek. K tomuto účelu máme vytvořený skript s názvem ‚dostupnostSkla­dem‘. Skript očekává dva parametry: kód položky a požadovaný počet kusů (pn,pcs). Návratovou hodnotou je buď prázdný řetězec, což znamená, že zboží je skladem v požadovaném počtu, a nebo informace o tom, že zboží skladem není plus informace o dostupnosti.

Skript máme umístěný v adresáři public. Celá cesta k němu je http://server-sklad/public/dos­tupnostSkladem.

Z hlediska zabezpečení je potřeba zajistit, aby měl anonymní uživatel k objektu přístup.

Server využívající služeb XML-RPC serveru

Nyní se přesuňme na jiný Zope server, který bude chtít služeb serveru předchozího využít.

Vložme prostřednictvím drop-down menu do zvoleného adresáře objekt ‚XMLRPCProxy‘ a nazvěme jej ‚proxy‘. Uvnitř takto vytvořeného objektu vyplňme parametry:

URL = http://server-sklad/public/
ValidMethodList = dostupnostSkladem

Nyní můžeme již služeb XMLRPCProxy využít. Vytvořme si ve stejném adresáři skript s názvem ‚zjisti_dostup­nost‘. Zdrojový kód bude vypadat takto:

## Script (Python) "zjisti_dostupnost"

##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=pn,pcs
##title=
##
request = container.REQUEST
RESPONSE = request.RESPONSE

res=container.proxy.callRemoteMethod('dostupnostSkladem',
    pn,pcs)
return res

Pokud bychom chtěli volat vzdálenou službu s pevnými parametry, může volání vypadat následovně:

res = container.proxy.callRemoteMethod('dostupnostSkladem',
    'PD345DE',10)

Použité volání znamená, že zjišťujeme dostupnost produktu s kódem ‚PD345DE‘ v množství 10 kusů.

Pokud vše funguje, můžeme si gratulovat. Vytvořili jsme svou první implementaci webové služby (web services).

Že nevíte, co jsou web services (webové služby)?

Nejjednodušší vysvětlení je, že se jedná o programy na vašem serveru, které může využít kdokoliv jiný. Pokud např. nyní poskytujete na svých stránkách informace o cenách letenek nebo o počasí, pomocí web services mohou tyto údaje zpracovávat programy umístěné na jiných serverech či klientech. Pokud tedy prodáváte letenky, typickou webovou službou bude funkce, které zašlete informaci o odletové a cílové destinaci, a jako výsledek vám bude vrácen seznam dostupných volných letů. Tyto údaje pak můžete zapracovat do své vlastní podoby na svých vlastních stránkách nebo např. uvnitř intranetu.

Použití XML-RPC k vytváření webových služeb

XML-RPC přes HTTP → webové služby

HTML přes HTTP → html stránky

Možností použití je obrovské množství. Pomocí webových služeb nemusejí ostatní informace z vašeho serveru pouze vytahovat, ale můžete si implementovat např. možnost vytváření objednávek přímo do vašeho systému. Jak již bylo řečeno v předchozím článku, k webovým službám v podání serveru Zope je možno omezit přístup tak, že např. k zadání objednávky potřebuje klient uživatelské jméno a heslo.

Velkou výhodou implementace web services na serveru Zope je nativní implementace XML-RPC v základní instalaci. Pokud si postupně necháte vytvořit intranetový systém pro vnitrofiremní použití, můžete jej následně otevřít i pro okolní svět. A to bez složitých předělávek, vytváření různých přemostění atp.

Odkazy

Zde si můžete stáhnout Zope server

Zde naleznete xmlrpclib knihovnu

Řešení založená na aplikačním serveru Zope

Našli jste v článku chybu?