štítky
- Javascript
- programování
Služby v Javascriptu napříč doménami
Chcete napsat nějakou on-line službu a dát vývojářům API do JavaScriptu, aby ji mohli využívat přímo na svém webu? (Pochopitelně, od klienta.) Pokud znáte XMLHttpRequest či Active-X-ové ekvivalenty pro MS IE, asi víte, že to není to pravé. Narazíte totiž na mezidoménová omezení. Existují však triky, kterými lze tato omezení překonat. Jeden z nich, svůj nápad (i když nevím, jak moc originální, ale jinde se to prý dělá iframem, což se mi nelíbilo), zde ukážu.
U Opery 9.5 jsem zjistil problém, pokud byl poskytovatelský server localhost:82. Když to bylo na v6ak.profitux.cz, jede to i v Opeře. Asi neměla ráda porty, nebo jí vadila url bez tečky v doméně.
Co je zakázáno a co povoleno?
Zakázán je XMLHttpRequest a některá další čtení z jiných domén. Jde o to, že uživatel tam může být přihlášen a jiná stránka, pokud by to měla povolené, by si mohla například číst jeho citlivé informace. Na XMLHttpRequest sice AFAIK existuje nějaká norma umožňující omezit toto omezení jak si cílová stránka přeje, ale co se týče podpory prohlížečů, budeme si muset ještě chvíli počkat.
Vkládat do stránky některé prvky jako skript, obrázek, iframe a další z cizích domén však zakázáno není. Tím můžete danému serveru poslat zprávu. Ale jak vám odpoví?
Příjem odpovědi
Co vím, tak číst zprávu z obrázku přímo stránka nemůže, ten tedy odpadá. Zbývá nám:
- iframe (není v HTML 4.01 Strict)
- script
iframe
Není to cesta, kterou jsem chtěl popisovat, takže stručně: komunikace zpět probíhá přes část url za křížkem, což je čitelné i mezidoménově.
script
Skript může volat funkce (metody), nastavovat proměnné (vlastnosti) a dělat jinou činnost. Tím dojde k příjmu odpovědi. V podstatě je nutnost používat globální proměnné nebo něco takového. Je však vhodné, když skrtipt zavolá funkci (metodu), protože ta může zavolat příslušný handler.
Identifikace požadavku u ospovědi
Co když chce uživatel API provádět více požadavků zároveň? U XMLHttpRequestu to bylo bez větších problémů možné, tady je to horší. Ale ne nemožné. Stačí každému požadavku přidělit identifikátor unikátní v rámci instance stránky, který bude poslán serveru. Server pak v odpovědi také řekne, k čemu to patří.
Příklad - zdrojový kód
Abych neskončil u teorie, ukážu zdroják. Serverová část je řešena v PHP5. Předpokládám magic_quotes_gpc off. Ukážu poskytnutí služby MD5 hashování. (Asi bych hashoval u klienta nebo na vlastním serveru, to je ale jen příklad.)
Poskytovatel API
Nabízí jednu JS knihovnu a zpracování akce.
Service.js
service.php
Uživatel API na straně klienta
index.html
Omezení
- Kód je psán pro HTML
- Je možné použít pouze metodu GET, nicméně takovéto služby zpravidla stejně jen zjišťují informace a nezapisují
- Obtížné začlenění do mého chápáni MVC
- Uživatel služby musí poskytovateli důvěřovat, že to nezneužije ke XSS. To je dnes však běžné.
- Stránka musí počítat s tím, že se na konci body budou objevovat a mizet scripty
- Musíme udělat metodu/funkci pro příjem dat public, ta však má být z hlediska zapouzdření skryta. Dá se to vyřešit podtržítkovou konvencí a dokumentací.
Linkování
Líbí se Vám tato stránka? Zalinkujte ji!