2011-06-13 25 views
5

Başka bir sunucuda java'da yazılmış bir web hizmetini sorgulamak için jsonp ve ajax kullanıyorum.jQuery, ajax ve jsonp ile sorun yaşama

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "sites_return" 
}); 


function jsonp_callback(data) { 
    console.log(data); 
} 

function sites_return(data) { 
    console.log(data); 
} 

Bu kadar sorun sorgusu tamamlandıktan sonra jsonp_callback adında bir işlev denir: Ben şu jquery komut kullanıyorum. Açıkça json biçimlendirilmiş dize görebilirsiniz Nerede:

Object { readyState=4, status=200, statusText="parsererror"} 

Ayrıca başvuru için jsonp_callback fonksiyonudur:

{"listEntries":["ELEM1", "ELEM2", "ELEM3", etc...]} 

Ama işlev sites_return denir sonra

tam olayı harekete, şu olsun site_return işlevinden önce çağrıldı. Ayrıca jsonp_callback işlevini koddan çıkarırsam, işlev uygulanmadığı için bir şikayette bulunur.

Sorum şu üç kat: 1) JQuery tarafında neyi yanlış yapıyorum? 2) Neden json jsonp_callback'de doğru şekilde ayrıştırılır, ancak site_return değil? 3) Bu sorunları gidermek için neler yapabilirim?

Bazı yeni gelişme DÜZENLEME. Buradaki yorumlara göre bazı ek bilgiler.

şu bu çağrıldığını nedeni jsonp_callback olduğunu varsayalım http yanıtı

jsonp_callback({"listEntries":["ELEM1", "ELEM2", "ELEM3"]}) 

çıkan şeydir. Sanırım şimdi sorum şu, bunu kontrol etmenin herhangi bir yolu var mı (arka uç web servisine erişimim olmadığı varsayımıyla).

+0

Bence gerek mi sanıyorsun Tüm JSON'ları görün, çünkü bu ayrıştırma hatasına neden olan bir sorun var. – Pointy

+0

Ayrıca, "jsonp_callback" işlevinin neden çağrıldığını net değil. – Pointy

+0

Hepsi buradaki json. Asıl elemanları sahte isimlerle değiştirdim ama format tam olarak aynı (tabii ki vs.). HTTP üstbilgisinin yanıtında geri dönen şey aşağıdadır. jsonp_callback ({"listEntries": ["ELEM1", "ELEM2", "ELEM3"]}). Ona baktığımda, fonksiyonun çağrıldığını varsayıyorum çünkü bu, http başlığı içinde nasıl biçimlendirildiğidir. – sumone4life

cevap

1

sites_return işlevinin ilk argümanının jqXHR Nesnesi olacağına inanıyorum. complete yerine, success kullanmayı deneyin.

Ancak yine de bu, bir ayrıştırma hatası olduğu anlaşılmamış gibi çalışmayabilir (tamamlanmamış olarak adlandırılan sites_return işlevinin dönüş değeriyle belirtilmiştir). Bu nedenle, ilk olarak json dizginizi kontrol etmeniz gerekir.

ben sorun sunucu jQuery de beklediği şekilde davrandığını olmadığını olduğuna düşünüyorum http://jsonlint.com/

+0

Sorun, muhtemelen arka uçtan ve kontrolümden biçimlendirilen jsonp_callback (...) sorunudur. Bu konuyla ilgilenmenin yaratıcı bir yolunu bulmam gerekecek gibi görünüyor. – sumone4life

1

kullanabilirsiniz, JSON doğrulama için. JSONP "protokolü" çok kararlı değildir, ancak genellikle olması gereken, sitenin "geri arama" parametresini araması ve JSONP yanıtını oluştururken işlev adı olarak kullanılmasıdır. Sunucunuz her zaman "jsonp_callback" işlev adını kullanıyormuş gibi görünüyor.

Bu sizin geri arama doğrudan "jsonp_callback" olduğunu jQuery söylemek işe yarayabilecek: Ancak

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "jsonp_callback" 
}); 

Değil% 100 emin.

0

Uzak sunucunun döndürdüğü JSONP işlev sarmalayıcısını değiştirme yeteneğiniz yoksa, jQuery's $.ajax() burada aşırı olabilir.Sonunda, yaptığınız tek şey, wsUrl'a bir betik referansı enjekte etmek, bu da giriş parametresi olarak bir JavaScript nesnesi ile jsonp_callback aramasını yapıyor.

gibi kolayca böyle bir şey yapmak ve geri arama adlandırma/sözdizimi etrafında karışıklığı önlemek olabilir: Bu yardımcı olur

$.getScript(wsUrl); 

function jsonp_callback(response) { 
    // Access the array here via response.listEntries 
} 
2

Umut ~

var url = "http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false"; 
var address = "1600+Amphitheatre+Parkway"; 
var apiKey = "+Mountain+View,+CA"; 

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?", 
    function(data, textStatus){ 
    console.log(data); 
    });