2010-11-29 2 views
0

Реферат: Продолжайте получать нулевой отклик, несмотря на общедоступные данные и настраивать обратный вызов, чтобы разрешить перекрестный домен JSON. Пожалуйста помоги!facebook graph 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> 

Обратный вызов = параметр MethodName должен включить Междоменное 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 или используют метод FB.api из своего javascript SDK http://developers.facebook.com/docs/reference/javascript/FB.api

EDIT: Я не читал ваше сообщение очень тщательно, когда я ответил. Я вижу, что вы добавляете имя обратного вызова в свой запрос ajax, который не будет делать ничего хорошего, потому что вы все еще делаете запрос XHR, поэтому он все равно будет терпеть неудачу в кросс-домене. Кажется, вы неправильно понимаете, как работает JSONP.

Обычно я предлагаю использовать фреймворк как jQuery, чтобы абстрагировать работу, которую вам не нужно изобретать. Если вы абсолютно убежденный делать это без JQuery, начните читать статью Википедии о том, как работает JSONP: http://en.wikipedia.org/wiki/JSON#JSONP

Основная идея заключается в том:

  1. Создать узел сценария, где атрибут SRC выглядит как 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"); 

Он устанавливает соединение закрывать автоматически, часто до завершения отправки.