Невозможно прочитать данные из вызова AJAX (dataType: jsonp) в веб-службу

Я использую вызов ajax для выполнения операций POST и GET из веб-службы, размещенной на каком-либо сервере.

Я использую dataType: "jsonp" из-за междоменной проблемы. Я вижу данные, отправляемые веб-службой на скрипаче. Я хочу получить доступ к данным, которые я получаю от службы, и я не знаю, как это сделать.

Это мой вызов ajax:

    $.ajax({
        type: method,
        url: "url",
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        jsonp: false,
        jsonpcallback:function(data){},            //What am I supposed to write here so that I can get the JSON data from Padded json
        success: successHandler,
        error: errorHandler
    });

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

    {"Ideas":[
               {"Message":null,"IdeaId":1},
               {"Message":null,"IdeaId":1}
             ]
    }  

Любая помощь будет принята с благодарностью. Я просмотрел много сообщений, но не смог пройти.

Заранее спасибо.


person Abhishek J    schedule 16.11.2012    source источник
comment
Обычно вам не нужны параметры jsonp или jsonpcallback для отправки запроса jsonp. Без них то, что у вас есть, должно работать с обычным веб-сервисом jsonp. Кроме того, веб-сервис должен возвращать json в формате jsonp, а не json. То, что у вас есть выше, это json, а не jsonp.   -  person Kevin B    schedule 17.11.2012
comment
многие API не поддерживают jsonp... убедитесь, что тот, который вы вызываете, поддерживает. Если это только JSON, вы увидите ответ, но безопасность браузера не позволит его использовать   -  person charlietfl    schedule 17.11.2012
comment
Проблема в том, что когда я указываю dataType:json, я не получаю никакого ответа от службы. И когда я указываю jsonp, я вижу ответ, полученный моим локальным приложением. Но проблема в том, что он показывает ошибку: 200parser, хотя я вижу данные json в fiddler. Я запутался и нуждаюсь в помощи по этому поводу.   -  person Abhishek J    schedule 17.11.2012
comment
@AbhishekJ прочитай, что я написал повнимательнее. Если API не возвращает JSONP, вам придется использовать другие методы для получения данных.   -  person charlietfl    schedule 17.11.2012
comment
Не могли бы вы помочь мне с этим. Поскольку моя служба не поддерживает и не возвращает jsonp, то как мне сделать успешный вызов службы, не указав тип данных как jsonp?   -  person Abhishek J    schedule 17.11.2012


Ответы (4)


jsonpcallback:function(data){}, //Что я должен написать здесь, чтобы я мог получить данные JSON из Padded json

Обычно ничего. Вам нужно указать обратный вызов только в том случае, если ваш JSONP-сервис действительно нетипичен. Если вы укажете его, это должна быть строка.

Точно так же вы не должны устанавливать jsonp: false, так как это предотвратит создание параметра обратного вызова.

Однако вам нужен обработчик успеха для обработки данных. Наличие обработчика ошибок также является хорошей идеей.

function successHandler(data) {
    console.log(data)
}

function errorHandler(jqXHR, errorType, exception) {
    console.log(errorType, exception);
}

$.ajax({
    url: "url", // Make this the real URL!
    dataType: "jsonp",
    success: successHandler,
    error: errorHandler
});

Затем обработчик JSONP должен фактически вернуть JSONP.

Заголовок Content-Type, возвращаемый сервером, должен быть application/javascript

Тело должно быть:

  • Значение ключа callback в строке запроса
  • (
  • Немного JSON
  • );

e.g.

