Ajax с JQuery: 200 хорошо, но не «успех» - PullRequest
18 голосов
/ 30 января 2011

Я пытаюсь использовать AJAX для отправки запроса в Google Книги и отображения результатов на моем веб-сайте. Я использую JQuery для отправки запроса и обработки ответа, например:

var query = [formatted input from a form];
var URL = "http://books.google.com/books/feeds/volumes?q="+query+"&start-index=1&max-results=5";

$.ajax({
    type: "GET",
    url: URL,
    dataType: "xml",
    success: function(data, status){
        alert(status);
    }
});

В настоящее время у меня просто есть скрипт, предупреждающий об «успехе», если получен ответ. Если я использую свой сценарий для отправки этого запроса на локальную страницу для тестирования, это прекрасно работает. Но когда я задаю URL-адрес Google, указанный выше, как указано на странице API разработчика, я никогда не вижу предупреждение. Согласно Firebug, я получаю ответ и статус 200 нормально, как я должен, но это не путь к этому «успеху». Кто-нибудь знает почему?

Редактировать: я должен добавить, что если я следую за URL-адресом напрямую, к http://books.google.com и т. Д. С некоторой случайной q, он отображает XML-канал без проблем, поэтому запрос не является проблемой.

Ответы [ 2 ]

14 голосов
/ 30 января 2011

Вы не можете делать междоменные запросы, используя XMLHttpRequest в стандартных настройках безопасности браузера. Одним из возможных решений является написание локальной прокси-функции (при условии, что вы можете создать серверный код), которая перенаправляет запрос на внешний сайт, а затем возвращает ответ.

Редактировать : Похоже, Google также предоставляет JavaScript API. Я предполагаю, что они созданы таким образом, чтобы избежать проблемы междоменного XHR.

http://code.google.com/apis/books/docs/js/devguide.html#execute

Редактировать : API JavaScript для книг устарел. Хотя он больше не является практически полезным, вы можете увидеть исходный текст документации, на который есть ссылки, из архива Wayback Machine: http://web.archive.org/web/20120414070427/http://code.google.com/apis/books/docs/js/devguide.html#execute

3 голосов
/ 30 января 2011

Это междоменная проблема с вызовами ajax, потому что браузеры имеют модель безопасности, основанную на политике домена.

Если вы не хотите включать весь API Google Книги, вы также можете использовать Google AjaxAPI с jsonp для междоменных вызовов ajax.

Документы здесь:

http://code.google.com/apis/books/docs/js/jsondevguide.html#basic_query

jQuery, пример

var query = 'jquery';
var URL = 'https://ajax.googleapis.com/ajax/services/search/books?v=1.0&q=' + query;

$.ajax({
    type: 'GET',
    url: URL,
    dataType: 'jsonp',
    success: function( data, status ){
        alert( data.responseData.results.length + ' results found!' );
    },
    error: function() {
        alert( 'Something goes wrong!' );
    }
});

Ciao!

...