2013-04-15 245 views
0

我需要從跨域獲取json數據。跨域ajax請求問題

$.getJSON('http://xx.xx.xx.xx/SampleService/Handler.ashx?callback=?', data, function (jsonData) { 
       alert('1'); 
      }) 
      .done(function() { console.log("second success"); }) 
      .fail(function() { console.log("error"); }) 
      .always(function() { console.log("complete"); }); 

處理代碼:

context.Response.ContentType = "application/json"; 
       SampleService service = new SampleService(); 

       List<List<Byte>> response = service.GetData(); 
       string jsonData = JsonConvert.SerializeObject(response); 
       context.Response.Write(string.Format("{0}([{1}]);", context.Request["callback"], jsonData)); 

的錯誤,我得到的是:

"parsererror" 
Error: jQuery19108131180874027861_1366004862133 was not called 
+0

http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain – Satpal

回答

1

使用跨域請求JSONP調用。在你的PHP頁面返回使用這樣的

$.ajax({ 
     url : "http://xx.xx.xx.xx/SampleService/Handler.ashx", 
     type: "GET", 
     dataType: "jsonp", 
     jsonp : "callback", 
     success: function(data) {alert("Success");}, 
     error: function(data) { alert("Error"); } 

     });   
    }); 

導致這樣

echo $_GET['callback'] . "($result)";exit; 

其中$結果是你的json_encoded陣列。

+2

你能否詳細說明一下? – benjamin54

+0

查看我的更新回答 –

+0

@chandresh在錯誤函數結尾處有一個尾部','。這可能會導致IE瀏覽器中的問題。 – Jai

0

您所看到的jQuery19108131180874027861_1366004862133是一個自動生成的回調包裝函數,jQuery在未指定回調函數時附加該函數。即你有回調= ?.如果您可以訪問您正在調用的服務器端腳本,則可以將JSON封裝到一個函數中,並使用JSONP調用該腳本來解決跨域問題。即 - 命名您的回調函數jsonCallback。

服務器端腳本輸出:

jsonCallback(
    { 
     [insert your json code here] 
    } 
); 

然後客戶端:

(函數($){ VAR URL = 'http://www.jquery4u.com/scripts/jquery4u-sites.json?callback=?';

$.ajax({ 
   type: 'GET', 
    url: url, 
    async: false, 
    jsonpCallback: 'jsonCallback', 
    contentType: "application/json", 
    dataType: 'jsonp', 
    done: function(json) { 
       console.dir(json); 
    }, 
    fail: function(e) { 
       console.log(e.message); 
    } 
}); 

})(jQuery); 

進一步閱讀:JQUERY’S JSONP EXPLAINED WITH EXAMPLES

+0

你也可以添加'crossdomain:true,'。 – Jai

+0

另請注意,自從jQuery 1.9.x for .done()和.fail()以來,函數.success()和error()不推薦使用。 –

+0

'成功:func(){}和錯誤:函數(){}'這是怎麼回事。 – Jai