2010-11-29 6 views
0

Résumé: Continuer d'obtenir une réponse nulle malgré les données publiques et le paramètre de rappel pour activer le domaine JSON inter-domaine. S'il vous plaît aider!facebook graph api ajax XMLHttpRequest - Résultat nul?

Une question similaire a été répondu ici

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

mais je ne suis pas en utilisant jquery et ont essayé d'adapter mon code pour refléter cette réponse. J'essaie d'utiliser un exemple simple pour tester un simple gestionnaire xmlhttprequest. J'ai ce lien dans ma page:

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

Le rappel = paramètre nomMéthode est de permettre le domaine JSON

cross J'utilise un constructeur XMLHttpRequest générique:

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); 
     } 
    } 
} 

J'ai alors gestionnaire:

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{ 
    } 
    } 

Mais je reçois toujours une réponse nulle (statusText OK, code d'état 0). Des idées?

Merci à l'avance

Répondre

1

Vous ne pouvez pas faire une demande ajax interdomaine. Vérifiez si elles prennent en charge JSONP ou utilisez la méthode FB.api à partir de leur SDK javascript http://developers.facebook.com/docs/reference/javascript/FB.api

EDIT: Je n'ai pas lu votre message très attentivement lorsque j'ai répondu. Je vois que vous ajoutez le nom de rappel à votre requête ajax, ce qui ne va pas faire de bien parce que vous faites toujours une requête XHR, donc cela échouera quand même à travers le domaine. Vous semblez mal comprendre comment fonctionne JSONP.

Normalement, je suggère simplement d'utiliser un framework comme jQuery pour extraire le travail que vous ne devriez pas avoir à réinventer. Si vous êtes absolument dédié à le faire sans jQuery, commencez par lire l'article wikipedia sur la façon dont fonctionne JSONP: http://en.wikipedia.org/wiki/JSON#JSONP

L'idée de base est:

  1. Créer un nœud de script où l'attribut src ressemble juste comme l'URL que vous essayez de demander maintenant.
  2. Le serveur répondra avec quelque chose comme: methodname ({"foo": "bar"}); au lieu de simplement JSON. Comme ceci est demandé via un noeud de script, votre navigateur exécutera la fonction "methodname" et transmettra les résultats.
  3. mettre en œuvre la fonction methodname (réponse) pour gérer la réponse (c.-à-faire le travail que vous l'intention de le faire dans processReqChange)
+0

Merci Mike. Tu avais raison, je n'avais pas la tête autour de JSONP.L'approche de l'étiquette de script semble IMO un peu hacky donc, dans l'ensemble, j'ai décidé de faire le grand saut avec jquery. Je l'ai éteint, mais voilà ... – Derek

1

Retirez cette ligne et essayez à nouveau:

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

Il établit la connexion pour fermer automatiquement, souvent avant que l'envoi soit terminé.

Questions connexes