2010-11-29 13 views
0

摘要:儘管公開數據並設置了回調以啓用跨域JSON,但仍然獲得空響應。請幫忙!facebook圖api ajax XMLHttpRequest - 無效果?

類似的問題已經在這裏找到答案

Using the new facebook graph api, ajax calls returns null (empty)

,但我不使用jQuery和試圖適應我的代碼,以反映這個問題的答案。

我想用一個簡單的例子來測試一個簡單的xmlhttprequest處理程序。我在我的網頁鏈接:

<a href='javascript:loadXMLDoc(\"https://graph.facebook.com/btaylor?callback=methodname\",\"\")'>AJAX LINK</a> 

回調=方法名參數,從而實現跨域JSON

我使用的是通用的XMLHttpRequest建設者:

var req; // Request object 

function loadXMLDoc(url,params){ 

    // branch for native XMLHttpRequest object 
    if (window.XMLHttpRequest) { 
     req = new XMLHttpRequest(); 
     req.onreadystatechange = processReqChange; 
     req.open("GET", url, true); 
     req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     req.setRequestHeader("Content-length", params.length); 
     req.setRequestHeader("Connection", "close"); 
     req.send(params); 

    // branch for IE/Windows ActiveX version 
    } else if (window.ActiveXObject) { 
     req = new ActiveXObject("Microsoft.XMLHTTP"); 
     if (req) { 
      req.onreadystatechange = processReqChange; 
      req.open("GET", url, true); 
      req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
      req.setRequestHeader("Content-length", params.length); 
      req.setRequestHeader("Connection", "close"); 
      req.send(params); 
     } 
    } 
} 

然後我有一個處理程序:

function processReqChange(){ 

    if (req.readyState == 4) { 
      if (req.status == 200) { 
       alert("Done"); 
      } else { 
       //alert("There was a problem retrieving the data:\n" + req.statusText); 
       alert("Status Code = "+req.status); 
      alert("There was a problem retrieving the data:\n"); 
      alert("Failed : object = "+req); 
       alert(req.responseXML); 
       alert("Failed : response = "+req.responseText); 
      alert("Failed : status = "+req.statusText); 
      } 
     }else{ 
    } 
    } 

但我一直得到一個空響應(statusText OK,狀態碼0)。有任何想法嗎?

在此先感謝

回答

1

您無法進行跨域的ajax請求。看看他們是否支持JSONP,或者使用他們的JavaScript SDK中的FB.api方法 http://developers.facebook.com/docs/reference/javascript/FB.api

編輯:我沒有讀完你的文章,當我回答。 我看到您將回調名稱添加到您的ajax請求中,由於您仍然在進行XHR請求,因此該回調名稱將無法執行任何操作,因此它仍然會失敗跨域。你似乎誤解了JSONP的工作原理。

通常我只是建議使用像jQuery這樣的框架來抽象出你不應該重新創建的工作。 http://en.wikipedia.org/wiki/JSON#JSONP

的基本思路是:

  1. 創建一個腳本節點,在src屬性看起來就像如果你是絕對致力於這樣做沒有jQuery的,通過讀取JSONP是如何工作的維基百科的文章開始比如你現在試圖請求的URL。
  2. 服務器會響應類似於:methodname({「foo」:「bar」});而不僅僅是JSON。由於這是通過腳本節點請求的,您的瀏覽器將執行「methodname」函數並傳遞結果。
  3. 實現方法名(響應)函數來處理響應(即你打算在processReqChange做的工作)
+0

謝謝邁克。你說得對,我沒有把我的腦袋繞過JSONP。腳本標記的方法似乎IMO有點哈克,所以平衡我已決定採取與jquery暴跌。一直推遲它,但這裏去... – Derek 2010-11-30 19:56:46

1

刪除此行,然後再試一次:

req.setRequestHeader("Connection", "close"); 

它建立的連接經常在發送完成之前自動關閉。