| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Volßnφ webov²ch slu₧eb z Flashe
V minulΘm Φlßnku jsme si na prvnφm p°φkladu vyzkouÜeli volat vlastnφ slu₧bu, kterou jsme vytvo°ili jako souΦßst serverovΘ strany aplikace. Te∩ se podφvßme na druhΘ vyu₧itφ technologie Flash Remoting û volßnφ webov²ch slu₧eb poskytovan²ch jin²mi servery prost°ednictvφm protokolu SOAP. Jako ukßzku si vytvo°φme jednoduch² m∞nov² kalkulßtor, kter² bude p°i ka₧dΘm v²poΦtu pracovat s aktußlnφmi m∞nov²mi kurzy. Zdrojov² k≤d ukßzky si m∙₧ete stßhnout a v²slednou aplikaci si m∙₧ete takΘ vyzkouÜet.
Ka₧dß webovß slu₧ba je identifikovßna adresou souboru WSDL (Web
Services Description Language). Tak nap°φklad m∙₧eme °φct, ₧e na adrese http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl sφdlφ webovß slu₧ba "CurrencyExchangeService". Ve skuteΦnosti se na tΘto adrese nachßzφ dokument v jazyce WSDL, kter² slou₧φ aplikacφm jako vstupnφ brßna pro volßnφ tΘto slu₧by. Pokud se na tento dokument podφvßme, zjistφme, ₧e popisuje, co p°φsluÜnß webovß slu₧ba d∞lß, jakΘ poskytuje metody, jakΘ vstupnφ parametry tyto metody po₧adujφ a v jakΘ struktu°e mßme oΦekßvat v²sledky. Jazyku WSDL nemusφte rozum∞t, pokud dostanete od poskytovatele webovΘ slu₧by i jejφ popis v "lidskΘm" jazyce. V naÜem p°φpad∞ m∙₧e znφt jednoduÜe takto: Webovß slu₧ba, sφdlφcφ na v²Üe uvedenΘ adrese, poskytuje jedinou metodu, kterß se jmenuje
getRate
, na vstupu po₧aduje nßzvy dvou stßt∙ a na v²stupu vracφ aktußlnφ sm∞nn² kurz mezi m∞nami t∞chto stßt∙.
Jak tuto slu₧bu zavolßme z Flashe? P°ipome≥me si nejprve ·vodnφ °ßdky skriptu, kterΘ jsou stejnΘ jako v p°edchozφ ukßzce:
#include "NetDebug.as"
brana = NetServices.createGatewayConnection
("http://nestor.cz/flashremoting/priklad.php");
Definovali jsme p°ipojenφ k brßn∞ aplikaΦnφho serveru. Z prvnφho Φlßnku tΘto sΘrie vφte, ₧e flashovß aplikace se nep°ipojuje k webov²m slu₧bßm p°φmo, ale p°es aplikaΦnφ server hostujφcφ technologii Flash Remoting. Proto vßs nep°ekvapφ, ₧e adresa je stejnß jako v p°edchozφ ukßzce.
Dostßvßme se k °ßdku, na kterΘm si od brßny vy₧ßdßme vzdßlenou slu₧bu. K tomu slou₧φ metoda getService
û v minulΘ ukßzce jsme si takto vy₧ßdali slu₧bu Astrologie
, nynφ chceme pracovat s webovou slu₧bou a ta je, jak bylo °eΦeno, identifikovßna p°φsluÜnou adresou souboru WSDL. P°φkaz by m∞l tedy vypadat takto:
"http://www.xmethods.net/
sd/2001/CurrencyExchangeService.wsdl",
this
);
Nßsledujφcφ p°φkaz pro vyvolßnφ metody slu₧by by m∞l vypadat nap°φklad takto:
ProΦ pφÜu "by m∞l"? Proto₧e v²Üe uvedenΘ zatφm bohu₧el platφ pouze v p°φpad∞, ₧e na stran∞ serveru mßme k dispozici originßlnφ Flash Remoting od firmy Macromedia (tedy ColdFusion nebo °eÜenφ pro Javu Φi .NET). My vÜak pracujeme s produktem AMF PHP a ten v souΦasnosti volßnφ webov²ch slu₧eb jeÜt∞ nepodporuje. Auto°i slibujφ implementaci v nejbli₧Üφ dob∞. Nemusφme vÜak na ni Φekat, provizornφ °eÜenφ si velmi snadno vytvo°φme u₧ nynφ sami a jak uvidφme, na stran∞ Flashe bude pot°eba provΘst jen minimßlnφ zm∞ny û prßv∞ ve zp∙sobu, jak²m se odkazujeme na webovΘ slu₧by a jejich metody.
To, co v AMF PHP zatφm chybφ (podpora volßnφ webov²ch slu₧eb p°es SOAP), musφme zφskat jinde. Zamφ°φme tedy na strßnky projektu NuSOAP a stßhneme si aktußlnφ verzi tΘto knihovny. Jednß se o jedin² soubor nusoap.php
, kter² umφstφme do ko°enovΘho adresß°e naÜφ aplikace na serveru. Spojenφ knihoven NuSOAP a AMF PHP pak provedeme tak, ₧e vytvo°φme v naÜφ aplikaci slu₧bu, kterß bude slou₧it jako obecnß zßstupnß slu₧ba (proxy) pro veÜkerß volßnφ webov²ch slu₧eb. Tuto obecnou slu₧bu nazveme WebServices
. V podadresß°i sluzby
naÜeho projektu (tam, kde od minula mßme skript Astrologie.php
) tedy musφme vytvo°it skript WebServices.php
, kter² obsahuje nßsledujφcφ:
include ("nusoap.php");
class WebServices {
function WebServices(){
$this->methodTable = array(
"callService" => array(
"description" => "Volß webovou slu₧bu (SOAP).",
"access" => "remote",
"roles" => "role, list",
"arguments" => array ("wsdl", "metoda", "parametry")
)
);
}
function callService($wsdl, $metoda, $parametry) {
$soapclient = new soapclient($wsdl, "wsdl");
$vysledek = $soapclient->call($metoda, $parametry);
return $vysledek;
}
}
?>
Slu₧ba WebServices
definuje jedinou metodu s nßzvem callService
. Tato metoda mß t°i parametry: adresu webovΘ slu₧by (WSDL), jmΘno volanΘ metody tΘto slu₧by a koneΦn∞ parametry p°edßvanΘ tΘto metod∞ (jako pole). Jak vidφte, metoda callService
neud∞lß nic vφc, ne₧ ₧e zavolß klienta SOAP (knihovnu NuSOAP) a to, co obdr₧φ jako v²sledek, vrßtφ sama jako sv∙j v²sledek.
Te∩ se m∙₧eme vrßtit k ActionScriptu, kter² jsme p°eruÜili v okam₧iku, kdy si od brßny aplikaΦnφho serveru ₧ßdßme webovou slu₧bu. V²Üe uvedenΘ dva p°φkazy tedy musφ vypadat takto:
webServices.callService(
"http://www.xmethods.net/
sd/2001/CurrencyExchangeService.wsdl",
"getRate",
["usa", "czech republic"]
);
Ve finßlnφ verzi naÜφ ukßzky ovÜem vypadß volßnφ webovΘ slu₧by trochu jinak û jako parametry se pou₧ijφ hodnoty zφskanΘ z formulß°e. Na p°ijat² v²sledek skript zareaguje podobn²m zp∙sobem, jako v minulΘ ukßzce (je t°eba vytvo°it metodu callService_Result
), proto se tomu ji₧ nev∞nuji podrobn∞ji, stejn∞ jako zbyl²m °ßdk∙m skriptu, kterΘ souvisejφ s u₧ivatelsk²m rozhranφm.
WebovΘ slu₧by jsou mocn²m nßstrojem, kter² na svou zlatou Θru jist∞ teprve Φekß. Ale u₧ nynφ si m∙₧ete vyzkouÜet slo₧it∞jÜφ a praktiΦt∞jÜφ p°φklady ne₧ je tento m∞nov² kalkulßtor, rozhranφ formou webov²ch slu₧eb poskytujφ Google, Amazon Φi AltaVista (p°eklad mezi r∙zn²mi jazyky, ona slavnß Babylonskß rybka), pomocφ webov²ch slu₧eb m∙₧ete pracovat i s RSS (RDF Site Summary) Φi dokonce s protokolem POP3. Je tedy snad u₧ jen otßzkou Φasu, ne₧ se samoz°ejmostφ freemailov²ch server∙ stane flashovΘ rozhranφ nerozeznatelnΘ od vaÜeho Outlooku (Φi spφÜe mnohem vtipn∞jÜφ, spojφ-li se Üikovnφ programßto°i a flashovφ "hraΦiΦkovΘ").
Flash Remoting a databßze
V²znamnou p°ednostφ technologie Flash Remoting (pro n∞koho m∙₧e b²t hlavnφm d∙vodem, proΦ tφmto °eÜenφm nahradit starÜφ zp∙soby komunikace) je velmi snadnß tvorba databßzov²ch aplikacφ. P°edstavte si klasickou situaci, kdy chcete do flashovΘ aplikace naΦφst t°eba tabulku nejlepÜφch hrßΦ∙. SQL dotaz je otßzkou jednoho °ßdku k≤du. Pak ale v∞tÜinou nßsleduje pom∞rn∞ pracnΘ "p°ed₧v²kßnφ" zφskan²ch dat do takovΘ podoby, kterou Flash dokß₧e strßvit, tedy XML nebo url-encoded. A na stran∞ Flashe je zase nutnΘ data p°evßd∞t do internφch datov²ch struktur (nap°φklad polφ), se kter²mi lze dßle pohodln∞ pracovat. Flash Remoting vßm nabφzφ nesrovnateln∞ jednoduÜÜφ °eÜenφ - zavolejte SQL dotaz a jeho v²sledek (tedy nap°φklad v PHP v²sledek volßnφ funkce mysql_query
) rovnou vra¥te jako v²stup slu₧by. O vÜe ostatnφ se postarß Flash Remoting, ve flashovΘ aplikaci si pouze poΦkßte na napln∞nφ instance specißlnφ t°φdy RecordSet
.
T°φdu RecordSet
m∙₧eme chßpat jako nov∞ zaveden² datov² typ v ActionScriptu, kter² ke klasick²m typ∙m (String
, Array
, atd.) p°idßvß datovou strukturu urΦenou pro uklßdßnφ dvourozm∞rn²ch tabulek, nejΦast∞ji tedy pro v²sledky volßnφ databßzov²ch dotaz∙. T°φda nabφzφ mno₧stvφ metod pro b∞₧nΘ operace, jako jsou p°φstup k jednotliv²m zßznam∙m, p°idßvßnφ, ·prava a odstra≥ovßnφ zßznam∙, t°φd∞nφ nebo filtrovßnφ. K dat∙m je dokonce mo₧no p°istupovat u₧ b∞hem naΦφtßnφ, k dispozici je metoda pro zjiÜt∞nφ poΦtu aktußln∞ naΦten²ch zßznam∙.
Tφm ale nabφdka nßstroj∙ pro tvorbu databßzov²ch aplikacφ nekonΦφ. Flash MX p°iÜel s koncepcφ komponent u₧ivatelskΘho rozhranφ a sßm nabφdl sadu t∞ch nejobvyklejÜφch. Nenφ tedy p°φliÜ velk²m p°ekvapenφm, ₧e Flash Remoting s nimi poΦφtß a umo₧≥uje snadnΘ propojenφ objekt∙ RecordSet
s prvky u₧ivatelskΘho rozhranφ, kterΘ zobrazujφ jejich obsah. Pot°ebujete nap°φklad naplnit roletku (ComboBox) daty z databßze? Nic snazÜφho, dohromady to bude na stran∞ Flashe i na stran∞ serveru jen n∞kolik °ßdk∙ k≤du. DalÜφ novß t°φda DataGlue
(datovΘ lepidlo) umo₧≥uje definovat dokonalejÜφm zp∙sobem, jak se majφ data z databßze v tom kterΘm prvku u₧ivatelskΘho rozhranφ zobrazit. A vytvo°φte-li si vlastnφ komponentu, po jejφm propojenφ s objektem RecordSet
(respektive obecn∞jÜφ t°φdou DataProvider
) bude komponenta dostßvat strukturovanΘ informace o vÜech zm∞nßch, kterΘ nastanou v datovΘm zdroji, a bude na n∞ moci jakkoli reagovat.
ProblΘm s ΦeÜtinou v AMF PHP
Te∩ se jeÜt∞ vra¥me k open-source projektu AMF PHP, kter² nßm vÜechna ta kouzla zp°φstup≥uje pomocφ oblφbenΘho PHP. Tento projekt je v souΦasnosti stßle ve v²voji a jak jsme dnes vid∞li, v n∞kter²ch oblastech mß to podstatnΘ teprve p°ed sebou. Cφlem tohoto Φlßnku je podpo°it vßÜ zßjem o Flash Remoting a tφm takΘ t°eba podnφtit zßjemce o projekt AMF PHP, aby se do n∞j aktivn∞ zapojili.
Zßva₧n²m problΘmem, na kter² v souΦasnosti narazφ zdejÜφ v²vojß°, je prßce s Φesk²m textem, jak jsem naznaΦil v zßv∞ru p°edchozφho Φlßnku. Nap°φklad vytvo°φme-li si jednoduchou slu₧bu, kterß vezme p°ijat² °et∞zec a v nezm∞n∞nΘ podob∞ nßm jej vrßtφ jako v²sledek, dojde k poÜkozenφ znak∙ s diakritikou. P°esto₧e jsem na tento problΘm upozornil autory projektu a v souΦasnΘ dob∞ s nimi o n∞m diskutuji, v aktußlnφ verzi knihovny stßle nenφ vy°eÜen.
P°φΦinou je konverze °et∞zc∙ z k≤dovßnφ UTF-8 do ISO-8859-1 (a naopak) po jejich p°ijetφ nebo p°ed jejich odeslßnφm do Flashe. Jeliko₧ UTF-8 je jedinou sprßvnou cestou, jak ve flashov²ch aplikacφch zajistit sprßvnΘ zobrazenφ ΦeÜtiny na vÜech platformßch a pou₧φvßnφ tohoto k≤dovßnφ ve vÜech Φßstech internetovΘ aplikace je podle m∞ jedinou cestou, jak si zajistit klidn² spßnek (viz Φlßnek Flash MX: Krotφme fonty), doporuΦuji jednoduÜe konverzi v rßmci knihovny AMF PHP neprovßd∞t a p°edpoklßdat UTF-8 jako k≤dovßnφ pou₧φvanΘ v serverovΘ aplikaci. Pokud se mnou souhlasφte, prove∩te si jednoduchou ·pravu - v souboru flashservices/io/AMFInputStream.php
odstra≥te veÜkerß volßnφ funkce utf8_decode
a v souboru flashservices/io/AMFSerializer.php
odstra≥te veÜkerß volßnφ funkce utf8_encode
. Pak by m∞l p°enos Φesk²ch °et∞zc∙ mezi klientem a serverem zaΦφt fungovat bez problΘm∙.
Seznßmenφ s technologiφ Flash Remoting je u konce. V∞°φm, ₧e tyto Φlßnky p°isp∞ly k tomu, aby se ve Flashi rodilo mΘn∞ nudn²ch reklam Φi statick²ch prezentacφ a vφce chytr²ch aplikacφ.