Načítání dat ze souborů umístěných na serveru

13.7.2009· Autor: Jiří Hrbáček· Počet komentářů: 2

Dynamické načítání dat ze serveru nebo jejich ukládání na server jsou základní činnosti, které umožní vytvářet RIA aplikace (chytré internetové aplikace). Aplikace, jejichž obsah lze snadno modifikovat bez zásahu do nich samotných. Data ze serveru mohou také modifikovat jejich činnost, nebo umožnit jejich jazykovou lokalizaci apod. Mezi základní způsoby datové komunikace mezi serverem a klientem patří přenos dat ve formátu proměnná/hodnota, ve formátu XML a použití webových služeb. V tomto příspěvku se webovými službami zabývat nebudeme.

Dynamické načítání dat ze serveru nebo jejich ukládání na server jsou základní činnosti, které umožní vytvářet RIA aplikace (chytré internetové aplikace). Aplikace, jejichž obsah lze snadno modifikovat bez zásahu do nich samotných. Data ze serveru mohou také modifikovat jejich činnost, nebo umožnit jejich jazykovou lokalizaci apod. Mezi základní způsoby datové komunikace mezi serverem a klientem patří přenos dat ve formátu proměnná/hodnota, ve formátu XML a použití webových služeb. V tomto příspěvku se webovými službami zabývat nebudeme.

Základním úkolem je tedy získání dat ze serveru. ActionScript 3 tuto činnost sjednotil a zjednodušil. Používají se k tomu dvě třídy URLRequest a URLLoader.

Třída URLRequest má za úkol vytvořit požadavek, který třída URLLoader odešle na server. Ze serveru na základě tohoto požadavku obdrží požadovaná data.

Není to nic neobvyklého. I my když požadujeme po webovém prohlížeči zobrazení nějaké webové stránky, nejprve odešleme na server požadavek (URL požadované stránky) a server nám vrátí data (html kódovaný text, který browser zobrazí  jako tuto stránku).

Požadujeme-li po serveru, aby nám zaslal obsah nějakého datového souboru, jako požadavek mu pošleme URL tohoto souboru. Je-li soubor ve stejném adresáři jako SWF soubor, který jej načítá, pak stačí zadat pouze jméno tohoto souboru. V tomto případě neukládáme do URLRequest vlastnosti data žádná data.

Pokud bychom požadovali data ze serveru prostřednictvím scriptu (php, aspx,...), pak obvykle serveru posíláme s požadavkem i dotazovací řetězec, tedy posíláme data také na server. Zní to hrozivě, ale jistě jste si všimli, že někdy otevíráte stránky pomocí URL, kde za adresou webového serveru je jméno souboru s příponou PHP, ASP, ASPX apod. a za tímto souborem následuje otazník a jedna nebo více dvojic proměnná=hodnota oddělené znakem &. Dotazovací mu říkáme proto, že následuje za otazníkem. Data, která se předávají serveru se ukládají do vlastnosti data v URLRequest.

Metoda GET je default metodou třídy URLRequest. Metoda určuje, jakým způsobem budou data požadavku odeslána na server. Použijeme-li metodu GET, požadavek nesmí být delší než 256 bytů. Pro delší řetězec je nutné použít metodu POST. Metodu volíme nastavením vlastnosti method. Zabývat se zde podrobně rozdíly ve způsobu odeslání těmito metodami nyní nebudeme.

Přenos dat je zahájen zavoláním metody load() instance třídy URLLoader. Jako parametr této metodě předáváme instanci třídy URLRequest. Server obdrží požadavek a vrátí požadovaná data (obsah souboru, nebo data vrátí sám skript serveru). Průběh stahování dat ze serveru můžeme sledovat s využitím vlastností bytesTotal a bytesLoaded třídy URLLoader.

Třída URLLoader může také naslouchat chybovým a stavovým událostem.

IOErrorEvent.IO_ERROR – událost je aktivována, když dojde k chybě při přenosu dat

SecurityErrorEvent.SECURITY_ERROR– událost je aktivována, když se například pokoušíme číst data ze serveru, kde nemáme oprávnění ke čtení dat

HTTPStatusEvent.HTTP_STATUS – událost vrací stav HTTP, ne všechny Flash playery jsou schopny tento stav indikovat, pak je zobrazen stav 0. Obvykle nás tento stav nezajímá.

Data, která URLLoader od serveru obdrží jsou uložena do jeho vlastnosti data. Když je příjem dat ze serveru dokončen, je aktivována událost Event.COMPLETE. Této události obvykle využíváme pro zahájení zpracování přijatých dat.

nacitani schema

Nyní se podívejme, jak bude načtení dat realizováno prostřednictvím Acrion Scriptu 3.

Mějme ve stejném adresáři jako máme SWF,  uložená data v soubor data.txt nebo data.xml.  

Datový soubor data.txt může mít například následující obsah:

jmeno=Karel&prijmeni=Pařízek&bydliste=Revoluční 456, Brno

 Protože jde o soubor s uloženými proměnnými, je jeho formát

jmeno_promenne1=hodnota1& jmeno_promenne2=hodnota2 ...... & jmeno_promenneN=hodnotaN

Proměnné jsou v něm uloženy jako dvojice proměnná/hodnota oddělené znakem &. Používáme-li českou abecedu, je třeba používat kódování UTF 8. Takovýto datový soubor lze snadno vytvořit například v editoru Poznámkový blok (Noteped), který je součástí Windows.

