2012-04-25 25 views
1

我正在開發HTML5,jQuery Mobile的應用JSON Web服務。我必須使用第三方JSON Web服務來獲取數據。但是我在我的jquery函數中有parseerror。看來問題在於Web服務發送JSON。我必須使用JSONP,因爲它是跨域的。無論如何用jQuery或JavaScript來做到這一點。這是我正在使用的代碼。工作與使用jQuery

$.ajax({ 
      url : jsonServiceURL + "scheduleService/retrieveMySchedules.json?callback=?", 
      dataType : "json", 
      beforeSend: function(x) { 
       if(x && x.overrideMimeType) { 
       x.overrideMimeType("application/json;charset=UTF-8"); 
       } 
      }, 
      timeout : 5000 
     }).success(function() { 
       alert('pass');  
     }).error(function(httpObj, textStatus) {   
      alert(textStatus); 
     }); 

請求去。答案也來了。但它說parseerror。我覺得這在JSON和JSONP方面有所不同。如果我將URL設置爲http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?我的代碼工作正常沒有問題。第三方Web服務也正確,因爲所有的iphone應用都能正常工作。我看到的唯一區別是JSON以[{開頭,JSONP以somefunction({開頭。

的JSON是有效的。我使用一些在線工具進行了檢查,並且還有幾個iphone應用程序與該Web服務一起工作,沒有出現問題。看來我不能用jQuery解析它,因爲它們發送的是JSON而不是JSONP。如果我的想法不對,請糾正我。有什麼可能的解決方案呢?

回答

1

如果你做跨域請求,使用JSONP。那很好。這與標準的json請求有點不同(用XmlHttpRequest完成)。

你必須把你的要求precising這是JSONP:

$.ajax({ 
     url : jsonpServiceURL + "scheduleService/retrieveMySchedulesJsonp?callback=?", 
     dataType : "jsonp"   
}); 

然後你必須在你的代碼的功能,這將是你的回調:

function InBrowser_receive(answer) { 
     console.log('received:', answer) 
    // do things with answer (the received json) 
} 

就個人而言,我通常不麻煩發送回調名稱到服務器,因爲我也寫服務器部分:我只是硬編碼回調名稱serverwise。

而且我喜歡使用JSON結構過於發送參數傳遞給服務器。因此,我的函數發送請求通常是這樣的:

function sendToServer(message) { 
    $.ajax(
     { 
      url: serverUrl, 
      data: 'theQuery=' + JSON.stringify(message), 
      crossDomain: true, 
      dataType: 'jsonp' 
     } 
    ); 
} 

下面是我的開放源代碼的一個例子: https://github.com/Canop/braldop/blob/master/chrome/braldop/inext_com.js

發送功能是

braldop.sendToBraldopServer 

和接收一個是

receiveFromMapServer 
+0

謝謝你的答案。但它不起作用,因爲響應不在JSONP中。我必須指定回調,因爲它是第三方。 – 2012-04-25 07:31:16

+0

如果你精確的回調,那麼它是在jsonp。或者我錯過了一些東西。 – 2012-04-25 07:32:32

+0

是的。問題是Web服務僅提供JSON而不是JSONP。謝謝。 – 2012-04-25 07:48:23