2014-01-16 2 views
7

Я пытаюсь получить некоторую информацию из другого домена, домен разрешает только вызов jsonp - другие получают отклонение. Как получить контент вместо выполнения? Потому что я получаю сообщение об ошибке. Мне не нужно его выполнять, мне просто нужно это в моем сценарии. В любом формате (ответ json, но js его не понимает). Я не могу повлиять на этот домен, поэтому с этой стороны невозможно что-то изменить. Вот мой код:Ошибка ответа JQuery jsonp - Обратный звонок не был вызван

$.ajax({ 
    url: url + '?callback=?', 
    crossDomain: true, 
    type: "POST", 
    data: {key: key}, 
    contentType: "application/json; charset=utf-8;", 
    async: false, 
    dataType: 'jsonp', 
    jsonp: 'callback', 
    jsonpCallback: 'jsonpCallback', 
    error: function(xhr, status, error) { 
     console.log(status + '; ' + error); 
    } 
}); 

window.jsonpCallback = function(response) { 
    console.log('callback success'); 
}; 
+1

что такое ответ с сервера –

ответ

1

Параметр jsonpCallback используется для указания имени функции в ответ JSONP, а не имя функции в вашем коде. Вероятно, вы можете удалить это; jQuery будет обрабатывать это автоматически от вашего имени.

Вместо этого вы ищете параметр success (для получения данных ответа). Например:

$.ajax({ 
    url: url, 
    crossDomain: true, 
    type: "POST", 
    data: {key: key}, 
    contentType: "application/json; charset=utf-8;", 
    async: false, 
    dataType: 'jsonp', 
    success: function(data){ 
     console.log('callback success'); 
     console.log(data); 
    } 
    error: function(xhr, status, error) { 
     console.log(status + '; ' + error); 
    } 
}); 

Вы можете также, вероятно, удалить другие JSONP-параметры, Сопутствующие которые были установлены на Jquery по умолчанию. См. jQuery.ajax для получения дополнительной информации.

+1

Здесь еще есть проблемы. JSONP не может быть POST. «ContentType» предназначен для * запроса *, а не для ответа (удалить его). 'async: false', как правило, плохая идея, и не работает с JSONP. –

9

Есть несколько проблем с вашим звонком $.ajax.

$.ajax({ 
    url: url + '?callback=?', 
    // this is not needed for JSONP. What this does, is force a local 
    // AJAX call to accessed as if it were cross domain 
    crossDomain: true, 
    // JSONP can only be GET 
    type: "POST", 
    data: {key: key}, 
    // contentType is for the request body, it is incorrect here 
    contentType: "application/json; charset=utf-8;", 
    // This does not work with JSONP, nor should you be using it anyway. 
    // It will lock up the browser 
    async: false, 
    dataType: 'jsonp', 
    // This changes the parameter that jQuery will add to the URL 
    jsonp: 'callback', 
    // This overrides the callback value that jQuery will add to the URL 
    // useful to help with caching 
    // or if the URL has a hard-coded callback (you need to set jsonp: false) 
    jsonpCallback: 'jsonpCallback', 
    error: function(xhr, status, error) { 
     console.log(status + '; ' + error); 
    } 
}); 

Вы должны называть свой адрес, как это:

$.ajax({ 
    url: url, 
    data: {key: key}, 
    dataType: 'jsonp', 
    success: function(response) { 
     console.log('callback success'); 
    }, 
    error: function(xhr, status, error) { 
     console.log(status + '; ' + error); 
    } 
}); 

JSONP является не JSON. JSONP на самом деле просто добавляет тег скрипта к вашему <head>. Ответ должен быть файлом JavaScript, содержащим вызов функции с данными JSON в качестве параметра.

JSONP - это то, что серверу необходимо поддерживать. Если сервер не отвечает правильно, вы не можете использовать JSONP.

Пожалуйста, прочитайте документацию: http://api.jquery.com/jquery.ajax/

+0

Спасибо большое, что помогает! – zaw

2
var url = "https://status.github.com/api/status.json?callback=apiStatus"; 
$.ajax({ 
    url: url, 
    dataType: 'jsonp', 
    jsonpCallback: 'apiStatus', 
    success: function (response) { 
     console.log('callback success: ', response); 
    }, 
    error: function (xhr, status, error) { 
     console.log(status + '; ' + error); 
    } 
}); 

Попробуйте этот код.

Также попробуйте называть это url непосредственно в браузере ур и посмотреть, что именно он возвращает, таким образом, вы можете лучше понять, что на самом деле происходит :).

+1

Этот ответ решает его проблему, но делает решение проблемы очень абстрактным и не помогает другим применять это к их ситуациям. – MarAvFe

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