Hlavní navigace

Jabber - komunikačný protokol (8)

Peter Sivák

Existuje veľa spôsobov, ako vytvoriť vzdialené volanie procedúr (RPC). Zrejme tým najjednoduchším je použitie XML-RPC. A práve jeho kombinácia s XMPP bude témou poslednej časti tohto seriálu.

Volania procedúr sú súčasťou takmer každého softvérového systému. Logickým rozšírením volania procedúr na jednom počítači sú vzdialené volania procedúr. Pomocou nich môže program využívať procedúry, ktoré bežia na inom počítači. Nevýhodou vzdialeného volania je samozrejme pomalšie spracovanie.

Procedúra má svoj názov, parametre a návratovú hodnotu. Názov a parametre sa najprv musia preložiť do formátu, ktorému rozumie vzdialený počítač. Takýchto formátov je viac – od jednoduchchého XML-RPC, cez zložitejší SOAP, až po komplexné poňatie v technológii CORBA.

Vo svete XML sa najčastejšie používa XML-RPC a SOAP, pričom SOAP poskytuje niekoľko zaujímavých vlastností navyše oproti XML-RPC. Sú to napr. pomenované štruktúry a polia, vytváranie vlastných dátových typov a používanie rôznych znakových sád. XML-RPC má na druhej strane veľmi jednoduchú (a krátku) špecifikáciu. XML-RPC vytvorili vývojari v UserLand Software, Inc. a SOAP pochádza z World Wide Web Konzorcia (W3C).

SOAP aj XML-RPC opisujú štruktúru odosielaných dát. Na prenos používajú najčastejšie protokol HTTP. Viacerým vývojárom však vlastnosti HTTP nepostačujú a snažia sa experimentovať s inými transportnými protokolmi. Keďže RPC je založené na odosielaní správ (klient pošle požiadavku a vráti sa odpoveď), vhodnými kandidátmi na prenosový protokol sú rôzne messagingové protokoly. Rozšírenie XMPP o XML-RPC je už schválené. SOAP pomocou XMPP sa ešte diskutuje a protokol je zatial experimentálny. V ďalšom texte si opíšeme XML-RPC a jeho použitie s XMPP bližšie.

XML-RPC

XML-RPC používa element <methodCall/> na volanie vzdialenej procedúry a <methodResponse/> na vrátenie výsledku. Napr. volanie procedúry, ktorá vracia čítanosť článku, by mohlo vyzerať takto:

<methodCall>
  <methodName>article.getHitCount</methodName>
  <params>
    <param>
      <value><i4>2316</i4></value>

    </param>
  </params>
</methodCall>

Volanie procedúry obsahuje jej názov a parametre (v tomto prípade číslo článku). Parameter má priradený typ. Ak by nemal, tak sa implicitne predpokladá reťazec. XML-RPC používa tieto jednoduché typy:

  • <i4> alebo <int> pre 32bitové celé číslo so znamienkom
  • <boolean>
  • <string>
  • <double>
  • <dateTime.iso8601> pre dátum/čas vo formáte ISO 8601
  • <base64> je formát na zakódovanie binárnych dát, tak aby mohli byť prenášané v XML

Zo zložených dátových typov sa v XML-RPC využívajú iba štruktúry a polia. Nevýhodou je, že sa nedajú pomenovať a rozlišujú sa len podľa poradia medzi parametrami. Štruktúry môžu obsahovať ďalšie štruktúry.

<struct>
  <member>
    <name>Name</name>
    <value><string>Jabber - komunikačný protokol</string></value>
    </member>
  <member>
    <name>Part</name>
    <value><i4>8</i4></value>
    </member>
</struct>

<array>
  <data>
    <value>Hardware</value>
    <value>Software</value>
    <value>Internet</value>
    <value>Bezpečnost</value>
  </data>
</array> 

Nasleduje príklad odoslania návratovej hodnoty v elemente <methodResponse/>

<methodResponse>
  <params>

    <param>
      <value><i4>1896</i4></value>
    </param>
  </params>
</methodResponse>

XML-RPC pomocou XMPP

XMPP používa na prenos XML-RPC požiadaviek elemet <iq/> typu „set“. Odpovede sa odosielajú v <iq/> elemente typu "result. XMPP streamy používajú UTF-8 – predpokladá sa teda, že aj dáta v XML-RPC sú takto kódované.

<iq type='set' to='...' id='1'>

  <query xmlns='jabber:iq:rpc'>
    <methodCall>
      ...
    </methodCall>
  </query>
</iq>

<iq type='result' to='...'
         from='...' id='1'>

  <query xmlns='jabber:iq:rpc'>
    <methodResponse>
      ...
    </methodResponse>
  </query>
</iq>

Implementácia XML-RPC pomocou XMPP v Perle je v triedach Jabber::RPC::Client a Jabber::RPC::Ser­ver, ktoré sú prístupné cez archív CPAN. Vytvorenie RPC servera znamená len vytvorenie inštancie spomínanej triedy a prepojenie s Perlovou procedúrou. Príklad je tu.

Na vytvorenie klienta treba zadať adresu XMPP servera, autentizačné údaje a JID RPC servera, ktorému budeme posielať volanie procedúry. Následne zavoláme procedúru a výsledok vypíšeme. Tu je príklad:

use Jabber::RPC::Client;

# Pripojenie sa na XMPP server
my $client = new Jabber::RPC::Client(
  server    => 'jabber.sk',
  identauth => 'user:password',
  endpoint  => 'jrpc.server.sk/rpc-server',
);

# vzdialené volanie procedúry (RPC)
my $result = $client->call('article.getHitCount', 2316);
print $result, "\n";

Záver

XML-RPC ponúka jeden z najjednoduchších spôsobov volania procedúry bežiacej na inom počítači. Vlastnosti XMPP ako smerovanie správ a jednoduché nastavenie šifrovanie (SSL) ho vhodne dopĺňajú.

Toto je zároveň aj koniec seriálu o protokole XMPP a jeho rozšíreniach. Jeho cielom bolo popísať Jabber ako komunikačnú platformu vhodnú na vytváranie aplikácii, ktoré vyžadujú distribuovaný prístup.

Našli jste v článku chybu?