10

statuscode 0 が表示されますが、これはコード 403 です。何が問題なのか教えてもらえますか?

Jクエリ

  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

4 に答える 4

19

報告されたエラー メッセージ (「要求されたユーザーのお気に入りは公開されていません。」) により、リソースにアクセスする権限がないため、サーバーはブラウザーに403 エラーを返します。

ただし、 jsFiddle の例では、サーバーはリクエストを取得しません。

クロスブラウザーの AJAX リクエストを行うことはできません。これは、同一オリジン ポリシーと呼ばれます。セキュリティ上の理由から、悪意のあるコーダーが知らないうちに不快なことをするのを防ぐためです。これは鈍いツールですが、効果的なツールです。

サーバーにリクエストを送信していない場合、ステータス コードはありません。これは、XMLHTTPRequest オブジェクト (およびその jqXHR ラッパー) によって として報告され0ます。

基本的に、ブラウザでやろうとしていることはできません。

ブラウザーがこのようなデータに非同期でアクセスする必要がある場合は、サーバーにラッパーを記述して、リモート サーバーから情報をフェッチし、それをブラウザーにフィードする必要があります。回避策があります (JSONP – JSON with Padding と呼ばれます)が、YouTube がそれをサポートしているとは思えません。


編集: gradbot's answerdataTypeごとに、コードをに変更することで JSONP リクエストを実行できますjsonp

ただし、現在は使用できませんxhr.status。これは、JSONP が XHR オブジェクトを使用しないため、確認できるステータスがないためです。

フィード gradbot を使用した実際の例を次に示します。jqXHR オブジェクトではなく、結果オブジェクトがハンドラーに渡されることに注意してください。

于 2011-04-16T20:21:49.373 に答える
2

設定する必要が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);
    })
});
于 2011-04-16T20:28:46.430 に答える
1

403 は、ビデオにアクセスしているユーザーの資格情報を提供する必要があるためです。正しい資格情報が提供されていると仮定すると、クロスドメインの制限により、要求は失敗します。

ほとんどの場合、ステータス コード0は、リクエストをサーバーに送信できなかったことを意味します。フィドルの例で Chrome コンソール ログに表示される内容を次に示します。

XMLHttpRequest はhttp://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=jsonを読み込めません。オリジンhttp://fiddle.jshell.netは Access-Control-Allow-Origin で許可されていません。

Youtube、実際にはすべての Google Data APIがJSONPをサポートしていますが、それを使用するには、altパラメーターに値を渡し、 asjson-in-scriptを指定する必要があります。jQuery はコールバック パラメータを提供します。経験的なテストに基づいて、YouTube はパラメータが具体的に であることを気にしていないようです。パラメータが指定されている限り、パラメータはvalue のみを取ることができます。dataTypejsonpaltjson-in-scriptcallbackaltjson

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
    }
});
于 2011-04-16T21:00:43.920 に答える
0

最近のほとんどのブラウザーではセキュリティ上の制限があるため、クロスドメイン リクエスト (GET や POST など) を実行することはできません。

それでも他のドメインからデータを取得したい場合は、サーバーにインストールしてすべてのリクエストを送信するリバース プロキシの使用を検討してください。ブラウザの場合、データは同じドメインから来ているように見えます。

最も一般的なものの 1 つは Apache の mod_reverse ですが、サーバー環境によっては他の代替手段があります。

もう 1 つの方法は、Google API がサポートしている場合は JSONP を使用することです。

于 2011-04-16T20:29:44.887 に答える