Ajax跨域訪問XML數據的另一種方式——使用YQL查詢語句


  XML數據默認是不能在客戶端通過Ajax跨域請求讀取的,一般的做法是在服務器上寫一個簡單的代理程序,將遠程XML的數據先讀到本地服務器,然后客戶端再從本地服務器通過Ajax來請求。由於我們不能對數據源所在的環境進行任何設置和修改,所以僅通過客戶端代碼很難繞過這個問題。但如果請求的數據不是XML而是JSON對象或者JavaScript函數,則通過JSONP方法可以非常容易地解決,直接調用JQuery.getJSON()方法在回調函數中就可以獲取到返回的結果。如果要使用JSONP,可以在指定的URL后面附加查詢參數"&callback=?"。

$(document).ready(function() {
  $.getJSON("http://www.example.com/getdata", function(data) {
  console.log(data);
 })
});
$(document).ready(function() {
  $.getJSON("http://www.example.com/getdata2?callback=?", function(data) {
  console.log(data);
 })
});

  除此之外,我們還可以借助於第三方平台提供的API來訪問數據。YQLYahoo!提供的一套Web Service服務,通過它你可以像SQL語句一樣訪問互聯網上的任何數據,而不存在跨域的問題。

//sample site that returns xml
var site = 'http://feed.cnblogs.com/blog/u/53608/rss';


var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + site + '"') + '&format=xml&callback=?';

// Request that YSQL string, and run a callback function.
// Pass a defined function to prevent cache-busting.
$.getJSON(yql, function (data) {
    console.log(data.results[0]);
});

  YQL API的公共訪問限制是同一IP每小時2000個請求,可以查看官網的介紹https://developer.yahoo.com/yql/guide/usage_info_limits.html

  不過個人認為這種方法依然只是一個臨時解決方案,對於一套完整的Web應用而言,過多地依賴於第三方系統會直接導致系統的穩定性和擴展性,而且會有較大的風險。試想,如果Yahoo!修改了Web Services的接口或者停止了YQL的公共訪問,那么系統中所有依賴於YQL的部分都會出現問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM