Ошибка возврата запроса JSONP: «Uncaught SyntaxError: Неожиданный токен:» - PullRequest
25 голосов
/ 18 мая 2011

Поэтому я пытаюсь сделать запрос к API Stack Exchange со следующим кодом 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!

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

Ответы [ 2 ]

21 голосов
/ 18 мая 2011

Вы должны установить нестандартный параметр, чтобы заставить работать API SO.Вместо обычного 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.Если вы определяете глобально доступную функцию в своем скрипте и сообщаете удаленному серверу, как называется эта функция, сервер может передавать код, который упаковывает данные, которые будут отправлены при вызове этой функции.

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

4 голосов
/ 18 мая 2011

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

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

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

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

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