Подтвердить что ты не робот

Запрос запроса JSONP, возвращающий ошибку: "Uncaught SyntaxError: Неожиданный токен:"

Итак, я пытаюсь сделать запрос к API-интерфейсу стека со следующим кодом jQuery:

$.ajax({                                                                                                                                                                                                        
    type: 'POST',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); }                                                                                                                                                              
});   

Но когда я открываю файл на своей машине, в FireFox или Chrome, и делаю запрос, я получаю эту ошибку:

Resource interpreted as Script but transferred with MIME type application/json.
Uncaught SyntaxError: Unexpected token :
Uh Oh!

Я не знаю, что происходит. Я знаю, что API-интерфейс Stack Exchange API Gzips отвечает на ваши вопросы, может ли это вызвать какие-либо проблемы?

4b9b3361

Ответ 1

Вы должны установить нетрадиционный параметр, чтобы заставить SO API работать. Вместо обычного callback вам необходимо передать параметр jsonp.

Кроме того, вы не можете сделать POST с помощью JSONP.

$.ajax({                                                                                                                                                                                                        
    type: 'GET',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); },
    jsonp: 'jsonp'                                                                                                                                                
});

Невозможно выполнить междоменную AJAX с помощью обычного XMLHTTPRequest. Это по соображениям безопасности (он вызывает политику одного и того же происхождения).

Существует обходное решение. Теги script не подпадают под это ограничение. Это означает, что вы можете вставить тег script в документ, который вызывает URL-адрес. Если вы определяете глобально доступную функцию в своем script и говорите удаленному серверу о том, что эта функция вызывается, сервер может передать код, который обертывает данные, которые будут отправлены при вызове этой функции.

Трудность, с которой вы столкнулись, связана с API StackOverflow. Обычно вы должны использовать аргумент callback в своем запросе, чтобы сообщить серверу, что вы вызываете. Однако API-интерфейс StackOverflow попросит вас использовать параметр jsonp.

Ответ 2

Попробуйте этот URL: http://api.stackoverflow.com/1.1/stats?jsonp=callme

"callme" - это имя вашей функции обратного вызова - в вашем GLOBAL NAMESPACE (объект окна).

Кстати, если вы используете Firefox и имеете надстройку JSONView, вы можете напрямую протестировать вышеуказанный URL (и ваш для сравнения).

Результат вызова URL:

callme({
  "statistics": [
...
  ]
})