Datový soubor data.xml může mít například následující obsah:

<strong><em><NewGalerie></em>
</strong>   <strong><em><Foto>
    <Number>1</Number>
    <Photo>http://www.hintertux.at/typo3temp/pics/hausfoto_alpenhof_9.jpg</Photo>
    <popis>luxus je když jste doma</popis>
  </Foto>
  <Foto>
    <Number>5</Number>
    <Photo>http://www.hintertux.at/typo3temp/pics/hausfoto_alpenhof_8.jpg</Photo>
    <popis>dovolená v chorvatsku</popis>
  </Foto>
</NewGalerie></em></strong>

V tomto formátu jsou data strukturována pomocí tagů (značek). Action script, který data ze serveru načte může být následující:

/*
Nejprve vytvoříme instanci URLRequest  a připravíme si dotaz na server
v tomto případě budeme načítat data (proměnné) uložené v souboru data.txt
Kdybychom chtěli načítat data ve formátu XML, pak bychom zde zadali soubor data.xml
*/
var myRequest:URLRequest=new URLRequest("data.txt");

//vytvoříme instanci URLLoader
var myLoader:URLLoader = new URLLoader();

/* nastavíme formát dat, která loader bude přijímat
Půjde-li o text obsahující dvojice proměnná/hodnota,
zvolíme formát dat VARIABLES.
Pokud by šlo o XML formát dat, pak bychom zvolili
formát dat TEXT.

Poznámka:
Třetí možností   jsou BINARY zatím nebudeme používat */
myLoader.dataFormat=URLLoaderDataFormat.VARIABLES;

/*
Aktivujeme listenery událostí a jejich handlery (ovladače)
- nejprve načítání dat je dokončeno
*/
myLoader.addEventListener(Event.COMPLETE, onLoadData);

//Error handling   
myLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
myLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);

//HTTP stavová informace
myLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus);

//handler který zpracuje data když jsou načtena
function onLoadData(e:Event) {
            /*
            Sem napíšeme skript, který data zpracuje.
            V tomto případě vypíšeme data, která byla přijata
            e.target odkazuje na instanci (URLloaderu), která
            handler zavolala, tedy myLoader.
            */
            trace ("Načtená data:  "+ e.target.data);
}

//když není soubor nalezen, nebo je chyba jeho načítání
function onIOError(evt:IOErrorEvent) {
            trace("Chyba načítání souboru - IOError: "+evt.text);
}

//chyba ochrany dat
function onSecurityError(evt:SecurityErrorEvent) {
            trace("SecurityError: "+evt.text);
}

//HTTP stav
function onHTTPStatus(evt:HTTPStatusEvent) {
            trace("HTTPStatus: "+evt.status);
}

/*
Když máme vše připraveno, můžeme provést načtení
dat ze serveru
*/

myLoader.load(myRequest);

Pro zpracování proměnných ve formátu proměnná/hodnota se používá třída URLVariable. Pokud potřebujeme pracovat s daty ve formátu XML, využívají se k tomu třídy XML, XMLDocument a další. Práce s XML vyžaduje podrobnější výklad. Podívejme se proto na jednodušší věc a tou je přístup k načteným proměnným.

Po přijetí dat (handler události COMPLETE) můžeme přijatá data vložit do instance třídy URLVariable. Tato třída přijatá data rozdělí na proměnné a jejich hodnoty. Proměnné se stanou vlastnostmi instance třídy URLVariable a jako k takovým můžeme přistupovat.

/*
Data jsou načtena do instance třídy URLVariables a v ní automaticky
rozdělena tak, že se proměnné stanou stejnojmennými vlastnostmi
této instance
*/
var myVariable:URLVariables=new URLVariables(e.target.data);

//takto si můžeme všechny hodnoty proměnných vypsat do výstupního okna
for each (var item in myVariable) {
            trace(item);
}

/*
Zde je příklad, jak můžeme jednu po druhé zobrazit například
v dynamických textových polích jejichž instance máme nazvané
jmenoAutora_txt, prijmeniAutora_txt a bydlisteAutora
*/

this.jmenoAutora_txt.text=myVariable.jmeno;
this.prijmeniAutora_txt.text=myVariable.prijmeni;
this.bydlisteAutora_txt.text=myVariable.bydliste;

Vidíme, že načítání proměnných ze souboru, nebo lze říci dat uložených jako pár proměnná/hodnota, je velmi jednoduché a práce s nimi snadná. Text v proměnných může být dlouhý, jiné proměnné mohou obsahovat například odkazy na obrázky, které v aplikaci zobrazíme, nebo URL webových stránek abychom mohli vytvořit třeba tlačítko, které otevře webovou stránku apod. Nevýhodou je, že každá proměnná musí mít jiné jméno a data v souboru jsou docela nepřehledná. Uvedené nevýhody řeší XML formát dat.

Jiří Hrbáček

E-mail: hrbacek(zavinac)posta.ped.muni.cz | Web: http://boss.ped.muni.cz/hrbacek | Skype: jiri.hrbacek55

Motto: Nenarazil jsem zatím na nic, co by nebylo možné ve flashi realizovat. Stále však narážím na to, kolik je toho, co s ní zatím sám neumím. Poznávat ji je jako číst napínavý román a napjatě očekávat, co zajímavého bude v další kapitole.

Komentáře k článku  
Problém při načítání externích dat z jiné domény neznám | 20.7.2009 8:23
Skvely clanek Diky neznám | 15.3.2010 18:49

Přihlášení uživatele