2012-04-17 2 views
0

Я столкнулся с трудностями с проблемой перекрестной политики JSON. После небольшого эксперимента я смог заставить этот код работать, но я столкнулся с ситуацией, когда у меня было два кода, которые кажутся им одинаковыми, но работает только один.В чем разница между этими двумя сценариями ajax?

JSON я доступ здесь

http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json

Этот файл может быть просто JSONP: он не принимает никаких параметров, и JSON проложенный с вызовом функции называется jsonCallBack. Он кажется действительным JSON.

Вот первый набор кода, который я пытался использовать, чтобы захватить этот JSON данные:

$.getJSON("http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback", function (data) { 
       //This will not alert 
       alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode);    
      }); 

Мое понимание было то, что вы могли бы заменить callback=? с именем функции обертки, чтобы иметь эти данные передан анонимной функции. Этот код показывает следующее сообщение об ошибке в инструментах Chrome Dev:

XMLHttpRequest не может загрузить http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback. Происхождение http://fiddle.jshell.net не допускается Access-Control-Allow-Origin.

Стоит отметить, что если оставить URL в aphnonstopproductsjson.json?callback=? и имеют именованный функцию, присутствующую в моем коде, то данные извлекаются правильно и с именем функции с именем (хотя анонимный один до сих пор нет)

Вот второй код, который работает:

$.ajax({ 
url: "http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=?", 
     dataType: 'json', 
     jsonp : "callback", 
     jsonpCallback: "jsonCallback", 
     success: function(data) { 
      //This alert will fire 
      alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode); 
     } 
    }); 
});​ 

В этом вызове, я указать, что имя параметра должно быть обратный вызов, и имя функции должно быть jsonCallback. Итак, по сути, это не так, как первый код? Если да, то почему первый код выходит из строя?

См обе части кода здесь: http://jsfiddle.net/3EXca/ (Вы должны получить уведомление, в котором говорится, «АБЗ»)

+0

Вы тестировали во всех браузерах? Я думаю, что эти ошибки исходят от FireFox –

+0

Это * не * действительный JSONP. JSONP позволяет указать имя обратного вызова. –

+0

@bobek, я в первую очередь тестирую в Chrome, но также получаю сообщение об ошибке в Firefox. –

ответ

1

Проблема заключается в том, что сервер не поддерживает JSONP должным образом. Без параметра обратного вызова не должно быть обратного вызова. Вместо этого у него уже есть jsonCallback. Возможно, есть способ переопределить это, но я не могу угадать параметр.

$.getJSON Для работы с JSONP сервер должен поддерживать JSONP с некоторым именем параметра callback.

Второй работает, потому что вы заставляете jQuery использовать имя функции jsonCallback. :

jsonp: 'callback' 

не имеет значения, так как он всегда оборачивает с jsonCallback в любом случае.

+0

Благодарим вас за ответ Мэтью. Однако я все еще путаюсь между разницей между частями кода.Почему один работает, а не другой? –

+0

Первое не работает, потому что jQuery не знает, как использовать имя jsonCallback как имя функции. –

+0

ОК, спасибо за ваше редактирование. –

Смежные вопросы