Javascript'in yalnızca aynı alan adından komut dosyalarına erişmesine izin verilirse, bir web sitesi başka bir alandan içeriği okuması ve değiştirmesi gereken mashup'lar nasıl oluşturabilir?
Javascript'in yalnızca aynı alan adından komut dosyalarına erişmesine izin verilirse, bir web sitesi başka bir alandan içeriği okuması ve değiştirmesi gereken mashup'lar nasıl oluşturabilir?
Yanıtlar:
Erişmeye çalıştığınız API JSONP'yi destekliyorsa, isteğinizde yalnızca bir javascript işlev adı sağlamanız gerekir, ardından JSONP myfunc({the:data});
, normal bir javascript gibi çalışabileceğiniz javascript döndürür , bu nedenle yeni bir <script src="www.website.com/somecall?jsonp=myfunc">
etiket oluşturursunuz. (kullanırsanız jQuery otomatik olarak yapar "bir istek göndermek" type: jsonp
in $.ajax
istekleri).
Dezavantajı, JSONP'yi desteklemek için API sağlayıcısının gerektirmesidir.
Hedef web sitesinin crossdomain.xml
kökünde izin verdiğini belirten bir dosya olduğu sürece Flash, etki alanları arası içeriklere erişebilir ; bu genellikle bir API sağlayan sunucularda geçerlidir).
Dezavantajı, kullanıcının tarayıcısında Flash gerektirmesi ve veri aldığınız web sitesinin alanlar arası isteklere izin veren bir crossdomain.xml'ye sahip olması gerektiğidir.
PHP gibi sunucu tarafı dillerinde BS aynı etki alanı kısıtlaması yoktur, bu nedenle proxy gibi davranan bir komut dosyanız olabilir (örn. CURL gibi http uzantılarından biri aracılığıyla indirme).
Ek avantaj, web sayfanıza / javascriptinize iletmeden önce sunucudaki verileri temizleyebilir (hatta birden fazla kaynağı karıştırabilirsiniz), böylece mobil web uygulaması yaparken güzel olan verilerin yalnızca yararlı kısmını bile çıkarabilirsiniz. burada bant genişliği bir sorun olabilir.
Dezavantajı, tüm isteklerin sunucunuz üzerinden gitmesi gerektiğinden, sunucunuzdaki yükü artırır.
Ancak bunun yararı, hedefler arası etki alanını veya jsonp'yi desteklemesini gerektirmediği için herhangi bir kaynakla çalışabilmesidir. Yani başka hiçbir şey çalışmazsa, bu işe yarar.
Internet Explorer'ın Etki Alanları Arası İsteği Var
Firefox 3.5+, çapraz kaynak paylaşım standardına sahiptir , ancak özel başlıklar (örneğin PHP'de) içermek için erişmeye çalıştığınız kaynak gerektirir:
header("content-type: Access-Control-Allow-Origin: *");
header("content-type: Access-Control-Allow-Methods: GET");
Birkaç büyük tarayıcı da bunu destekliyor , bu nedenle eski tarayıcıları desteklemeniz gerekmiyorsa ve bu başlıkları göndermek için erişmeye çalıştığınız kaynaklara erişebiliyorsanız, bu sizin için en iyi seçenek olabilir, aksi takdirde sunucu tarafı senaryo benim tavsiyem olurdu.
Firefox'un bir kullanıcı ayarı da var capability.policy.default.XMLHttpRequest.open
, ancak tarayıcısında bir ayarı değiştiren kullanıcıya güvenmem.
Bunun için API'yı (başka bir alan adından) kullanabilirsiniz. Javascriptiniz, web sunucunuzda (alan adınız) bulunan PHP dosyasını (veya başka bir komut dosyası) arayacak ve API'yı (CURL kullanan başka bir alan adının) çağıracak ve size yanıt alacaktır.