3

私は自分の問題に似た問題をたくさん見つけました。多分それは私ですが、なぜ私が複数のjsonリクエストを実行できないのか、またはなぜこれが機能しないのかについて、本当の明確な答えを見つけるのに苦労しています。

これが私のjQueryコードです:

$.getJSON('http://api.espn.com/v1/sports/basketball/nba/teams/16/news?apikey=0001234', function(data) {
    console.log(data.headlines);              
});

$.getJSON('http://api.espn.com/v1/sports/football/nfl/teams/16/news?apikey=0001234', function(data) {
    console.log(data.headlines);
});

そして、これがコンソールログで受け取ったエラーです。

XMLHttpRequest cannot load http://api.espn.com/v1/sports/football/nfl/teams/16/news?apikey=62t2h4tsdmhr2q7aynvjuv2s. Origin null is not allowed by Access-Control-Allow-Origin.

1つの$.getJSONリクエストを単独で実行すると、正常に機能します。ですから、複数のリクエストをしているからだと思います。競合しないように書く方法がわからないので、助けていただければ幸いです。ありがとう

編集

だから私はその時の質問を推測します..この方法で複数のリクエストを行うことは可能ですか?コードに問題がありますか?または、ESPNのAPIに問題がある可能性があります。yahoo apiを使用してみて、同じ結果が得られるかどうかを確認できます。

4

3 に答える 3

4

2つのjsonリクエストを次々に起動できますか?

はい。それらは互いに干渉しません。

ESPNは両方のリクエストのデータを返しますか?

現在いいえ。2番目のリクエストには403レスポンスが返されます。彼らはいつかそれを変えるかもしれません、誰が知っていますか...

なぜエラーが発生するのOrigin null is not allowed by Access-Control-Allow-Origin.ですか?

コメントで述べたように、スクリプトは。で始まるURLから実行されていましたfile://。この答えで述べたように

CORSヘッダーがクロスドメインXHRに問題がないことを通知する方法は2つあります。1つはAccess-Control-Allow-Originを送信することです:*($ .getを介してFlickrに到達している場合は、送信していたはずです)、もう1つはOriginヘッダーの内容をエコーバックすることです。ただし、file:// URLは、エコーバックを介して許可できないnullのOriginを生成します。

あるサーバーでファイルをホストすると、たとえlocalhost、そのエラーを受け取ることはありません。jsonp別の方法として、 ESPNがサポートしている場合は、リクエストを使用してみることができます。

このクエリを試してください、

$.getJSON('http://api.espn.com/v1/sports/football/nfl/teams/16/news?apikey=0001234&callback=?',     
function(data) {
    console.log(data.headlines);
});

&callback=?URLの最後にあることに注意してください...

于 2012-07-15T18:43:23.590 に答える
2

$.getJSON複数の呼び出しを発行することに概念的に問題はありません。ただし、Amith Georgeが元の質問へのコメントで言及しているように、許可されたレート制限を超えると、403の応答が返される場合があります。(Twitterはこの応答コードを使用します。ESPNが使用するかどうかはわかりません。)

私の場合、これらのJSON呼び出しがjsfiddle.netなどのドメインでホストされているHTMLファイルの一部である場合、2つのオブジェクトがコンソールに記録されます(http://jsfiddle.net/pGBmT/を参照)。これはjquery1.7.2を使用します。

HTMLファイルで古いバージョンのjquery(1.3)を試してみると、注意したエラーが発生します。

ただし、jquery 1.7.2を使用すると、ローカルでも正常に機能します(ただし、他の人が時折問題を報告しています)。これは私がローカルで試したファイルです:

<!doctype html>
<html>
  <head><meta charset="utf-8"><title>Test</title></head>
  <body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script>
      $.getJSON('http://api.espn.com/v1/sports/basketball/nba/teams/16/news?apikey=62t2h4tsdmhr2q7aynvjuv2s', function(data) {
        console.log(data.headlines);              
      });
      $.getJSON('http://api.espn.com/v1/sports/football/nfl/teams/16/news?apikey=62t2h4tsdmhr2q7aynvjuv2s', function(data) {
        console.log(data.headlines);
      });
    </script>
  </body>
</html>

リロードを連続して数回押すことができます。ほとんどの場合問題はありませんが、403が出ることがあります。多くの場合、2番目のオリジンエラーで1つの成功した応答を受け取ります。

私の最善の推測は、律速問題です。setTimeout3秒または4秒の遅延で呼び出しの1つを発信してみてください。私がこれを試したとき:

<!doctype html>
<html>
  <head><meta charset="utf-8"><title>Test</title></head>
  <body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script>
      $.getJSON('http://api.espn.com/v1/sports/basketball/nba/teams/16/news?apikey=62t2h4tsdmhr2q7aynvjuv2s', function(data) {
        console.log(data.headlines);              
      });
      setTimeout(function () {$.getJSON('http://api.espn.com/v1/sports/football/nfl/teams/16/news?apikey=62t2h4tsdmhr2q7aynvjuv2s', function(data) {
        console.log(data.headlines);
      })}, 4000);
    </script>

5回連続で問題なく動作しました!

于 2012-07-15T18:30:59.277 に答える
1

getJSON()1つのリクエストでもどのように機能するかを確認するのに苦労しています。デフォルトでは、クロスドメインブラウザリクエストを実行することは許可されていません。これは、エラーメッセージに示されている内容です。

クロスドメインリクエストを行うには、APIがサポートしている場合はJSON-Pを使用するか、Ajaxリクエストで呼び出すことができる独自のドメイン内にサーバー側プロキシを設定する必要があります。これによりクロスドメインを回避できます。ドメインリクエスト。

于 2012-07-15T18:13:01.700 に答える