Ajax komunikace s jiným serverem

Odesílat požadavky na jiný server, než ze kterého byl vás JS kód stažen (tzv. cross-domain request), je z bezpečnostních důvodů zakázáno. A přesto je v dnešní doby celá řada serverů, na které můžete poslat AJAX request a získat data (např. Google Maps API).

Vytvoření takového requestu a API, které ho zpracuje, je celkem jednoduché, ale je potřeba vědět, kde začít.

AJAX Origin

První, co musíte udělat, je v Javascriptu vytvořit AJAX request a odeslat ho na příslušnou adresu.

$.post({
    url: 'http://api.server.com/',
    data: apiData,
    crossDomain: true
});

V jQuery musíte do parametrů přidat hodnotu crossDomain, která zajistí, že jQuery nebude kontrolovat URL requestu.

Důležité je, aby takový request obsahovat hlavičku s adresou stránky, odkud pochází – ve většině případů se o to postará prohlížeč.

Origin: http://www.myserver.com

Server následně může zkontrolovat tuto hodnotu a rozhodnout, zda chce na takový request reagovat. To je první stupeň ochrany, kdy může server umožnit pouze připojení z předem nastavených serverů.

Pokud request na server odesílá i data, musí obsahovat hlavičku s kódováním:

Content−Type: application/x−www−form−urlencoded; charset=UTF−8

Tím serveru sdělíte, jakým způsobem s ním chcete komunikovat. Pro běžné requesty je povoleno používat pouze url-encoded data. Pokud např. chcete komunikovat pomocí JSON nebo SOAP protokolů, budete muset nejprve odeslat OPTION request, kterým si od serveru vyžádáte povolení pro danou komunikaci. Samozřejmě pokud jde o váš server, můžete daný formát předpokládat a odeslat jiná data i když je typ obsahu nastaven na url-encoded.

Allow origin

Když pak server zpracuje request a odpoví, musí ještě poslat hlavičku, kterou zpětně sdělí prohlížeči, pro které servery je odpověď určena.

Access−Control−Allow−Origin: http://www.myserver.com

To je druhý stupeň ochrany, kdy samotný prohlížeč zajišťuje, že odpověď získá pouze script stažený z daného serveru. (Podobně kontroluje a omezuje i skripty a DOM elementy v iFramech.) Tímto může server zabránit CSRF útokům, kdy se škodlivý kód z jiného serveru nahraje do původní stránky a snaží se ukrást data.

Samozřejmě pokud jde o veřejné API jako např. od Googlu, stačí poslat obecnou hlavičku:

Access−Control−Allow−Origin: *

Důležité je ale si uvědomit, že pokud tuto hlavičku (alespoň v obecné podobě) server nepošle, není možné taková data získat ve skriptu (tělo odpovědi bude pro příslušný skript prázdné, i když třeba v debuggeru ho uvidíte). Tím je zajištěno, že servery, které nemají o cross-domain komunikaci zájem, ji nemusí nijak speciálně ošetřovat.

Zpracování odpovědi

Zpět na straně javascriptu již není potřeba nic jiného, než si přečíst tělo odpovědi tak, jak se to dělá u běžného requestu. (I když není na škodu – stejně jako u běžného requestu – zkontrolovat jestli jste nějakou odpověď dostali.)

2 komentáře u „Ajax komunikace s jiným serverem“

  1. ci jinym podobnym zpusobem. AJAX byl ale nejpraktictejsi. Jenze i AJAX ma svou povestnou Achillovu patu – tu predstavuje komunikace v realnem case. AJAX ji neumi rozumnym zpusobem zajistit, pritom cast tzv. RIAs (Rich Internet Applications) na ni je zavisla. Vyznam techto modernich aplikaci nakonec vedl k realizaci sofistikovanejsiho modelu komunikace mezi serverem a klienty.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..