Как запросить API Graph Facebook с помощью JSONP - PullRequest
5 голосов
/ 12 января 2011

Не следует ли выполнять запрос AJAX с работой JQuery?

$.getJSON('https://graph.facebook.com/138654562862101/feed?callback=onLoadJSONP');

Я определил функцию обратного вызова с именем onLoadJSONP.

Но Chrome выдает мне типичную ошибку политики одного и того же происхождения:

XMLHttpRequest не может загрузить https://graph.facebook.com/138654562862101/feed?callback=onLoadJSONP. Нулевое происхождение не допускается Access-Control-Allow-Origin.

Я думал, что JSONP обошёл это, что я делаю не так?

Ответы [ 3 ]

17 голосов
/ 12 января 2011

jQuery обнаруживает желаемое поведение JSONP , в частности с callback=?, поэтому вам потребуется точно , а затем передать функцию Вы хотите справиться с этим. Без внешних изменений вы можете сделать это:

$.getJSON('https://graph.facebook.com/138654562862101/feed?callback=?', onLoadJSONP);

Это позволяет поиску callback=? по-прежнему работать, используя вашу функцию в качестве обратного вызова напрямую. Раньше он не обнаруживал, что вам нужна выборка JSONP, и пытался использовать запрос XMLHttpRequest для захвата данных ... что не удается из-за того же ограничения политики происхождения.

4 голосов
/ 12 января 2011

Это должен быть "callback =?" и затем вы определяете обратный вызов как последний параметр запроса.

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
  {
    tags: "cat",
    tagmode: "any",
    format: "json"
  },
  function(data) {
    $.each(data.items, function(i,item){
      $("<img/>").attr("src", item.media.m).appendTo("#images");
      if ( i == 3 ) return false;
    });
  });
1 голос
/ 07 июня 2012

Просто добавьте следующий код JavaScript, прежде чем совершать междоменный вызов AJAX.

jQuery.support.cors = true;

$.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {

  if(jQuery.browser.msie && window.XDomainRequest) {

    var xdr;

    return {

        send: function( headers, completeCallback ) {

            // Use Microsoft XDR
            xdr = new XDomainRequest();

            xdr.open("get", options.url);

            xdr.onload = function() {

                if(this.contentType.match(/\/xml/)){

                    var dom = new ActiveXObject("Microsoft.XMLDOM");
                    dom.async = false;
                    dom.loadXML(this.responseText);
                    completeCallback(200, "success", [dom]);

                }else{

                    completeCallback(200, "success", [this.responseText]);

                }

            };

            xdr.ontimeout = function(){
                completeCallback(408, "error", ["The request timed out."]);
            };

            xdr.onerror = function(){
                completeCallback(404, "error", ["The requested resource could not be found."]);
            };

            xdr.send();
      },
      abort: function() {
          if(xdr)xdr.abort();
      }
    };
  }
});
...