facebook graph api ajax XMLHttpRequest - Нулевой результат? - PullRequest
0 голосов
/ 29 ноября 2010

Резюме: продолжайте получать нулевой ответ, несмотря на общедоступные данные и настройку обратного вызова для включения междоменного JSON. Пожалуйста, помогите!

Подобный вопрос был дан ответ здесь

При использовании нового API-интерфейса facebook facebook ajax звонки возвращают ноль (пусто)

но я не использую jquery и пытался адаптировать свой код для отражения этого ответа.

Я пытаюсь использовать простой пример для проверки простого обработчика xmlhttprequest. У меня есть эта ссылка на моей странице:

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

Параметр callback = 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). Есть идеи?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Удалите эту строку и повторите попытку:

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

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

1 голос
/ 29 ноября 2010

Вы не можете сделать междоменный запрос ajax.Посмотрите, поддерживают ли они JSONP или используют метод FB.api из своего javascript SDK http://developers.facebook.com/docs/reference/javascript/FB.api

РЕДАКТИРОВАТЬ: я не очень внимательно прочитал ваш пост, когда ответил.Я вижу, что вы добавляете имя обратного вызова в свой запрос ajax, что не принесет никакой пользы, потому что вы все еще делаете запрос XHR, поэтому он все равно не будет работать в междоменном домене.Похоже, вы неправильно понимаете, как работает JSONP.

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

Основная идея:

  1. Создание узла сценариягде атрибут src выглядит так же, как URL, который вы сейчас запрашиваете.
  2. Сервер ответит примерно так: methodname ({"foo": "bar"});вместо просто JSON.Так как это запрашивается через узел сценария, ваш браузер выполнит функцию «methodname» и передаст результаты.
  3. реализует функцию methodname (response) для обработки ответа (т.е. выполняет работу, которую вы намеревались сделатьin processReqChange)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...