Šiuolaikinis tinklapis ar tinklo tarnyba, arba jos teikiamų paslaugų dalis jau nebegali apsieiti be poreikio perduoti ar gauti duomenis iš trečios šalies nutolusio serverio. Kaip pavyzdį galėčiau pateikti mums visiems žinomą BLOGas.lt ir galimybę parašyti naują įrašą nenuėjus į tinklalapį, o paleidus savo kompiuteryje taikomąją programą, kuri gali turėti žymiai daugiau galimybių nei standartinis blogas.lt redaktorius (pavyzdžiui, išsaugoti tarpinę įrašo versiją dingus interneto ryšiui ar pritrūkus laiko parašyti, peržiūrėti sugeneruotą HTML žymėjimą, ar dar ką nors, ką tokios programinės įrangos kūrėjai sugalvos). Panašią programinę įrangą pavadinimu Semagic turi garsusis blogų portalas LiveJournal.com.
Tai ne vienintelė užduotis, gali būti ir paveiksliukų generavimas, sudėtingų skaičiavimų atlikimas, duomenų sinchronizavimas ar patikrinimas - viskas priklauso nuo projekto ir užduoties.
Dar vienas svarbus dalykas - serveryje gali būti kita programavimo kalba ir kitos programuotojų komandos sukurtas produktas (baisoka, jei pirmą kartą susiduriate su šia užduotimi). O galbūt būtent Jūs esate to serverio/tarnybos plėtros vadovas ar atsakingas asmuo, kuriam reikia suprojektuoti tokią galimybę? Ką gi, aš pabandysiu jums padėti.
Taigi Jums teks sukurti dokumentuotą sąsają, kuri leis kitiems atlikti tam tikrus veiksmus Jūsų serveryje. Jei norite tai padaryti, Jūs galite sukurti visiškai naują savo protokolą arba pasinaudoti jau sukaupta programuotojų patirtimi ir technologija (pavyzdžiui, standartinių HTTP protokolų, XML perdavimų per HTTP, JSON duomenų perdavimų per HTTP). Jei pastebėjote, labiausiai paplitęs šio metu yra HTTP protokolas, kurį teisingai išnaudojant galima pasiekti gan gerų rezultatų.
Vienas iš galimų sprendimų iš praeito amžiaus - XML-RPC
Vienas iš populiarių sprendimų šiam klausimui buvo sukurtas praeitame amžiuje, 1998 metais ir vadinasi XML-RPC (http://en.wikipedia.org/wiki/XML-RPC, http://www.xmlrpc.com/). Tai HTTP protokolų XML kalba perduodami duomenys pagal tam tikrą standartą. Angliškai tai skamba: Extensible Markup Language - Remote Procedure Call, o į lietuvių kalbą aš išversčiau taip: Išplečiama žymėjimo kalba - Nuotolinių procedūrų iškvietimas. Gan daug apie save pasakantis pavadinimas.
Viskas veikia elementariai, dėl to man jis ir patinka: Jūs pagal XML-RPC specifikaciją suformuojate XML struktūrą, kurioje nurodote kurią procedūrą reikia iškviesti ir kokius parametrus bei kokio tipo perduoti; atsakymas turėtų būti irgi suformuotas pagal XML-RPC specifikaciją.
XML-RPC numato šiuos duomenų tipus:
- array - standartinis masyvas
- base64 - Pagal base64 algoritmą užkoduoti dvejetainiai duomenys
- boolean - loginis, taip arba ne (angl., true arba false)
- date/time ISO 8601 formatas
- double - realusis skaičius
- integer - sveikasis skaičius
- string - standartinė eilutė
- struct - struktūra, dar mums žinoma kaip asociatyvus masyvas (angl.: associative array)
- nil - NULL/NIL reikšmę perduodantis tipas, kurį palaiko, deja, ne visi, nes jis buvo įvestas žymiai vėliau.
Užklausos pavyzdys
POST /xmlrpc HTTP/1.0 User-Agent: MyXMLRPCClient/0.0.1 (WinNT) Host: www.example.com Content-Type: text/xml Content-length: 201 <?xml version="1.0"?> <methodCall> <methodName>examples.getMd5</methodName> <params> <param> <value><string>my string for md5 example</string></value> </param> </params> </methodCall>
Atsakymo pavyzdys
HTTP/1.1 200 OK Connection: close Content-Length: 173 Content-Type: text/xml <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>51623451f2bf91c09db8d51660b1ed60</string></value> </param> </params> </methodResponse>
Taip, pavyzdyje yra pateiktos ne pilnos HTTP antraštės (angl., header), parodyti tik esminiai skirtumai tarp paprastos HTTP užklausos, skirtos HTML turiniui gauti ir darant XML-RPC užklausos.
Veikiantis pavyzdys
Viena iš labiausiai paplitusių programavimo kalbų yra PHP, dabar prie šio “formulių interpretatoriaus” vėl nukreiptos akys ir viskas dėl Zend ir partnerių kuriamo Zend Framework. Smagus ir galingas įrankių rinkinys, skirtas kurti ne tik tinklalapiams, bet ir paprastoms taikomosioms programoms. Mažiau kalbų, daugiau kodo.
Zend Framework pagalba XML-RPC serverį galima sukurti labai greitai ir lengvai, tereikia sukurti klasę su statiniais metodais arba elementarią funkciją, kuri bus kviečiama. Štai XML-RPC serverio pavyzdys:
<?php /** * Md5 generator * * @param string $str * return string */ function getMd5 ( $str) { return md5 ( $str); } class MyClassExample { /** * Md5 generator * * @param string $str * return string */ function getMd5 ( $str) { return md5 ( $str); } } require_once 'Zend/XmlRpc/Server.php'; $server = new Zend_XmlRpc_Server(); $server->addFunction('getMd5'); $server->setClass('MyClassExample', 'example'); header('Content-type: text/xml; charset=utf-8'); echo $server->handle(); ?>
Čia yra yra paprastas XML-RPC serveris, kuris parodo, kaip per klasę arba funkciją sukurti XML-RPC tarnybą, kuri grąžina perduoto argumento suspaudimo su praradimais rezultatą pagal MD5 algoritmą.
Kaipgi į jį kreiptis su Zend Framework? Viskas labai paprasta - paimate savo mėgstamą programavimo kalbą (mano atveju PHP + Zend Framework). Štai kaip tai daroma su Zend Framework:
<?php header('Content-type: text/plain; charset=utf-8'); require_once 'Zend/XmlRpc/Client.php'; $client = new Zend_XmlRpc_Client('http://localhost:8080/md5example/server/'); var_dump( $client->call( 'getMd5', array ( 'my string for md5 example' ) ) ); echo "\n"; var_dump( $client->call( 'example.getMd5', array ( 'my string for md5 example' ) ) ); ?>
Kaip matote, nėra nieko sudėtingo. Tiems, kas bandys kurti kažką sudėtingesnio su Zend Framework ir XML-RPC norėčiau perspėti, kad Zend_XmlRpc dar turi keletą klaidų, kurios gali labai skaudžiai Jums įspirti. Kol kas (kalba apie Zend Framework 1.5 RC1) iš serverio Jūs negalėsite grąžinti nieko išskyrus standartinio PHP string, integer, double, boolean ir array. O norint perduoti kaip argumentą base64 jums teks sukurti masyvą:
<?php $client->call( 'test.setString', array ( array ( 'value' => 'Test', 'type' => 'base64') ) ); ?>
Pastaba: Aš bandžiau susisiekti su Zend ir pranešti apie galimus pataisymus bei perdaviau jiems ištaisytą kodą, žiūrėsim kas gausis, gal su Zend Framework 1.5 Final (SVN trunk paskutinioji versija vis dar turi šią klaidą) jie ištaisys šias problemas.
Realaus gyvenimo išgalvotas pavyzdys
Pabaikime su blogas.lt fantazijom apie XML-RPC tarnybą. Įdomu, jei jie turėtų tokią galimybę, ar atsirastų pirmas lietuviškas XML-RPC klientas, skirtas bloginimui?
Sakykim, jei blogas.lt sukurtų štai tokią paprastą XML-RPC API (application programming interface):
-
blogaslt.login - prisijungimo veiksmas
- parametras “prisijungimo vardas”, string
- parametras “slaptažodis”, string, užkoduotas
- rezultatas - false, jei nepavyko prisijungti, gali būti klaidos pranešimas arba specialus prisijungimo ID
-
blogaslt.ping - patikrinam, ar mūsų prisijungimas dar gyvas, taip pat pratęsiame jo galiojimą
- parametras “prisijungimo ID”
- rezultatas - true, jei sesija galioja, false jei negalioja
-
blogaslt.post - nusiunčiame naują įrašą į sistemą
- parametras “prisijungimo ID”
- parametras “antraštė”, string, įrašo antraštė
- parametras “tekstas”, string, įrašo
- parametras “kitas nustatymas”, deja, nesu gerai susipažinęs su blogas.lt vartotojo sąsaja
- rezultatas - true, jei įrašas patalpintas, false, jei nepatalpintas
-
blogaslt.list - mūsų įrašų sąrašas
- parametras “prisijungimo ID”
- rezultatas būtų įrašų masyvas, kur yra įrašo ID ir įrašo antraštė
-
blogaslt.get - gauname įrašo duomenis
- parametras “prisijungimo ID”
- parametras “įrašo ID”
- rezultatas būtų įrašas: jo ID, antraštė, tekstas, kiti nustatymai arba pranešimas apie klaidą
-
blogaslt.update - įrašo atnaujinimas, profesionaliam blogeriui gan retas veiksmas naudojant taikomąją programą
- parametras “prisijungimo ID”
- parametras “įrašo ID”
- parametras “antraštė”, string, įrašo antraštė
- parametras “tekstas”, string, įrašo
- parametras “kitas nustatymas”
- rezultatas - true, jei įrašas patalpintas, false, jei nepatalpintas
-
blogaslt.logout - išeiname iš sistemos
- parametras “prisijungimo ID”
- rezultatas - true, jei atsijungė, false arba klaidos pranešimas, jei nepavyko atsijungti (o ką, ir taip būna)
XML-RPC klientą galima būtų šiai tarnybai sukurti su .NET, Delphi, Python, PHP+PHP-GTK, JAVA, Perl, Ruby, dar kas nors žinoma? Gal kas pratęskite komentaruose ši sąrašą.
Vietoj pabaigos
Ne, aš nedirbu blogas.lt, nesu su jais susijęs ir tai nėra blogas.lt reklama, jie yra tik geras pavyzdys XML-RPC panaudojimui. Taip, ten yra mano paskyra, bet jos aš nenaudoju. Taip, pirmomis dienomis mano paskyra buvo uždaryta šitam portale už tai kad tik CSS pagalba buvau panaikinęs jų viršutinę juostą.
Tai kas yra viršuje - tik pavyzdys ir dar vienas bandymas supažindinti Jus su dar viena technologija. Taip, jį galima (o gal ir reikia) kritikuoti. Ačiū visiems, kas perskaitė šį straipsnį ir išsakė savo nuomonę, pasiūlymus bei pastabas.
Pastaba: Nereikia stebėtis, jos sprendimas yra iš praeito amžiaus - daugelis šiuo metu naudojamų algoritmų yra išrasti prieš kokius 50 metų.
Pastaba: Taip, rašydamas šį straipsnį spėjau prablaivėti, todėl pradžia taip skiriasi nuo pabaigos.
2008-03-03 | 19:58
o ką galima dar naudoti be Zend Framework’o? t.y. ką patartum?
2008-03-03 | 20:41
[…] burbulas po truputį bliūkšta. • Kuo skiriasi kredito pesimizmas nuo akcijos optimizmo. • Blogas.lt verkiant reikia API… • Kodėl FlyLAL bijo velnio? • Viskas gerai, kas aštru ir su […]
2008-03-03 | 21:24
lfx: Ta programavimo kalbą ar karkasą, kuri naudojate ir geriausiai žinote arba turite po ranką ir ji/jis gali patenkinti Jūsų poreikius. XML suformuoti ir perskaityti XXI amžiuje gali daugėlis kalbų, padaryti HTTP užklausą su reikiamomis antraštėmis irgi daug kas gali (be to visi standartai yra atviri). Toki reikalą gali apdoroti serverio puseje irgi ne viena programavimo kalba - todėl rinkitės tai ką Jus geriausiai žinote. Be to daugelis programavimo aplinkų ar karkasų turi paruoštu muodolių darbui su XML-RPC. Tad išradinėti dviračio Jums neteks.
2008-03-19 | 14:12
Galite pasveikinti, i Zend Framework 1.5 leidimą įejo ir mano 3 eilutės kodo, ištaisiusios mano minėta klaidą.