site logo

Čtení dat ze vzdáleného serveru pomocí AJAXu

Na příkladu JavaSkriptové kalkulačky, která udržuje aktuální měnové kurzy si ukážeme jak číst a využít data, která se nacházejí na jiném webovém serveru. Miniaplikace využívá objektu Ajax na serveru, který přečte aktuální měnové kurzy ze vzdáleného serveru a doplní je do seznamu koeficientů pro přepočty. Updatovaná kalkulačka je zaslána do browseru.

Pro objekt Ajax v browseru platí bezpečnostní omezení komunikovat pouze se servery ve stejné doméně ze které pochází stránka v browseru. Pokud chceme číst data ze serveru, který je v jiné doméně, objekt Ajax musí běžet na serveru, kde toto omezení neplatí. Když aplikace běží na intranetovém serveru za firewalem, navíc je potřeba povolit vyjímku pro komunikaci s daným serverm i na firewalu.

Kliknutím na řádek v tabulce vyberete typ přepočtu, ukazatel na pseudo-logaritmické stupnici přetáhnete na žádovanou hodnotu (v levém formulářovém poli) a v pravém poli vidíte odpovídající, přepočtenou hodnotu. Je možné zapisovat přímo do vstupních polí (levého, nebo pravého) a potom kliknutím na znak "rovná se", tedy při vzniku události on blur je proveden přepočet. Počet řádků tabulky a tedy i typů přepočtů je značně zredukován tak, aby zůstal zachován princip kalkulačky.

volba výchozí jednotka cílová jednotka přepočet updatováno
  »»»  
EUR CZK 25,470 22.11.2017
  »»»  
USD CZK 21,677 22.11.2017
  »»»  
inch cm 2.54  
  »»»  
HP kW 1.34102  
unit 1 = unit 2

Objekt XMLHttpRequest na serveru může číst soubory z libovolného serveru, ale je vytvořen především pro čtení .xml, nebo .txt souborů. Praktický význam čtení .html souborů je velmi omezený. Automatická analýza html kódu je problematická, protože stačí malá změna v kódu a pečlivě připravená analýza se rozpadne a data jsou neplatná, nebo vůbec žádná. Tento článek rozhodně nemá sloužit jako návod na vykrádání dat z cizích webových serverů.

Zatímco čtení cizího kódu za účelem studia je jakýmsi motorem rozvoje webu, vykrádání dat je nejen neslušné, zavrženíhodné, ale i protizákoné, stejně jako krást design, obrázky. Využívejte jen data k tomu účelu připravená.

Praktické využití objektu XMLHttpRequest na serveru je čtení dat, která se mění v čase, například měnové kurzy, zprávy o počasí, případně výrobní data v intranetu. Objekt lze využít i ke zjištění zda webový server je aktuálně v provozu (ping nebývá vždy dostatečný). Pomocí tohoto objektu je možné vytvořit alternativní proxy a umožnit přístup k vybraným stránkám z provozních PC, které mívají zakázán přístup na internet. Reálných zdrojů dat pro skutečné využití zatím na českém internetu není příliš mnoho.

Světlou vyjímkou jsou data na webovém serveru České národní banky, která zveřejňuje kurzovní lístek jak běžně formátovaný v .html pro zobrazení v prohlížeči, tak ve formátu .txt, který je vhodný pro čtení pomocí objektu XMLHttpRequest. Soubor obsahuje textovou tabulku, vždy jeden měnový kuz na jednom řádku, data v řádku jsou oddělena znakem "pipe".

Ukázka části serverového kódu právě zobrazené stránky je ve VBScriptu napsané pro classic.asp a funguje jen na MS IIS serveru. Funkce tedy není přenositelná na jiný typ serveru. Serverový objekt XMLHttpRequest není totožný s objektem používaným v browseru.

Funkce čte a aktualizuje měnové kurzy pro vybrané měny. Je použit synchronní přenos, který je jednodušší, než Ajax v browseru, kde je potřebné použít asynchronního přenosu dat. Synchronní komunikace způsobí pozastavení běhu programu až do dokončení přenosu, což v případě browseru vede k tomu, že prohlížeč přestává reagovat (zasekává se). Tato skutečnost na serveru příliš nevadí, jen stránka se načítá poněkud delší dobu. Ostatně na serveru jinou možnost nemáme. V tomto případě použití zkratky AJAX není správné, korektní by bylo SJAX: Synchronous JavaScript and XML.


FUNCTION updateRate()
  ' ===== aktualizace kurzovních přepočtů =====
  Dim HTTP, Addr

  ' ----- get txt soubor ze vzdáleného serveru pomocí AJAX -----
  Addr = "http://www.cnb.cz/cs/.../denni_kurz.txt"
  Set HTTP = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
  HTTP.Open "GET", Addr, false, "", ""
  HTTP.setRequestHeader "Content-Type", "text/plain"
  HTTP.Send()
  If (HTTP.status = 200) Then
     ' ----- zpracování dat, aktualizace hodnot -----
     ' Lines = Split(HTTP.responseText, vbLf)
     ' ...
  End If
  Set HTTP=Nothing
END FUNCTION

Nejdříve deklarujeme proměnné. Addr bude obsahovat adresu vzdáleného serveru, HTTP bude pro objekt XMLHttpRequest. Tento objekt otevřeme s hodnotami: metoda požadavku, URL adresa, způsob zpracování (zde false znamená synchronní zpracování). Další parametry jsou využity jen v případě užití přihlašovacího jména a hesla. Nastavíme požadovanou hlavičku odpovědi, zde se jedná o textový soubor, proto text/plain, a požadavek je odeslán. V tomto místě se běh programu pozastaví do doby vyřízení požadavku. Jakmile se program znovu rozběhne musíme zkontrovat, zda požadovaný soubor byl skutečně doručen. To zajistí test statusu objektu HTTP.status = 200 a zpracování dat proběhne jen v případě bezchybného přenosu.

Analýza a zpracování dat je charakteristická pro daný soubor a proto není ve výpisu uvedena. Podstata bývá podobná: soubor je rozložen do jednotlivých řádků funkcí split, dále je každý řádek rozložen do položek opět pomocí split a podle hodnot položek jsou aktualizovány příslušné hodnoty. Úspěšnou aktualizaci poznáme podle datumu v tabulce. Kurozvní lístek ČNB je vydáván vždy po ukončení obchodního dne na burze, jednou za den. Měnové koeficienty z jiných zdrojů např. Google se zřejmě budou lišit od kurzu vyhlašovaného ČNB.

Použití stupnice a ukazatele pro zadávání číselných hodnot bylo popsáno v článku formuláře, datum a čas, nebo nahlédněte do zdrojového kódu.

updated 02.02.2008