JSONP nedir?
Jsonp ile hatırlanması gereken önemli şey, aslında bir protokol veya veri türü olmamasıdır. Bu , anında bir komut dosyası yüklemenin ve sayfaya tanıtılan komut dosyasını işlemenin bir yoludur . JSONP ruhuna uygun olarak bu, sunucudan istemci uygulamasına / komut dosyasına yeni bir javascript nesnesi tanıtmak anlamına gelir.
JSONP ne zaman gereklidir?
Bir alanın aynı sayfadaki diğerinden eşzamansız olarak verilere erişmesine / işlemesine izin verme yöntemidir. Öncelikle, bir XHR (ajax) isteği ile ortaya çıkabilecek CORS (Çapraz Kaynak Paylaşımı) kısıtlamalarını geçersiz kılmak için kullanılır. Komut dosyası yüklemeleri, CORS kısıtlamalarına tabi değildir.
Nasıl oldu
Sunucudan yeni bir javascript nesnesinin tanıtılması birçok şekilde uygulanabilir, ancak en yaygın uygulama, sunucunun bir 'geri arama' işlevinin yürütülmesini gerekli nesnenin kendisine iletilmesiyle gerçekleştirmesidir. Geri çağırma işlevi, istemcide zaten kurduğunuz ve komut dosyasının kendisine iletilen verileri işlemek için komut dosyasının yüklendiği noktada çağrıları yüklediğiniz bir işlevdir .
Misal:
Birinin evindeki tüm öğeleri kaydeden bir uygulamam var. Uygulamam kuruldu ve şimdi ana yatak odasındaki tüm öğeleri almak istiyorum.
Başvurum açık app.home.com
. Verileri yüklemem gereken apiler açık api.home.com
.
Sunucu açıkça buna izin verecek şekilde ayarlanmadıkça, bu verileri yüklemek için ajax kullanamam, çünkü ayrı alt alanlardaki sayfalar bile XHR CORS kısıtlamalarına tabidir.
İdeal olarak, x alanı XHR'ye izin vermek için bir şeyler ayarlayın
İdeal olarak, api ve uygulama aynı etki alanında olduğundan, üstbilgileri ayarlamak için erişimim olabilir api.home.com
. Access-Control-Allow-Origin:
Yaparsam, erişim sağlayan bir başlık öğesi ekleyebilirim app.home.com
. Başlığın aşağıdaki gibi ayarlandığını varsayarsak Access-Control-Allow-Origin: "http://app.home.com"
, bu JSONP'yi kurmaktan çok daha güvenlidir. Bunun nedeni app.home.com
, CORS'a tüm internete erişim api.home.com
izni api.home.com
vermeden istediği her şeyi alabilmesidir .
Yukarıdaki XHR çözümü mümkün değildir. JSONP'yi kur İstemci komut dosyamda: JSONP çağrısı yaptığımda sunucudan gelen yanıtı işlemek için bir işlev kuruyorum. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Sunucunun bir mini betiğe benzer bir görünüme kavuşması için ayarlanması gerekecektir. "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Böyle bir şey //api.home.com?getdata=room&room=main_bedroom
çağrıldığında böyle bir dizgeyi döndürecek şekilde tasarlanmış olabilir .
Ardından müşteri aşağıdaki gibi bir komut dosyası etiketi oluşturur:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Bu, betiği yükler ve hemen window.processJSONPResponse()
sunucu tarafından yazılmış / echo / yazdırılmış olarak çağırır . İşleve parametre olarak aktarılan veriler artık dataFromServer
yerel değişkende saklanır ve bununla ihtiyacınız olan her şeyi yapabilirsiniz.
Temizlemek
Müşteri verilere sahip olduğunda, yani. komut dosyası DOM'a eklendikten hemen sonra komut dosyası öğesi DOM'dan kaldırılabilir:
script.parentNode.removeChild(script);