Возникли проблемы с jQuery, ajax и jsonp - PullRequest
5 голосов
/ 13 июня 2011

Я использую jsonp и ajax для запроса веб-сервиса, написанного на java, на другом сервере.Я использую следующую команду jquery:

$.ajax({
    type: "GET",
    url: wsUrl,
    data: {},
    dataType: "jsonp",
    complete: sites_return,
    crossDomain: true,
    jsonpCallback: "sites_return"
});


function jsonp_callback(data) {
    console.log(data);
}

function sites_return(data) {
    console.log(data);
}

Так что моя проблема в том, что после завершения запроса вызывается функция jsonp_callback.Там, где я четко вижу строку в формате json:

{"listEntries":["ELEM1", "ELEM2", "ELEM3", etc...]}

Но после вызова функции sites_return, когда происходит полное событие, я получаю следующее:

Object { readyState=4, status=200, statusText="parsererror"}

Также для справкифункция jsonp_callback вызывается перед функцией sites_return.Также, если я извлекаю из кода функцию jsonp_callback, я получаю жалобу на то, что она не реализована.

Мой вопрос в три раза: 1) Что я делаю неправильно на стороне jquery?2) Почему json правильно анализируется в jsonp_callback, а не sites_return?3) Что я могу сделать, чтобы исправить эти проблемы?

РЕДАКТИРОВАТЬ

Некоторые новые разработки.В комментариях приведена некоторая дополнительная информация.

Ниже приводится ответ http:

jsonp_callback({"listEntries":["ELEM1", "ELEM2", "ELEM3"]})

Я предполагаю, что именно по этой причине вызывается jsonp_callback.Я предполагаю, что мой вопрос теперь становится, есть ли способ контролировать это (при условии, что у меня нет доступа к внутреннему веб-сервису).

Ответы [ 4 ]

2 голосов
/ 14 июня 2011

Надеюсь, это поможет ~

var url = "http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false";
var address = "1600+Amphitheatre+Parkway";
var apiKey = "+Mountain+View,+CA";

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?",
  function(data, textStatus){
     console.log(data);
  });
1 голос
/ 13 июня 2011

Я думаю , что проблема в том, что ваш сервер ведет себя не так, как этого ожидает jQuery.«Протокол» JSONP не очень стабилен, но обычно предполагается, что сайт должен искать параметр «обратного вызова» и использовать его в качестве имени функции при создании ответа JSONP.Выглядит так, как будто ваш сервер всегда использует имя функции "jsonp_callback".

Это может сработать, чтобы сообщить jQuery, что ваш обратный вызов напрямую "jsonp_callback":

$.ajax({
    type: "GET",
    url: wsUrl,
    data: {},
    dataType: "jsonp",
    complete: sites_return,
    crossDomain: true,
    jsonpCallback: "jsonp_callback"
});

Не уверен на 100%.

1 голос
/ 13 июня 2011

Я считаю, что первым аргументом функции sites_return будет объект jqXHR.Вместо complete попробуйте использовать success.

Но все же это может не сработать, так как кажется, что есть ошибка синтаксического анализа (упоминается в возвращаемом значении sites_return функции, вызываемой из oncomplete).Поэтому сначала вам нужно проверить строку json.

Чтобы проверить JSON, вы можете использовать http://jsonlint.com/

0 голосов
/ 13 июня 2011

Если у вас нет возможности изменить оболочку функции JSONP, которую возвращает удаленный сервер, jQuery $.ajax() может оказаться здесь излишним.В конечном счете, все, что вы делаете, это вставляет ссылку на скрипт на wsUrl, что вызывает jsonp_callback с литералом объекта JavaScript в качестве входного параметра.

Вы можете так же легко сделать что-то подобноеи избежать путаницы вокруг именования / синтаксиса обратного вызова:

$.getScript(wsUrl);

function jsonp_callback(response) {
  // Access the array here via response.listEntries
}
...