jqueryCallback123u54yiyioeuioey8({ "foo": "bar" });
person Quentin    schedule 16.11.2012
comment
Но что, если данные, которые я вижу в fiddler, имеют тип json, а не jsonp? Поправьте меня, если я ошибаюсь. Должен ли я также видеть формат jsonp на скрипаче? - person Abhishek J; 17.11.2012
comment
Если данные в формате JSON, то это не JSONP. Если это не JSONP, вы не можете загрузить его как JSONP. Вы должны иметь возможность использовать скрипку, чтобы увидеть, какие данные отправляются. - person Quentin; 17.11.2012
comment
Отправляемые данные - это json, а не jsonp. Но проблема в том, что когда я указываю тип данных: json, я не получаю никакого ответа от службы (ошибка вызова службы не удалась). Но когда я указываю dataType:jsonp, я вижу данные в формате json. Пожалуйста, помогите мне с этим, так как я долго с этим боролся. - person Abhishek J; 17.11.2012
comment
Вы не можете заставить браузер извлекать данные со стороннего сайта и предоставлять их вашему JavaScript без сотрудничества со сторонним сайтом (например, путем представления данных в виде JSONP). Это мера безопасности, чтобы не дать сайту Joe Random получить доступ к сайту Joe Random Other с учетными данными владельца браузера. - person Quentin; 17.11.2012
comment
Если вам не нужно получать данные с учетными данными пользователя, вы можете либо проксировать через тот же источник, либо использовать другой удаленный источник, который будет проксировать его и перекодировать данные как JSONP. - person Quentin; 17.11.2012
comment
Я мог взаимодействовать со службой, когда она размещалась на моем локальном сервере IIS с использованием dataType:json. Но когда я размещал веб-службу в лазурном облаке, я не мог использовать службу с использованием dataType:json. В чем причина этого? - person Abhishek J; 17.11.2012
comment
Потому что браузеры рады предоставить данные на веб-сайте этому веб-сайту. Если вы размещаете данные на другом веб-сайте, они ограничивают их для защиты пользователей. Например, было бы нехорошо, если бы веб-сайт мог использовать JavaScript для чтения данных на веб-сайте моего банка… когда я вошел в систему. - person Quentin; 17.11.2012
comment
Поэтому единственный вариант, который у меня есть, — это внести изменения в свой веб-сервис, чтобы он поддерживал jsonp. Я прав? - person Abhishek J; 17.11.2012
comment
Другие варианты включают вышеупомянутый прокси и CORS. - person Quentin; 17.11.2012

Я не великий скриптер, но я использовал AJAX для своего проекта. Попробуйте это, это то, как это сработало для меня.

$.ajax({
    type: method,
    url: "url",
    dataType: "jsonp",
    success: function(data){
        console.log(data);
    }
});
person Anton Egorov    schedule 16.11.2012
comment
: Эй, я пробовал это, но у меня это не сработало. В любом случае, спасибо за вашу помощь. - person Abhishek J; 17.11.2012

Я получил это и работает следующим образом:

<script type="text/javascript">

  var jsonpCallback;

  function checkDocId() {
    // AJAX request
    $.ajaxSetup({ cache: false });

    jsonpCallback = function(data) {
      $("#result").html(data.html);
    };

    $.ajax({
      type: "GET",
      url: "/secudok/ws/rest/checkdocid/jsonp/" + encodeURIComponent($("#docId").val()),
      dataType: "jsonp",
      jsonpCallback: "jsonpCallback",
      crossDomain: true
    });
  }

</script>

Сервер возвращает данные, завернутые в функцию обратного вызова: function({JSON}).

jsonpCallback({"html":"<table>data</table>\n"})

В моем примере мы используем HTML, но также можем использовать JSON.

yourCallbackName({"a":"1"; "b":"2"})
person David    schedule 16.11.2012
comment
Uncaught SyntaxError: Unexpected token: это ошибка, которую я получаю, когда использую приведенный выше код. Я думаю, что jquery не может проанализировать ответ, так как он ожидает jsonp, но получает json и, следовательно, не может обрабатывать данные json. - person Abhishek J; 17.11.2012
comment
Я просто помещаю вывод в свой контейнер div $("#result").html(data.html). Что вы пытаетесь сделать с ответом? Тогда я могу проверить это. - person David; 17.11.2012

Вам нужно использовать свою консоль. Например. firebug, если вы используете firefox, или chrome's development console.

Там вы должны увидеть ошибки в вашем коде.

ajax()

функция в jquery принимает обратный вызов success: function(data){ // do something with the data }.

console.log(//some data) 

предназначен для регистрации различных данных в разных точках вашего скрипта.

So

$.ajax({
    type: method,
    url: "url",
    dataType: "jsonp",
    success: function(data){
    console.log(data);
}

});

Не такая уж плохая идея.

person tonino.j    schedule 16.11.2012
comment
Да, я видел консоль в Chrome. Отображаемая ошибка: Uncaught SyntaxError: Unexpected token: в консоли. Я думаю, что jquery не может разобрать ответ, так как он ожидает jsonp, но получает json и, следовательно, путается между 2. - person Abhishek J; 17.11.2012