Š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 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 -

Vienas iš populiarių sprendimų šiam klausimui buvo sukurtas praeitame amžiuje, 1998 metais ir vadinasi (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 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 specifikaciją.

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 užklausos.

Veikiantis pavyzdys

Viena iš labiausiai paplitusių programavimo kalbų yra , dabar prie šio “formulių interpretatoriaus” vėl nukreiptos akys ir viskas dėl Zend ir partnerių kuriamo . Smagus ir galingas įrankių rinkinys, skirtas kurti ne tik tinklalapiams, bet ir paprastoms taikomosioms programoms. Mažiau kalbų, daugiau kodo.

pagalba serverį galima sukurti labai greitai ir lengvai, tereikia sukurti klasę su statiniais metodais arba elementarią funkciją, kuri bus kviečiama. Štai 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 serveris, kuris parodo, kaip per klasę arba funkciją sukurti tarnybą, kuri grąžina perduoto argumento suspaudimo su praradimais rezultatą pagal MD5 algoritmą.

Kaipgi į jį kreiptis su ? Viskas labai paprasta - paimate savo mėgstamą programavimo kalbą (mano atveju + ). Štai kaip tai daroma su :

<?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 ir norėčiau perspėti, kad Zend_XmlRpc dar turi keletą klaidų, kurios gali labai skaudžiai Jums įspirti. Kol kas (kalba apie 1.5 RC1) iš serverio Jūs negalėsite grąžinti nieko išskyrus standartinio 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 1.5 Final (SVN trunk paskutinioji versija vis dar turi šią klaidą) jie ištaisys šias problemas.

Realaus gyvenimo išgalvotas pavyzdys

Pabaikime su fantazijom apie tarnybą. Įdomu, jei jie turėtų tokią galimybę, ar atsirastų pirmas lietuviškas klientas, skirtas bloginimui?

Sakykim, jei sukurtų štai tokią paprastą API (application programming interface):

  1. 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
  2. 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
  3. 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 vartotojo sąsaja
    • rezultatas - true, jei įrašas patalpintas, false, jei nepatalpintas
  4. 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ė
  5. 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ą
  6. 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
  7. 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)

klientą galima būtų šiai tarnybai sukurti su .NET, Delphi, Python, +-GTK, JAVA, Perl, Ruby, dar kas nors žinoma? Gal kas pratęskite komentaruose ši sąrašą.

Vietoj pabaigos

Ne, aš nedirbu , nesu su jais susijęs ir tai nėra reklama, jie yra tik geras pavyzdys 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.

Panašūs straipsniai


“Perduodam duomenis į nuotolinį serverį” komentarų: 4

  1. lfx

    o ką galima dar naudoti be Zend Framework’o? t.y. ką patartum?

  2. Blogorama #353 : nežinau.lt

    […] 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 […]


  3. 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.


  4. Galite pasveikinti, i Zend Framework 1.5 leidimą įejo ir mano 3 eilutės kodo, ištaisiusios mano minėta klaidą.

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.