jQuery: запрашивается помощь по getJSON + SunlightLabs API - PullRequest
2 голосов
/ 22 марта 2011

У меня возникают проблемы при извлечении определенного элемента из вызова API с помощью функции getJSON jQuery.Я пытаюсь использовать конгресс-API SunlightLab для получения конкретной информации о законодателях.В приведенном ниже примере я пытаюсь открыть веб-сайт законодателя:

$.getJSON("http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]&lastname=Weiner&jsonp=?" ,  function(data) {

    alert("hello from sunlight");
    alert(data.response.legislator.website);

}); 

Используя приведенный выше код, появляется первое предупреждение, но второе предупреждение даже не появляется.Я понимаю, что getJSON должен использовать JSONP в этом случае, и я думаю, что я настроил это правильно, заканчивая мой URL '& jsonp =?'.

Размещение URL-адреса в моей функции getJSON в веб-браузере дает мне следующее:

? ({"Response": {"законодатель": {"веб-сайт": "http://weiner.house.gov/", "fax": "202-226-7253", ... и т. д.

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

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Вопросительный знак существует, потому что вы указали функцию обратного вызова JSONP?в строке запроса (т. е. &jsonp=?).Из соображений безопасности (в частности, политика одного и того же происхождения ) вы не можете сделать запрос AJAX для сайта за пределами того же домена, что и страница, на которой вы находитесь.Чтобы обойти это, JSONP работает путем создания тега сценария, в котором для SRC задан URL-адрес сценария на другом сайте.Это загрузит внешний файл JavaScript и запустит любой код.Теперь, чтобы связать этот внешний код с вашим JavaScript, внешний API получает имя вызываемой функции (&jsonp=functionnametocall).Возвращенный JavaScript вызывает эту функцию и передает данные, которые он пытается вернуть как объект JSON, в качестве первого аргумента.

Итак, причина, по которой вы видите знак вопроса, когда вы идете туда, заключается в том, что вы передаетевопросительный знак для параметра строки запроса jsonp.jQuery автоматически преобразует вопросительный знак в URL, например http://www.test.com/api/apikey=292929&callback=?, в функцию с уникальным именем.Это обрабатывается в фоновом режиме с помощью jQuery, так что вам не нужно об этом думать.

Теперь, несмотря на это, я не знаю, определяет ли jQuery, является ли имя параметра обратного вызова чем-то отличным отcallback=?.$.getJSON() однако является краткой формой для более длинных:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Я предлагаю вам попробовать использовать $.ajax() напрямую и установить значение jsonp равным "jsonp".Это говорит методу $.ajax(), что параметр строки запроса называется jsonp, а не callback.Итак, вот так:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback,
  jsonp:"jsonp"
});

Дополнительная информация: $. GetJSON | $. Ajax ()

2 голосов
/ 22 марта 2011

Используемый вами URL устанавливает обратный вызов JSONP равным ?, что означает внедрение функции JavaScript с именем ? с аргументом объекта JavaScript. Это неверно Итак, запрос успешно выполняется, но определенная вами функция-оболочка не вызывается (и недействительна).

Вы можете изменить URL-адрес таким образом, чтобы он jsonp=callback (или другое имя функции-обработчика), а затем определить функцию с именем callback, которая обрабатывает аргумент, который ожидает объект.

Одним из способов (автоматического) запуска поддержки JSONP в jQuery является переключение ключа, который будет называться «обратный вызов», чтобы он сигнализировал jQuery, что вы выполняете вызов JSONP. т.е. callback=callback.

EDIT : Как указывает Drackir, jQuery предоставляет параметр в $.ajax, позволяющий ему определять свое собственное имя функции обратного вызова, но вам нужно сообщить ему, что его Вызов JSONP путем установки dataType: 'jsonp' в вызове $.ajax.

0 голосов
/ 22 марта 2011

ОК, ОК, так что это было довольно простое исправление, добавив строку к примеру, приведенному @Drackir. В настройках ajax отсутствовал фрагмент «cache: true». Окончательный рабочий код выглядел так:

$.ajax({
         url: 'http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]7&lastname=Weiner',
         dataType: 'jsonp',
         cache: true,
         jsonp: 'jsonp',
         success: function(data) {
             alert("hello from ajax") ;
             alert(data.response.legislator.website);
         }

    });

Я не уверен, почему в этом случае требуется «cache: true». Спасибо за помощь.

...