NePo
Spalis 6, 2006

Kuriam web servisą

Jau sužinojote kaip pasirašyti web serviso klientą, dabar laikas pasirašyti ir patį web servisą. Visi normalūs žmonės greičiausiai pasiimtų C# (+ ASP.NET) ir labai paprastai pasirašytų, bet aš… Tikėjotės prisipažinimo? Nesulauksit.
Žodžiu, aplinkybių verčiamas pradėjau ieškoti galimybių sukurti web servisą su .

Iš pradžių perskaičiau daug dokumentacijos (žiūrėti nuorodas pabaigoje) ir nusprendžiau, kad turiu gyvenime ir įdomesnių užsiėmimų, nei bandyti pačiam sukodinti web servisą pagal visas specifikacijas. Taigi reikėjo pabandyti susirasti kažkieno jau padarytą realizaciją ir pritaikyti sau. Šiuo atveju man pasisekė rasti NuSoap klasę web servisų kūrimui ir aš pademonstruosiu kaip ją pritaikyti savo reikmėm.

Užduotis. Atsimenate, kai kūrėme programą knygų sąrašui peržiūrėti bei redaguoti? Tarkim, kad tą knygų sąrašą norime saugoti kažkur internete, o paskui web serviso kliento pagalba parsisiųsti ir redaguoti.
Pirmiausiai susikurkime duomenų bazės lentelę

CREATE TABLE `books` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL DEFAULT '',
`price` float NOT NULL DEFAULT '0',
PRIMARY KEY  (`id`)
) TYPE=MyISAM;

Tuščia lentelė tikrai mūsų nedomina, todėl įveskime porą reikšmių:

INSERT INTO books VALUES("1", "Davinci code", "19.95");
INSERT INTO books VALUES("2", "Hackers guide", "49.99");
INSERT INTO books VALUES("3", "Leet Talk", "49.99");

Turime duomenų bazę - pabandykim pasirašyti paprastą funkciją. Tarkim, kad knygos pavadinimas yra unikalus laukas ir pabandykime sukurti web servisą, kuriam padavus knygos pavadinimą sužinotume jos kainą.

function getPrice($myName) {
$query = "SELECT price FROM books where name='$myName'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
return $row['price'];
}

Greičiausiai programuoti mokate daug geriau už mane ir šios funkcijos komentuoti nereikia. Dabar pradėsime kurti web servisą.

require('lib/nusoap.php');
$server = new soap_server();
$server->configureWSDL('bookserver', 'http://localhost/soap');
$server->wsdl->schemaTargetNamespace = 'http://localhost/soap';

Pirmoje eilutėje įtraukiame NuSoap klasę, kurią šiuo atveju aš pasidėjau į lib direktoriją. Antroje sukuriame soap_server objektą. Trečioje pradedame generuoti WSDL failą. (WSDL yra speciali kalba XML pagrindu skirta apibūdinti web servisui). O į ketvirtą geriau nežiūrėkite, nes su schemos failu, šiuo atveju, aš paprasčiausiai “cheatinu”.

$server->register("getPrice",
array('simbol'=>'xsd:string'),
array('return' => 'xsd:float'),
'urn:getprice',
'urn:getprice#getPrice');
 
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

Užregistruojame ankščiau sukurtą metodą. Pirmasis masyvas nurodo įėjimus, jeigu atsimenate mes paduosime knygos pavadinimą. Antrasis rezultatus - gausime knygos kainą. Paskutinės eilutės skirtos ateinančiai informacijai į web servisą apdoroti.
Na, štai turime web servisą, reiktų kažkaip įsitikinti, kad jis veikia. Kad nereiktų ilgai sukti galvos pasirašysim patį paprasčiausią klientą, be abejonės, ta pačia kalba.

require('lib/nusoap.php');
$client  = new soapclient('http://localhost/soap/books.php');
$result1 = $client->call('getPrice', 'Hackers guide');
if (!$client->getError()) {
echo " You book price is ". $result1. "
";
}
else {
echo "
<h1>Error: " . $client->getError() . "</h1>
";
}

Kliento atveju pradžia tokia pati kaip ir serverio: įtraukiame NuSoap klasę, susikuriame kliento objektą. Atkreipkite dėmesį, jog šiuo atveju aš adresą nurodau ne bet kokį, nuo lubų nurašytą, o tiksliai tą, kur randasi mano pasirašytas web serveris. Pabandykit, ar jums veikia? Man veikia. Todėl pasakoju toliau. Dabar pabandysim pasirašyti sudėtingesnę funkciją: pagal Id pasiimti visą infromacija apie knygą.

function getBookInfo($myId) {
$query = "SELECT * FROM books where id='$myId' ";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
return $row;
}

Tačiau kaip paaiškėjo tai padaryti nėra taip lengva. Aš nepasakosiu savo kančių ir klaidų siekant gauti tokius paprastus rezultatus, bet iš karto jus nudžiuginsiu kodo segmentais.

$server->wsdl->addComplexType(
'BooksStruct',
'complexType',
'struct',
'all',
'',
array(
'id' => array('name'=>'id', 'type'=>'xsd:int'),
'name' => array('name'=>'name', 'type'=>'xsd:string'),
'price' => array('name'=>'price', 'type'=>'xsd:float'))
);

Kodas turėtų kalbėti pats už save, o kurčnebyliams pabandysiu paaiškinti. Norėdami gauti vieną duomenų bazės lentelės eilutę turim susikurti savo duomenų tipą - struktūrą, sudarytą iš tokių laukų, kokius norime gauti, šiuo atveju: sveikasis - id, simbolių eilutė - name, realusis - price. Na, ir nepamirškime užregistruoti naujai sukurto metodo

$server->register("getBookInfo",
array('simbol'=>'xsd:int'),
array('return' => 'tns:BooksStruct'),
'urn:getbook',
'urn:getbook#getBookInfo');

Atkreipkite dėmesį į tai, kokius rezultatus mums gražina ši funkcija. Neaiškinsiu kaip pasirašyti klientą, tikiuosi sugebėsite tai padaryti pagal mano ankščiau pateiktą pavyzdį.
Ir pabaigai noriu parašyti dar vieną metodą, kuris nereikalautų jokių parametrų, o gražintų visą duomenų bazės lentelės turinį.

function getFullList() {
$query = "SELECT * FROM books ";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{
$rows[] = $row;
}
return $rows;
}

Pasirodo tai padaryti aš apturėjau dar daugiau džiaugsmo nei su fukcija, kurią paaiškinau kiek aukščiau. Kaip manote, kokį rezultatą turėtume paduoti NuSaop klasei apdorojimui? Pašnibždėsiu: struktūrų masyvą.

$server->wsdl->addComplexType(
'BooksData',
'complexType',
'array',
' ',
'SOAP-ENC:Array',
array(),
array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:BooksStruct[]')),
'tns:BooksStruct'
);

Taip… Žinau, atrodo baisiai, bet kito kelio nėra. Ir paskutinis žingsnis užregistruoti sukurtą metodą.

$server->register("getFullList",
array(),
array('return' => 'tns:BooksData'),
'urn:getlist',
'urn:getlist#getFullList');

Štai ir viskas turim web servisą su trimis funkcijomis.

Namų darbai. Pagal mano ankščiau pateiktą straipsnį pabandykite sukurti šitam web servisui klientą. Labai lauksiu jūsų įspūdžių.

Pastaba1: Norėdami, kad jūsų web servisas veiktų, nepamirškite prisijungti prie duomenų bazės.
Pastaba2: Kurdami rimtesnį projektą nepamirškite realizuoti apsaugų.

Parsisiuntimui mūsų sukurtas web servisas +NuSoap

Nuorodos
NuSoap parsisiuntimo puslapis.
Pažintis su NuSoap.
NuSoap oficialus puslapis.
Wiki apie web servisus
Uddi specifikacija
Soap specifikacija
Pažintis su Wsdl

Panašūs straipsniai


“Kuriam web servisą” komentarų: 2

  1. sladex

    JUSU SAITAS COOL ;] taip ir toliau….daug naudingu dalykeliu suzinojau ;]

  2. edisss

    dekui uz si ir kitus pavyzdzius. Tikrai praverte.

Rašyti komentarą

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