jqXHR - http-status-code-403 (но код статуса 0) - PullRequest
10 голосов
/ 14 апреля 2011

я получаю код состояния 0 ... но это код 403. Может кто-нибудь сказать мне, в чем проблема?

JQUERY

  var jqxhr = $.ajax({
        url: 'http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json',
        dataType: 'json'
    }).success(function(xhr) {
        alert(xhr.status);
    }).error(function(xhr) {
        alert(xhr.status);
        return false;
    })

ДЕМО -> http://jsfiddle.net/QFuBr/

Заранее спасибо!Питер

Ответы [ 4 ]

19 голосов
/ 17 апреля 2011

Сервер выдает ошибку 403 браузеру , поскольку у вас нет разрешения на доступ к ресурсу из-за сообщения об ошибке («Избранное запрошенного пользователя не является общедоступным»).

Однако сервер даже не получает запрос в примере jsFiddle.

Вам не разрешено делать кросс-браузерные запросы AJAX.Это называется политика того же происхождения .Это делается из соображений безопасности, чтобы злоумышленники не могли делать неприятные вещи без вашего ведома.Это тупой инструмент, но эффективный.

Когда вы даже не отправляете запрос на сервер, код состояния отсутствует.Об этом сообщает объект XMLHTTPRequest (и его оболочка jqXHR) как 0.

По сути, вы не можете делать то, что пытаетесь сделать в браузере.

Если вывам нужен браузер для асинхронного доступа к таким данным, вам нужно написать оболочку на вашем сервере, чтобы получать информацию с удаленного сервера и передавать ее в браузер.Существует обходной путь (он называется JSONP - JSON with Padding) , но я не верю, что YouTube его поддерживает.


Редактировать: Per ответ gradbot ,можно выполнить запрос JSONP, изменив свой код на dataType на jsonp.

Однако теперь вы не сможете использовать xhr.status.Это связано с тем, что JSONP не использует объект XHR, поэтому нет статуса, доступного для проверки.

Вот рабочий пример с использованием предложенного gradbot фида .Обратите внимание, что объект результата передается обработчику, а не объекту jqXHR.

2 голосов
/ 17 апреля 2011

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

Если у вас нет действительного cookie для учетной записи, к которой вы пытаетесь получить доступ, то вызов API вернет 403 ссодержание "Favorites of requested user are not public."

$(function() {
    var jqxhr = $.ajax({
        url: 'http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json',
        dataType: 'jsonp'
    }).success(function(data, status) {
        alert(status);
    }).error(function(xhr) {
        alert(xhr.status);
    })
});
1 голос
/ 17 апреля 2011

403 - потому что вам нужно предоставить учетные данные для пользователя, чьи видео доступны. При условии предоставления правильных учетных данных, запрос все равно не будет выполнен из-за междоменных ограничений.

В большинстве случаев код состояния 0 подразумевает, что запрос не может быть отправлен на сервер. Вот то, что показывают журналы консоли Chrome для вашего примера скрипки.

XMLHttpRequest не может загрузить http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json. Источник http://fiddle.jshell.net не разрешен Access-Control-Allow-Origin.

Youtube, фактически все API данных Google поддерживают JSONP , но для его использования необходимо передать параметр alt со значением json-in-script и указать dataType как jsonp. jQuery предоставит вам параметр обратного вызова. Основываясь на эмпирическом тестировании, кажется, что Youtube не заботится о том, чтобы параметр alt был конкретно json-in-script. Пока указан параметр callback, параметр alt может принимать только значение json.

http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json&callback=foo

Вот рабочий пример для общедоступного канала.

$.ajax({
    url: 'http://gdata.youtube.com/feeds/mobile/videos?alt=json-in-script',
    dataType: 'jsonp',
    success: function(data) {
        // do something with data
    }
});
0 голосов
/ 17 апреля 2011

Вы не можете выполнять междоменные запросы (будь то GET или POST) из-за ограничений безопасности в большинстве современных браузеров.

Если вы все еще хотите получать данные из другого домена, рассмотрите возможность использования обратного прокси-сервера, который вы устанавливаете на своем сервере и отправляете все запросы. Для браузера это будет выглядеть так, как будто данные поступают из одного домена.

Один из самых популярных - это mod_reverse в Apache, но есть и другие альтернативы, в зависимости от того, какая у вас серверная среда.

Другой альтернативой является пользователь JSONP, если Google API поддерживает его.

...