V předchozím článku jste se dozvěděli něco o obecném principu fungování technologie Flash Remoting. Dnes navážeme praktickou ukázkou, která bude na straně serveru využívat populární platformu PHP.

Pokud jste tak ještě neučinili, nainstalujte si komponenty Flash Remoting pro stranu klienta.

Připomeňme si, že Flash Remoting umožňuje flashové aplikaci volat vzdálené služby, jako by to byly metody lokálních objektů ActionScriptu. Přece jen je zde však jeden podstatný rozdíl. Voláme-li nějakou funkci či metodu v rámci flashové (nebo PHP) aplikace, obdržíme ihned její výsledek a teprve potom pokračuje skript dalším příkazem v pořadí. Při komunikaci mezi klientem a serverem je tomu jinak – Flash je koncipován tak, že veškerý kód připojený k určitému snímku se provede okamžitě (teoreticky v nekonečně krátkém čase), následně se vykreslí vizuální obsah snímku, poté nastane pauza daná hodnotou fps (počet snímků za vteřinu), po ní se přejde na další snímek a tak dále. Tento princip by byl pochopitelně narušen, pokud by klient čekal na odpověď ze serveru (což může trvat i velmi dlouho), než by pokračoval ve zpracování skriptu. Proto se komunikace se vzdálenou službou skládá ze dvou samostatných částí – volání metody služby a reakce na obdržený výsledek. Výsledkem volání může být i chybový stav.

Ukažme si to na prvním jednoduchém příkladu. Následuje komentář k jednotlivým řádkům zdrojového kódu flashové aplikace:

#include „NetServices.as“
#include „NetDebug.as“

Knihovnu NetServices.as je nutné připojit ke každé aplikaci využívající Flash Remoting. Knihovna NetDebug.as umožňuje práci s nástrojem NetConnection Debugger, po odladění aplikace můžeme tento řádek vymazat. Pro úplnost dodejme, že je k dispozici ještě knihovna „DataGlue.as“ (v překladu doslova „datové lepidlo“), kterou bychom využili v náročnějších aplikacích k přímému propojení databázových dat s komponentami uživatelského rozhraní.

