CrossDomain JQuery AJAX не получает JSON - PullRequest
1 голос
/ 15 ноября 2011

Я просто создал эшафот rails 3.0 и выставил его, используя json, и продолжил его работу.

Так что, если я нажму http://localhost:3001/objects.json

Я вижу данные json в браузере

Далее у меня есть один простой html, который включает code.jquery.com/jquery-1.7.min.js. Я открыл эту страницу в Firefox (Ubuntu), затем открыл консоль Firebug и попытался следовать

var myurl = 'http://localhost:3001/objects.json';

$.ajax({
url: myurl,
dataType: 'jsonp',
error: function(data){ console.log("error:"+data); console.log("error:"+data.readyState); },
success: function(data){ console.log("success:"+data); }
});

Я хотел получить тот же самый json в обработчике успеха, что я наблюдал до сих пор:

если указан dataType: 'jsonp'

  1. Я получаю ответ json (проверено с помощью firebug: Net), так же, как я вижу в браузере
  2. Я не получаю успех под названием
  3. Я получаю сообщение об ошибке, с кодом состояния = 4 и status = "success"

иначе я получу

бланк ответа

И еще одна вещь, каждый раз, когда я получаю 200 обратно.

Любые намеки ... что здесь происходит?

Добавление кода и журнала на стороне сервера

code =>

# GET /objects
# GET /objects.json
def index
  @objects = Object.all

  respond_to do |format|
    format.html # index.html.erb
    format.json  {
      render :json => @objects.to_json, :layout => nil
      }
  end
end

образец журнала =>

Started GET "/objects.json?callback=jQuery17024293556233345082_1321347517236&_=1321347853199" for 127.0.0.1 at 2011-11-15 14:34:13 +0530
  Processing by objectsController#index as JSON
  Parameters: {"callback"=>"jQuery17024293556233345082_1321347517236",     "_"=>"1321347853199"}
  [1m[35mobject Load (0.1ms)[0m  SELECT `objects`.* FROM `objects`
Completed 200 OK in 11ms (Views: 5.4ms | ActiveRecord: 0.1ms)

Ответы [ 4 ]

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

Я думаю, что вы используете $.getJSON может быть лучше

0 голосов
/ 15 ноября 2011

Во-первых, я предполагаю, что это должно быть Object.all

Я предполагаю, что сервер, с которого вы запрашиваете, отличается от сервера, который предоставляет вам данные JSON.то есть разные порты в этом случае или я не вижу необходимости использовать JSONP.

JSONP не является ajax, но использует атрибуты src в тегах сценария.Если вы пытаетесь получить доступ к информации с того же сервера, то dataType: json должен быть подходом.

Если вы выбираете информацию с другого сервера, я предлагаю добавить в конец вашего потока URL ?callback=?.

С Jquery $ .getJSON должен быть подходящим вариантом.Например

$.getJSON(url, data, function(response){<br> // Do something with response; });

Ссылка http://api.jquery.com/jQuery.getJSON/

Применительно к вашему последнему комментарию используйте этот формат.



$.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){});

  });


Обновление Только что вспомнил этот бит. Если у вас есть контроль над обоими серверами, отправляете ли вы ответы JSONP?Если это ваши данные JSON


response = { status:'success', message:'Successfully created object'}

Чтобы отправить их как JSONP, вы должны заключить их в функцию ().Например,


jsoncallback + "(" + JSON.stringify(response)  + ");";

. Он выполняет функцию, сгенерированную Jquery (это делается внутренне при задании обратного вызова =?. Вы можете получить значение, проверив localhost: 3001 logs) и передавая данные JSON какпараметры к этому.

Так что, если на стороне сервера вы не генерируете ответ JSON-P, он не будет работать.

0 голосов
/ 15 ноября 2011

Однажды мы столкнулись с подобной проблемой, хотя с json, а не с jsonp. И это не было междоменной проблемой. Опираясь на свою память, я считаю, что мы должны были удалить response_to из контроллера и предоставить: status => 200, чтобы метод render работал. Я не очень уверен, но вы могли бы дать ему шанс.

0 голосов
/ 15 ноября 2011

Возможно, вы возвращаете неверный результат Content-type (не jsonp). Если вы хотите, чтобы jQuery запускал событие success независимо от Content-type, удалите параметр dataType из параметров ajax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...