brana = NetServices.createGatewayConnection
  („http://nestor.cz/flashremoting/priklad.php“);

Tímto příkazem definujeme takzvanou bránu, tedy URL, které slouží jako vstupní bod pro veškerá následující volání vzdálených služeb. V případě PHP se jedná o skript, který zajistí přesměrování požadavků na jednotlivé služby – ty se však fyzicky nacházejí v jiných skriptech či na jiných serverech, jak uvidíme později.

astrologie = brana.getService(„Astrologie“, this);

Nyní jsme si od brány vyžádali konkrétní službu s názvem Astrologie. Druhým parametrem metody getService určíme objekt, který obdrží výsledek každého volání této služby. Jedná se o objekt, který musí obsahovat metody pro zpracování získaných výsledků. V našem případě jsme zadali this, to znamená, že Flash bude tyto metody hledat v aktuálním objektu (tím je _root, neboť celý skript se nachází na hlavní časové ose).

astrologie.generujHoroskop(„kozoroh“, new Date(2003, 3, 30));
vystup_txt.text = „Prosím čekejte, probíhá spojení se serverem.“;

Dostali jsme se k vlastnímu volání vzdálené služby. Předpokládejme, že služba astrologie nabízí řadu metod souvisejících s astrologií a jednou z nich je metoda generujHoroskop, která by měla vrátit horoskop pro zadané znamení zvěrokruhu a datum. Tímto příkazem jsme si tedy vyžádali horoskop pro kozoroha na 30. dubna 2003. Teprve v tuto chvíli dojde k fyzickému spojení mezi klientem a serverem, proto je na místě informovat uživatele o nutnosti vyčkání na výsledek.

Je na čase definovat metodu, která bude zpracovávat výsledek volání vzdálené služby. Jak už bylo řečeno, musí se jednat o metodu objektu uvedeného jako příjemce výsledků, v našem případě this. Název metody musí být shodný s názvem volané metody služby, doplněný o koncovku _Result:

generujHoroskop_Result = function (horoskop) {
  vystup_txt.text = horoskop;
}

Metoda neudělá nic jiného, než že obdržený horoskop (řetězec) vypíše do textového pole vystup_txt, čímž přepíše dosavadní text („Prosím, čekejte, …“). Pokud bychom chtěli definovat i metodu, která bude reagovat na chybový stav, měla by podobné jméno, ovšem s koncovkou _Status. Dále je třeba poznamenat, že uvedený postup není jedinou možností, jak definovat zpracování výsledků a chybových stavů. O dalších možnostech („více objektových“), stejně jako o zpracování chybových stavů, se dočtete v dokumentaci k Flash Remoting.

To je vše, co je třeba udělat na straně Flashe. Nyní můžete aplikaci spustit a po chvilce čekání získáte požadovaný horoskop. Zkuste ve zdrojovém kódu změnit znamení zvěrokruhu nebo datum a pozorujte, jak se změní výsledek – jak vidíte, naprogramovat na straně serveru metodu generujHoroskop služby Astrologie nebude nic složitého. A právě do toho se teď pustíme.

Dosud jste volali vzdálenou službu na mém testovacím serveru (viz URL brány zadané na začátku skriptu). Abyste si mohli vytvořit službu na svém vlastním serveru v prostředí PHP, potřebujete odpovídající serverovou část technologie Flash Remoting. Takže zde je to, na co jistě už netrpělivě čekáte – odkaz na open-source projekt AMF PHP, knihovnu pro podporu Flash Remoting v PHP. V době, kdy píši tento článek, je projekt stále v raném stádiu vývoje, jak můžete zjistit zběžným prohlédnutím stránek. Nicméně vše podstatné je již funkční, takže si stáhněte aktuální verzi knihovny.

Vlastní knihovna se nachází v adresáři flashservices, zkopírujte ji do nově vytvořeného adresáře projektu na svém WWW serveru. Dále v adresáři projektu vytvořte soubor priklad.php, který bude sloužit jako brána vašeho aplikačního serveru, a podadresář sluzby, kde budou uloženy skripty definující vlastní služby, přičemž každé službě bude odpovídat jeden soubor, pojmenovaný stejně jako název služby:

ukázka souborové struktury

Nejprve se podívejme, jak musí vypadat brána aplikačního serveru, tedy skript priklad.php:

<?php
  include „flashservices/app/Gateway.php“;
  $gateway = new Gateway();
  $gateway->setBaseClassPath(„sluzby/“);
  $gateway->service();
?>

Jak vidíte, skript tvořící bránu je tak jednoduchý, jak jen může být. Jediné, co zde případně budete měnit, je nastavení cesty k vlastním službám (na třetím řádku). Teď se podívejme na výpis souboru Astrologie.php, který definuje stejnojmennou službu:

<?php
class Astrologie {
  function Astrologie() {
    $this->methodTable = array(
      „generujHoroskop“ => array(
        „description“ => „Vygeneruje horoskop pro zadané“
          .“znamení zvěrokruhu a datum.“,
        „access“ => „remote“,
        „roles“ => „role, list“,
        „arguments“ => array(„znamení“, „datum“)
      ),
      „rekniMiNecoHezkeho“ => array(
        „description“ => „Řekne něco hezkého.“,
        „access“ => „remote“,
        „roles“ => „role, list“,
        „arguments“ => array()
      ),
      „soukromaMetoda“ => array(
        „description“ => „Soukromá metoda“,
        „access“ => „private“,
        „roles“ => „role, list“,
        „arguments“ => array()
      )
    );
  }
  function generujHoroskop($znameni, $datum) {
    return „Protože jsi “ . $znameni . „, tak lze předpokládat, “
      .“že dne “ . date(„j. n. Y“, $datum/1000) . “ uzavřeš “
      .“sňatek nebo se rozvedeš. Je však také možné, že v “
      .“tento den zemřeš nebo tvé akcie klesnou o 50 % (ovšem “
      .“v případě, že zemřeš, tvé akcie stoupnou na trojnásobek). “
      .“Tak a ne jinak se stane.“;
    }
  function rekniMiNecoHezkeho() {
    return „Astrologie je nejdůležitější věc na světě.“;
  }
  function soukromaMetoda() {
    // toto je soukromá metoda — nelze ji volat vzdáleně
  }
}
?>

Skript obsahuje definici třídy, jejíž název se opět musí shodovat s názvem služby, v našem případě tedy Astrologie. V konstruktoru třídy je nutné vytvořit dvourozměrné pole methodTable, které obsahuje přehled všech metod služby. Každý záznam o metodě obsahuje několik atributů, z nichž si povšimněme především atributu access. Tím můžeme deklarovat, které metody jsou určené pro vzdálené volání (hodnota remote) a které slouží jen pro vnitřní potřeby serverové aplikace, což znamená, že budou dostupné pouze v rámci aplikace na serveru nebo dokonce jen v rámci dané třídy (hodnoty public nebo private).

Následují definice vlastních metod. Metodu generujHoroskop, kterou využíváme v našem příkladu, jistě netřeba komentovat. Snad jen upozornit, že je nutné znát způsob, jakým knihovna AMF PHP provádí konverzi mezi datovými typy ActionScriptu a PHP. Například datum/čas se přenáší ve formátu „unix-time“ v milisekundách, s čímž musí počítat naše metoda generujHoroskop, když takto kódovaný čas převádí na čitelný řetězec.

Konečně se můžete vrátit k flashové aplikaci a přepsat v kódu URL brány tak, aby odpovídal umístění souboru priklad.php na vašem serveru. Při testování možná narazíte na problém s češtinou, který se při původním použití služby volané z mého serveru neobjevoval. O tomto problému se něco dozvíte v příštím článku, kde se dále budeme věnovat volání webových služeb přes protokol SOAP a dalším možnostem technologie Flash Remoting.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět